Анализ HTA файла, содержащего обфусцированный JavaScript код

Попался мне на глаза ресурс, рекомендующий разные обфускаторы и деобфускаторы JavaScript. Решил проверить свои силы и самому поработать деобфускатором. А для проверки нашёл простенький вредоносный файлик.

Hidden text

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

Поиски сэмпла

Для начала отметим, что JavaScript может встречаться в разных типах файлов. Начиная с .js, и как вставка в html, заканчивая .pdf и ещё чем-нибудь интересным. Я же остановился на .hta файлике. Это по сути исполняемый файл с кодом html внутри себя, который может быть запущен вне браузера, в приложении mshta.exe, входящем в состав Windows (c:\windows\system32\mshta.exe).

Обычному смертному доступно не так много официальных ресурсов для поиска и получения вредоносного файла. Я воспользовался bazaar, где даже можно отфильтровать интересуемые файлики по разным параметрам. Вот прямая ссылка на страничку о сэмпле https://bazaar.abuse.ch/sample, где можно увидеть его хэши, кто и когда добавил его в базу, как детектируется и т.п…

Внимание! Если вы скачаете оттуда какой-нибудь файл, то будете действовать на свой страх и риск. Надо помнить о правилах работы с вредоносными и подозрительными файлами.

Вытаскиваем внутренности вредоноса наружу

Файл скачался с оригинальным расширением, поэтому я сразу его переименовываю, добавляю к концу имени файла какой-нибудь символ, чтобы Windows не определила, как его открывать (на случай неаккуратного действия, приводящего к запуску). Обычно это знак подчёркивания. Получилось что-то такое: c370f21f46389e056c8cb0e184422c50.hta_

Файл такого типа можно открыть в обычном текстовом редакторе, так как содержимое по сути является текстом. Видим:

Изначальное содержимое сэмплаИзначальное содержимое сэмпла

Несмотря на то, что я урезал вид файлика, можно увидеть его состав. Внутри html тэгов видны в самом начале base64 строки, за ними запутанный код, чтобы никто сразу не догадался, а антивирусы не смогли задетектировать потоковыми сигнатурами.

Ну, поехали. Для того, чтобы увидеть исполняемый код в «первозданном» виде, нам нужно:

  • преобразовать его в чистый код JavaScript, отбросив html конструкции;

  • найти инструкции запуска обфусцированного кода и заменить их на вывод текста кода.

Отбрасываем лишнее

  1. Убираем открывающие и закрывающие тэги «html» и «body».

  2. Конструкции вида (благо, из не много):

    some_value

    ...

    var var1 = method('data').innerHTM

    заменяем на:

    var data = some_value

    var var1 = data

  3. Убираем открывающие и закрывающие html тэги «script», заменив каждый открывающий тэг на перенос строки (для удобства отладки, если понадобится).

    У меня получилось вот так:

убрали лишние тэгиубрали лишние тэги

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

Итог:

преобразовали к читаемому видупреобразовали к читаемому виду

Заменяем запуск кода

Теперь код структурирован, хоть по-прежнему и не понятен. Но мы уже видим, что сначала у нас объявляются и определяются переменные, затем функции. И последней строкой у нас идёт их запуск. Давайте посмотрим, что запускается:

выясняем цепочку запусковвыясняем цепочку запусков

Здесь видим, что создаётся ActiveX объект для запуска jscript кода. Просто заменим запуски в последней строке полученного кода на запуск функции console.log:

Заменили исполнение на вывод в консольЗаменили исполнение на вывод в консоль

Смотрим результат

Переходим, например, на jsconsole и копируем туда полученный на предыдущих шагах код. Нажимаем Enter и наблюдаем результат:

Результат деобфускацииРезультат деобфускации

В первом блоке мы видим, что отправляется GET запрос к определённому ресурсу, а результат записывается в файл c:\users\public…
Во втором блоке мы уже видим, что созданный файл передаётся в качестве параметра к Regsvr32. То есть предполагается, что скаченный файл является COM-dll, что довольно часто встречается в мире вредоносного ПО.

Послесловие

Я не претендую на то, что это единственное решение. Например, можно было бы в коде hta поменять строки запуска расшифрованных строк на добавление их в тело документа. Или декодировать base64 строки и потом слепить их как-нибудь, выяснив из алгоритма или интуитивно. Список решений можно продолжать.

По хорошему, анализ файла этим не заканчивается. У нас есть в результате URL нового скачиваемого файла. Дальше надо работать с ним, обработав всю цепочку запуска. Можно также выяснить кто или какой регион является целью этих вредоносных файлов, как распространяется изначальный .hta, и т.д…

© Habrahabr.ru