Реверс-инжиниринг вредоносного мошеннического скрипта

- КиТ :: Будь в СЕТИ!

Несколько дней назад я бродил по сети и зашёл на сайт с вредоносной рекламой. Хотя такие рекламные баннеры не редкость, но этому удалось проникнуть через защиту AdBlocker и немедленно перенаправить меня на сайт, который выглядел .


В динамиках громко протрубило, и механический голос известил, что мой компьютер был инфицирован и я потеряю все свои данные, если не позвоню в техподдержку Microsoft. Модальная форма не давала мне уйти с сайта, адресная панель начала разрастаться, и в конце концов браузер завис. Впечатляющее представление!


Конечно, компьютер не был ничем инфицирован. RDN/YahLover.worm, на который вела ссылка с сайта, оказался фикцией, частью инструментария онлайн-мошенников, пытающихся убедить своих жертв в том, что компьютеры инфицированы вирусом и могут быть очищены только в ходе звонка на бесплатную горячую линию. «Сертифицированный Microsoft» специалист по телефону за плату «починит» заражённый компьютер и/или уговорит пользователя установить реальный зловред. На есть хорошая подборка таких мошеннических схем, встречающихся в сети.


Поскольку я несколько разбираюсь в компьютерах, то даже не пытался позвонить по горячей линии. Даже если бы я и захотел, то это было бы затруднительно: мошенник забыл указать телефонный номер. Но я всё же ощущал беспокойство: браузер полностью завис, и не исключено, что на сайте был эксплойт для Chrome, через который в мою систему подсадили зловред. Чтобы успокоить себя (и удовлетворить любопытство), я решил изучить внутреннюю схему работы мошеннического сайта.


Определение происхождения сайта

В данном случае мошенник не парился с регистрацией доменного имени, он перенаправлял своих жертв прямо на IPv4-адрес. К моему удивлению, поиск по географической привязке адреса показал, что сервер находится в США, а не в стране с более свободным интернет-законодательством:



Сайт хостился у DigitalOcean, популярного облачного провайдера. Похоже, даже мошенники покорены мощью Облака! К счастью, у DigitalOcean есть электронный адрес для жалоб, и я связался с ними по поводу этого сайта. На момент написания статьи мне ещё не ответили, но они наверняка примут меры.


Анализ сайта

Уведомив DigitalOcean, я занялся самим сайтом. Мне хотелось убедиться, что мой компьютер не скомпрометирован, к тому же меня терзало любопытство, как же устроен мошеннический сайт.


Сначала я скачал его копию, чтобы исследовать ее в спокойной обстановке. Поскольку у браузеров есть противная привычка отрисовывать и исполнять все сайты, которые они получают, то для скачивания копии пришлось переключиться в . Удивительно, но это не сработало: прямой вызов повисал в пустоте. После нескольких попыток я понял, что проблема заключалась в user agent: короткой порции данных, отправляемых серверу HTTP-клиентом, в которых говорится, какое ПО с ним общается. По умолчанию показывает себя серверу как . А что если притвориться Chrome? позволяет редактировать user agent, попробуем такой вариант:


Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36


И сервер прислал в ответ нужные данные. Не уверен, что это было: следствие неудачного анализа или стандартная мера защиты от роботов, но в любом случае любопытно.


У сайта оказалась на удивление простая структура:



— это логотип Microsoft, он придаёт сайту убедительности. используется в фоновом сообщении в качестве иконки закрытия. И, как следует из названия, на самом деле не работает:



— аудиофайл, созданный речевым генератором. Он предупреждает об ужасных последствиях ухода с сайта и отказа от звонка в мошенническую службу поддержки. Сначала я предположил, что на сайте использовалась неизвестная браузерная функция генерирования речи, но оказалось, что это простой mp3, заключённый в аудиотег HTML5. Можете .


Ковыряемся в исходном коде

Файл начинается так:



Тут есть несколько интересных моментов. Большая часть кода открыта и хорошо отформатирована. Автор даже оставил полезный комментарий, что код протестирован на Chrome и Firefox. Также автор не хочет, чтобы сайт индексировался поисковиками. Настолько, что дважды добавил метатег . Наконец, включение jQuery свидетельствует о том, что автор — опытный веб-разработчик, особенно с учётом того, что ни один JS-скрипт на сайте не использует jQuery. Здесь упоминается версия полуторалетней давности.


Далее идёт около 130 строк стандартного HTML и инлайненного CSS, чтобы получилось синее фоновое сообщение с фальшивым окном. Всё самое интересное находится в конце файла. Сначала — отслеживающий скрипт Google Analytics:



Это лишь предположение, но думаю, что именно так мошенник измеряет количество трафика, пришедшего на сайт, и, возможно, даже конверсию посетителей в телефонные звонки.


Наиболее интересный JS лежит в самом подвале сайта. Он намеренно запутан и, судя по всему, отвечает за поведение сайта. Взгляните:



Расшифровка скрипта

Разделим его на части. Первая часть — открытый текст, выводящийся во всплывающем диалоговом окне. Вероятно, при желании сообщение легко отредактировать (например, добавив номер телефона).


Затем идёт текст сообщения в виде строкового массива. Разобьём на строки и посмотрим, с чем имеем дело:



Это точно строковые значения, но на первый взгляд текст выглядит белибердой. Дело в том, что каждый символ зашифрован с помощью управляющей последовательностью Unicode. JS-интерпретатор радостно их отпарсит и снова превратит в символы, но для людей это не такая простая задача. Немного кода на Python, и можно расшифровать эти строки:



Это имена JS-функций, а также имя фиктивного зловреда. Должен сказать, что скрипт использует очень хитрые имена переменных вроде , что затрудняет анализ. Такой формат выбран нарочно, чтобы имена выглядели как шестнадцатеричные константы, но это лишь идентификаторы: знак _ в начале говорит о том, что они парсятся JS-интерпретатором. Далее я переименую эти идентификаторы в более читабельные на основе примерных предположений об их назначении.


За массивом строковых значений идёт немедленно вызываемая анонимная функция:



Я снова отформатировал скрипт, чтобы сделать его читабельным.


Как видите, здесь снова используется сокрытие имён переменных. Здесь много выражений вроде (после преобразования: ). На самом деле это вызовы методов. Особенность JS заключается в том, что его объекты во многом схожи со словарями, и вызов вида полностью аналогичен . Хотя первая версия корректна, вы редко встретите такое в обычном JS-коде, так что она работает как дополнительный уровень обфускации.


После переименования переменных, расшифровки строковых значений и преобразования вызовов методов получилась более читабельная версия кода:



Главная цель этой функции — перемешать список вышеприведённых строковых значений. Во внутреннем цикле несколько раз вызывается . В JS убирает передний элемент списка, а добавляет его в конец. Иными словами, одна итерация цикла просто переставляет все записи на одну позицию влево.


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



Для простоты я опустил строку, идентифицирующую зловред как .


После перемешивания скрипт определяет такую функцию:



Забавно, что везде, где можно, используются шестнадцатеричные константы, даже когда это совершенно бессмысленно. Например, .


Взгляните на расшифрованную версию:



Функция проста: она лишь возвращает из массива запись с определённым индексом. Для дополнительного запутывания индекс передаётся в качестве строкового значения и преобразуется в число с помощью выражения . Это работает благодаря такому свойству JS, как автоматическое преобразование строковых в десятичные значения, когда они используются в арифметических операциях.


Затем идёт основная входная функция скрипта. После переформатирования получаем:



Первое, что бросается в глаза, — это обилие вызовов наподобие . Это вызовы функции , которую мы уже видели выше. То есть просто возвращаются значения из перемешанного списка строковых значений, так что можно напрямую заменить их финальными значениями. превратится в и т. д.


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



Теперь можно вычислить, что же делает этот JS-скрипт. А делает он три вещи:


Регистрирует обработчик , вызываемый браузером, когда пользователь пытается закрыть вкладку или уйти с сайта. После этого скрипт показывает всплывающее окно, чтобы не дать жертве уйти. Неясно, почему браузер позволяет это сделать. Затем показывает модальный диалог , предупреждающий пользователя о возможном заражении и звонке на горячую линию. Любопытно, что он не использует более популярное решение . Главное отличие заключается в том, что всплывающее окно позволяет выбрать между OK и Cancel, хотя скрипту плевать, куда вы кликнете. Возможно, это слабая попытка обмануть блокировщики рекламы и антивредоносные плагины. Вне зависимости от того, на какую кнопку нажал пользователь, скрипт запускает длинный цикл, циклически генерирующий числовой URL и добавляющий его в историю браузера. История заполняется ссылками на мошеннический сайт, что делает бесполезным нажатия на кнопку «Назад». Это ещё один способ не дать жертве уйти.

После удаления обфускации мы получаем довольно простой скрипт. Он всего лишь доставляет пугающее голосовое сообщение и заставляет пользователя оставаться на сайте достаточно долго, чтобы прочитать текст (и, быть может, позвонить по телефону).


Уверен, что этот скрипт не мог запустить в мой компьютер реального зловреда. Также стало понятно, почему подвис браузер: Chrome плохо переваривает слишком длинные URL’ы и заспамливание истории.


Заключительные мысли

Хотя фальшивую службу поддержки нельзя целиком приравнять к полноценной зловредной атаке, в запутывание JS-скрипта на этом сайте было вложено на удивление много сил. Оригинальный код умещается менее чем в 30 строк, на обратный инжиниринг ушла пара часов. Учитывая простую структуру сайта и чистое форматирование кода, я предполагаю, что скрипт написал кто-то хорошо разбирающийся в веб-разработке. Вероятно, автор просто забыл добавить номер телефона, чтобы его мошенническая схема действительно сработала. Либо это критический недосмотр, либо мне попалась ранняя тестовая версия того, что позднее превратится в полноценный мошеннический сайт.


Несколько разочаровывает, что для его работы достаточно лишь маленького JS-скрипта и что можно сделать браузер полностью неработоспособным, настолько, что нельзя уйти с сайта и нужно перезапустить приложение. Учитывая, сколько ежедневно появляется рекламы, в ней очень легко спрятать 30 строк кода. Странно, что это не происходит гораздо чаще.


В любом случае это было забавно. В следующий раз, когда окажетесь на мошенническом сайте, почему бы не поковыряться в коде и не посмотреть, как он работает? Вы можете узнать для себя что-нибудь интересное.


UPD. В комментариях правильно определили обфускатор — вот ссылка на , а разработкой занимается Качалов Тимофей

ПодпискаБудь в СЕТИ! Новости социальных сетей - всегда актуальное
 
Группы: ВК | OK | Tg