Сообщение от
None
Ботнет (англ. botnet от robot и network) — это компьютерная сеть, состоящая из некоторого количества хостов, с запущенными ботами — автономным программным обеспечением. Чаще всего бот в составе ботнета является программой, скрытно устанавливаемой на компьютере жертвы и позволяющей злоумышленнику выполнять некие действия с использованием ресурсов заражённого компьютера.
Такое определение ботнета дает википедия.
В своей статье я покажу, как можно использовать браузер посетителя сайта в качестве бота.
Конечно, это далеко не полноценный ботнет, но свою задачу выполняет - скрыто рассылает письма с компьютеров пользователей.
В качестве примера будет рассматриваться почтовый сервис
mail.ru.
Начнем с того, что должен уметь наш "ботнет":
1. Проверять, авторизован ли пользователь на сайте почтового сервиса.
2. Если пользователь не авторизован, брать из базы аккаунт и заходить на сайт.
2.1. Проверять успешность авторизации.
3. Отправлять письмо, не оставляя следов (исходящих писем в ящике)
1. Проверка авторизации на сайте.
Чем отличается авторизованный пользователь сайта от неавторизованного?
а) куки
б) различное отображение страниц либо запрет на доступ к некоторым страницам
Куки можно проверить при наличии
XSS на сайте. Но найти на крупном почтовом сервисе
XSS достаточно сложно, так что этот вариант пропускаем.
Получить страницу сайта и узнать о ней хоть какую-нибудь информацию без
XSS тоже не получится.
Единственный способ - события
onload и
onerror тэга
img. Если файл, указанный в
src является картинкой, вызывается обработчик
onload, иначе
onerror.
Остается найти на сайте картинку, доступ к которой разрешен только авторизованным пользователям.
Такие картинки существуют, например на
gmail'е авторизацию можно было проверить с помощью
http://mail.google.com/mail/pimages/2/labs/labs_bar_icon.png (пофиксили около месяца назад)
Поиски подобных багов на мэйлру ни к чему не привели. Изображения там хранятся на отдельных поддоменах и доступны всем, независимо от авторизации.
Проверив различные запросы в соц.сети МойМир я обнаружил, что в некоторых из них передается параметр
"back=http://my.mail.ru/*******", который указывает адрес возврата при успешном выполнении запроса (только домены мэйлру).
В большинстве таких запросов есть защита от CSRF в виде рандомных параметров
"mna" и
"mnb", но при редактировании анкеты эти параметры не передаются.
Пример
POST-запроса на сохранение вкладки "интересы":
http://my.mail.ru/[Домен]/[Логин]/editinfo
page=&Figure=0&Height=0&Weight=0&Eyes=0&Hair=0&Chi lds=0&Residence=0&Routine=0&Smoke=0&Alcohol=0&Lang uages=-1&ReligionCustom=&Politics=&Interests=&Music=&Cine ma=&TV=&Books=&Persons=&back=http://my.mail.ru/my/editinfo&Save=1
Запрос успешно работает через
GET (как и большинство запросов
mail.ru). Кроме того, единственными неодходимыми параметрами для успешного выполнения запроса являются
"Save" и
"back".
Но еще более интересно то, что
[Домен] и
[Логин] в адресе скрипта не имеют никакого значения.
Теперь находим любую картинку, например
http://img.mail.ru/r/dumb.gif (1x1 px), и подставляем в параметр
"back".
Получилась рабочая ссылка для проверки авторизации в соц.сети МойМир -
http://my.mail.ru/bk/x/editinfo?Save=1&back=http://img.mail.ru/r/dumb.gif
Код проверки:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
К сожалению, эта проверка не срабатывала, если на мыле не был создан моймир. Еще немного поискав, нашел ссылку, подходящую для любых ящиков мэйлру:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
[offtop]аналогичная ссылка для проверки авторизации ВК -
http://vkontakte.ru/login.php?to=ZmF2aWNvbi5pY28 (favicon.ico в base64)
[/offtop]
2. Авторизация
http://e.mail.ru/cgi-bin/auth
Login - логин
Domain - mail.ru|inbox.ru|list.ru|bk.ru
Password - пароль
page - страница, на которую редиректит в случае успешной авторизации
login_from - поддомен, с которого авторизуется пользователь
post - если неавторизованный пользователь пытается отправить
POST-запрос, его перекидывает на страницу авторизации, а параметры запроса сохраняются в базе под уникальным идентификатором. В этом параметре передается идентификатор и если он есть в базе, то после авторизации выполняется соответствующий
POST-запрос.
level=1 - чужой компьютер
Параметры
"login_from" и
"post" необязательные.
"Domain" тоже можно убрать, если в
"Login" передавать логин@домен
"level" и
"page" тоже являются необязательными, но они нам пригодятся.
level=1 - чтобы юзер не заметил, что с его компа рассылались письма
page=http://img.mail.ru/r/dumb.gif - чтобы проверить успешность авторизации с помощью тэга
img. Даже если все аккаунты будут валидными, эта проверка необходима, так как мэйлру может заблокировать
IP-адрес и авторизоваться с него будет невозможно.
Изучая авторизацию через различные поддомены мэйлру, на
m.mail.ru находим еще один интересный параметр -
"FailPage". Это адрес возврата, в случае неудачной авторизации.
Обычная страница ошибки авторизации весит достаточно много, поэтому надо заменить ее на что-нибудь поменьше, например на
http://img.mail.ru/ (403 Forbidden).
2.1. Варианты кода авторизации с проверкой
На поддомене
m.mail.ru в параметрах
"page" и
"FailPage" можно использовать относительные пути, что сокращает длину ссылки. Но в случае успешной авторизации происходит дополнительный запрос:
http://m.mail.ru/cgi-bin/checkcookie?id=[Хэш длиной более 100 симоволов]&user=[Логин]&domain=[Домен]&page=[Страница возврата]
поэтому объем трафа больше, чем на
e.mail.ru
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
2-2.5кб при успешной авторизации. 1.5-2кб при ошибке
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
4кб (+2кб картинка) при успешной авторизации. 2кб при ошибке
3. Отправка письма
Пример запроса отправки через
e.mail.ru показывал
XAMEHA в соседней теме -
/showpost.php?p=2705452&postcount=4
Минимально необходимые параметры для отправки:
http://e.mail.ru/cgi-bin/sentmsg
ajax_call=1 - обязательный параметр
func_name=send - обязательный параметр
send= - обязательный параметр
HTMLMessage=1 - для использования HTML-разметки в теле письма
To - кому
Subject - тема письма
Body - содержание письма
Отправка письма через
m.mail.ru отличается отсутствием обязательных параметров
"ajax_call" и
"func_name".
При использовании
e.mail.ru результат возвращается в
JSON-формате. На
m.mail.ru происходит редирект на страницу вида
http://m.mail.ru/cgi-bin/sendmsgok?ab01=ab01&mode=newmsg&id_sent=0123456789 0123456789&To=01234567890abcdef01234567890abcdef&S ubject=0123456&From=01234567890abcdef01234567890ab cdef01234567890abcdef01234567890ab&user=0123456789 0abcdef01234567890abcdef
Объем трафа при отправке через
m.mail.ru примерно в 2 раза больше, чем
e.mail.ru (около 12кб и 6кб соответственно).
[offtop]На данный момент отправка писем методом
GET через
m.mail.ru и
e.mail.ru невозможна.
[/offtop]
Для реализации "ботнета" всего вышеописанного уже было достаточно, но недавно
A-Graff рассказал мне еще о двух различных веб-интерфесах мэйлру -
pro.mail.ru и
wap.mts.mail.ru
Отправка письма на
pro.mail.ru так же уязвима к
CSRF и работает через
GET-запрос. Кроме того, при удалении из запроса некоторых параметров, отправленные письма перестают сохраняться в папке "исходящие".
Использование метода
GET для отправки позволит контролировать запрос событием
onerror и после его завершения брать новые аккаунты, мыла и тексты из базы для продолжения рассылки.
http://pro.mail.ru/cgi-bin/ajax_sendmsg?ajax_call=1&func_name=ajax_send_msg
data=[{"To":"[Кому]","Subject":"[Тема]","Body":"[Содержание]","HTMLMessage":1,"send":1}]
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
[offtop]
На поддомене
pro.mail.ru в запросе отправки можно увидеть параметр
"From", в котором указывается имя отправителя.
Это имя можно заменить на любое другое и оно будет отображаться у получателя в списке писем. Но при открытии письма виден адрес, с которого оно отправлено.
Отправка в параметре
"From" измененного адреса отправителя (например
"Команда Mail.Ru ") не дает результата, получатель все равно видит реальный адрес (
"Команда Mail.Ru ").
Но если
"From" добавлять в заголовок при отправке писем с
wap.mts.mail.ru (а также еще с нескольких других поддоменов), адрес отправителя можно заменить на любой, даже
"Команда Mail.Ru "
[/offtop]