"Мне не нужен флюгер, чтобы знать куда дует ветер. 
Поспеши, ведь мы, на самом деле, уже опаздываем..."

 

Тема, данной статьи - изучение работы червей, использующих для перемещения уязвимости web-интерфейсов в почтовых сервисах. Но именно изучение, поскольку использование данного материала, выходит за пределы
дозволенного законодательством...

Написание червей достаточно интересное занятие, поскольку для их функционирования постоянно приходится находить новые решения,
порой даже далекие от стандартов. Для написания
червей, использующих web-интерфейс, положение еще более усугубляется рядом факторов, но о них мы поговорим немного позже, а пока остановимся на выборе платформы для его функционирования. В данном случае, мой выбор пал на www.mail.ru. Он далеко не случаен, именно с этого почтового сервиса начиналась моя "исследовательская работа". 

Внедрение

Первое, чего необходимо добиться, это использование JavaScript, поскольку Mail.Ru фиксирует и, соответственно, фильтрует все попытки его внедрения в письмо. В ходе экспериментов было установлено, что одна из конструкций,
все таки остается незамеченной и благополучно позволяет внедрить произвольный скрипт. Найденная ошибка связана с обработкой событий для HTML тэгов. В стандартном случае, сервер успешно блокирует их исполнение. Например:

<IMAGE src="https://xakep.ru/wp-content/uploads/post/19041/c:\noImage" onError="alert('Java execution!')">

успешно опознается и блокируется. Для опознания в данном случае был использован шаблон " onError=". Но создатели, видимо, не учли тот факт, что вполне приемлемой является, также и конструкция:

<IMAGE src="https://xakep.ru/wp-content/uploads/post/19041/c:\noImage"/onError="alert('Java execution!')">

В результате работы которой на мониторе появится сообщение "Java execution!". Этого вполне достаточно для написания
червя, но не нам 🙂 Посудите сами, код червя получится достаточно большей и поэтому его неудобно содержать в обработчике onError, в
добавок код будет отфильтрован, что может пагубно повлиять на его работоспособность. Есть несколько выходов:

  • загружать JS с удаленного сервера
  • перенаправлять пользователя на удаленный сервер
  • шифровать JS

Первый и второй варианты - неприемлемы, поскольку
червь должен быть независимым от внешних Интернет ресурсов. В нагрузку, перекинув пользователя на другой сервер, мы выходим из доменной зоны почтового сервера. Остается только шифрование, как наиболее рациональное решение. Поскольку способов зашифровать произвольный скрипт достаточно много, то выбирать естественно вам. Но я для этих целей воспользовался Windows Script Encoder. О его работе я
когда-то писал статью на websec.ru. Но, тем не менее, попробую
вкратце объяснить как он работает. Запускаете "screnc.exe шифрумый_файл зашифрованный_файл". Таким образом строка:

alert('Java execution!')

примет вид:

#@~^GQAAAA==C^+.D`E9l7l,n6m;YbWUZE#iiQgAAA==^#~@ 

Преимущество данного (зашифрованного) формата в том, что он не содержит запрещенных символов. Для его использования нет нужды в дешифраторе, поскольку он встроен в Internet Explorer. А исполнить его можно указав соответствующий язык
программирования в тэге <script>:

<SCRIPT language="JavaScript.Encode">
#@~^GQAAAA==C^+.D`E9l7l,n6m;YbWUZE#iiQgAAA==^#~@ 
</SCRIPT>

Для проделки всего вышеописанного на Mail.Ru, загрузим зашифрованный скрипт как main.gif, а в приаттаченый HTML файл внедрим скрипт исполняющий его:

<html>
<image src="c:\noImage"/onError="document.all.tags('sc' +'ript')[0].language='JS'+
'cript.Encode';document.all.tags('sc'+ 'ript')[0].src= 'http://win.mail.ru/cgi-bin/readmsg/main.gif?id='
+document.forms[0].id.value+ ';0;1&mode=attachment'">

На данном этапе, следует с кое-чем разобраться.
Объект "document.all.tags('sc'+'ript')[0].language" указывает на язык первого
использованного скрипта в HTML файле, указав в качестве значения
"'JS'+'cript.Encode" мы сообщаем, что загруженный в этот тэг скрипт будет зашифрован. Далее мы указываем URL для используемого скрипта, в данном случае мы ссылаемся на первый аттач к нашему письму. Чтобы вы не думали, что все делается
через задницу: такие конструкции - единственный способ
добраться к присоединенному файлу (поскольку все работает на идентификаторах), а шифрование поможет нам спрятать тело
червя и в будущем доставит трудности при попытке расшифровки его исходного кода работниками Mail.Ru.

Новые решения

Для рассылки червя на все адреса из папки Inbox (вообще-то только те, что принадлежат компании Mail.Ru. В часности @mail.ru, @inbox.ru, и т.д.), необходимо знать их! Это составляет трудности, поскольку все действия, как уже говорилось, осуществляются с ID писем... Поэтому приходится загружать в отдельный фрейм каждое письмо, а уж потом из них выдирать e-mail отправителя. Согласитесь, такой подход достаточно медленно работает. Поэтому, для ускорения процесса, мной была разработана технология "частичной загрузки". Ее суть заключается в том, чтобы не загружать весь документ целиком, а только до нужной нам позиции. Достичь данного результата не составляет особых затруднений, если немного пошевелить мозгами. 

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

ErrorStatus=0; //no errors
.....................

function ErrorHook()
{
ErrorStatus=1;
window.setInterval('checkInbox()',100);
return true;
}

function checkLoadStatus()
{
ErrorStatus=0;
window.onerror=ErrorHook;
}

function checkInbox()
{
сheckLoadStatus();
.......................... //обращение к элементу
if(!ErrorStatus)
{
//NO ERRORS
}
else
{
//ERRORS
}
}

Это часть скрипта-червя, которая и реализует "частичную загрузку". Все происходит в несколько шагов:

  1. Устанавливаем свой обработчик ошибок.
  2. Новый обработчик изменяет состояние флага ErrorStatus.
  3. При попытке чтения элемента:
    а) элемент не найден (следовательно: изменяется флаг, документ не догружен до требуемого уровня)
    возврат в пункту 1
    б) элемент найден (следовательно: флаг остается неизменным, требуемый уровень достигнут)
    чтение требуемых данных
    останавливаем загрузку в фрейм (указываем адрес
    about:blank)

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

В данном варианте червь ничего не делает, кроме
размножения. За это следует поблагодарить Mister Dragon, который своей статьей
на SecurityLab обрек на погибель предыдущую
версию MAIL.RU.WORM. Старая версия воровала секретные вопросы и ответы на них, мдааа...
А он перекрыл ей воздух... Спасибо 🙁

(продолжение следует)

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии