MAIL.RU взломан!

NSD (www.nsd.ru)

Xakep, номер #068, стр. 068-056-1

Баги популярного почтового сервера

На сегодняшний день Mail.ru - самая популярная российская почтовая система, и, наверняка, половина твоих знакомых держат именно там свои почтовые ящики. Этот сервис уже много лет юзают аж несколько миллионов наших соотечественников, и хотя бы по этой причине админы Мыл.Ру просто обязаны приложить все возможные усилия для предотвращения взлома мыльников хакерами. Из чистого любопытства мы решили проверить, как последние отрабатывают свой хлеб. И что же выяснилось? После пары хитрых манипуляций любой желающий может почитать почту своей подружки :).

Интродакшн

Penetration-test решено было устроить всем серверам, относящимся к почтовику mail.ru: tv.mail.ru, love.mail.ru, news.mail.ru и т.д. Зачем? Например, если я получу доступ к одной из тачек в ломаемой сети, можно будет установить на ней снифер и попробовать выловить пароль админа к почтовому серверу. Да мало ли что! ;) Имея доступ к доверенному серверу, становится возможным взломать даже самый неприступный сервант! Однако не стоит забывать, что главной моей целью был именно сервер авторизации Маил.Ру - win.mail.ru. Ломать такой популярный сервис при помощи чужих эксплойтов - дохлое дело, кроме того, это неинтересно. Мне захотелось самостоятельно найти какие-нибудь дырки в движке сайта. И что ты думаешь? Не прошло и десяти минут, как меня посетила удача: я нашел классическую ошибку с романтическим названием «Ядовитый ноль» в скрипте, работающем на сервере tv.mail.ru.

Танкистам посвящается

Дыра «Ядовитый ноль» известна хакерам еще со времен дедушки Ленина, и мы не раз писали про нее. Напомню о ней вкратце. Иногда web-дизайнеры при разработке сайтов делают следующую вещь. Они рисуют шаблон, содержащий колонтитулы страниц сайта, а основной текст, который должен быть отображен на страницах, распихивают по отдельным файлам (допустим, они имеют имена file1.db, file2.db и т.д.). После этого они вставляют в середину страницы перловый скрипт примерно такого содержания:

$file="$page.db";

open(FILE, ">$file");

$text=>FILE<;

close(FILE);

print "$text";

Если запустить скрипт с параметрами index.cgi?page=file1, он прочитает файл file1.db (если таковой имеется) и вставит его содержимое в середину веб-страницы. На первый взгляд, ничего необычного. Но интересное начнется, если передать скрипту что-нибудь типа page=index.cgi%00. Он откроет для чтения и выведет уже не index.cgi.db, а сам исходник index.cgi! Из-за чего это происходит, куда девается приписанное расширение .db? Как же %00 мог повлиять на работу скрипта? Символ в Perl не является признаком конца строки, но библиотеки, которые юзает Перл, написаны на С. А вот как раз в этом чудесном языке символизирует своим присутствием, что строка закончилась. Сам понимаешь, если сайт использует такой движок, становится возможным читать любые доступные файлы на сервере.

В брюхе телепузиков

При правильном значении переменной id скрипт tv.mail.ru/info.html (который, кстати, написан на Perl, хоть и имеет расширение .html) показывает подробное описание выбранной телепередачи. Как раз этот сценарий и содержит ошибку «Poisoned null byte». Баг заключается в следующем. Если присвоить переменной id хитрозадое значение, вместо описания телепрограммы ты увидишь содержимое произвольного файла. Например, URL http://tv.mail.ru/info.html?id=http://../../../../etc/passwd%00 обличит контент файла /etc/passwd (см. скриншот). Содержимое конкретно этого файла хакеров, правда, не интересует, так как в нем нет почти ничего полезного. Интерес представляют админские бэкапы и прочие файлы, которые могут содержать какие-нибудь лакомые пароли или хотя бы их хэши. Поскольку права на сервере выставлены криво (все директории +x для web-юзера), листинг файлов, лежащих в папках, можно получить аналогичным способом. Например, строка http://tv.mail.ru/info.html?id=http://../../../../etc%00, набранная в браузере, покажет содержимое каталога /etc.

Содержание  Вперед на стр. 068-056-2
ttfb: 25.719881057739 ms