Анализ 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 конструкции;
найти инструкции запуска обфусцированного кода и заменить их на вывод текста кода.
Отбрасываем лишнее
Убираем открывающие и закрывающие тэги «html» и «body».
Конструкции вида (благо, из не много):
some_value...
var var1 = method('data').innerHTM
заменяем на:
var data = some_value
var var1 = data
Убираем открывающие и закрывающие html тэги «script», заменив каждый открывающий тэг на перенос строки (для удобства отладки, если понадобится).
У меня получилось вот так:
убрали лишние тэги
Копируем полученный код в Pretifier и поправляем синтаксические ошибки. Можно и без него, но так нагляднее. В последней строке вызываются функции, им надо передавать значения в скобках, а не через пробел. А двоеточия, разделяющие вызовы функций, следует заменить на символ точки с запятой.
Итог:
преобразовали к читаемому виду
Заменяем запуск кода
Теперь код структурирован, хоть по-прежнему и не понятен. Но мы уже видим, что сначала у нас объявляются и определяются переменные, затем функции. И последней строкой у нас идёт их запуск. Давайте посмотрим, что запускается:
выясняем цепочку запусков
Здесь видим, что создаётся ActiveX объект для запуска jscript кода. Просто заменим запуски в последней строке полученного кода на запуск функции console.log:
Заменили исполнение на вывод в консоль
Смотрим результат
Переходим, например, на jsconsole и копируем туда полученный на предыдущих шагах код. Нажимаем Enter и наблюдаем результат:
Результат деобфускации
В первом блоке мы видим, что отправляется GET запрос к определённому ресурсу, а результат записывается в файл c:\users\public…
Во втором блоке мы уже видим, что созданный файл передаётся в качестве параметра к Regsvr32. То есть предполагается, что скаченный файл является COM-dll, что довольно часто встречается в мире вредоносного ПО.
Послесловие
Я не претендую на то, что это единственное решение. Например, можно было бы в коде hta поменять строки запуска расшифрованных строк на добавление их в тело документа. Или декодировать base64 строки и потом слепить их как-нибудь, выяснив из алгоритма или интуитивно. Список решений можно продолжать.
По хорошему, анализ файла этим не заканчивается. У нас есть в результате URL нового скачиваемого файла. Дальше надо работать с ним, обработав всю цепочку запуска. Можно также выяснить кто или какой регион является целью этих вредоносных файлов, как распространяется изначальный .hta, и т.д…