Первоначально опубликовано в Блоге Malwarebytes Labs 24 мая 2018 г.
Вредоносный троян Emotet Banking существует уже довольно давно. Таким образом, исследователи Infosec предприняли несколько попыток разработать инструменты для деобфускации и даже дешифрования зашифрованного AES кода, принадлежащего этой вредоносной программе.
Проблема с этими инструментами в том, что они нацелены на активные версии вредоносного ПО. У них возникают проблемы, когда авторы вредоносного ПО меняют код. Изменения могут быть любыми: от небольших изменений в структуре кода до радикальных изменений, таких как переход от проекта VBA к сценариям PowerShell. Обычно даже незначительное изменение кода ломает инструменты.
Основная цель этой статьи - помочь читателям в деталях понять структуру и поток Emotet, чтобы вариации кода не создавали проблем для аналитиков, которые пытаются расшифровать его в будущем. Мы также глубоко погрузимся в некоторые важные части самого кода, чтобы понять выполнение в подробном пошаговом процессе.
В первой части этого анализа, состоящего из двух частей, мы рассмотрим код VBA, где вы узнаете, как распознавать и отбрасывать «мертвый» код, добавленный, чтобы усложнить процесс анализа. Мы также рассмотрим методы, которые можно использовать для извлечения обфусцированных команд, и то, как выполняется код.
Обзор Emotet
Для анализа мы рассмотрим этот образец:
Файл: PAYMENT 225EWF.doc
MD5: e8e468710c0a4f0906305c435a761902
SHA-256: 707fedfeadbfa4248cfc6711b5a0b98e1684cd37a6e0544e9b7bde4b86096963
Текущая версия загрузчика Emotet использует PowerShell для выполнения финальных команд. Вектор заражения - это традиционный электронный фишинг. Фишинг будет содержать ссылку, по которой жертва должна перейти, что, в свою очередь, запустит загрузку вредоносного ПО. Вредоносное ПО обычно представляет собой документ Word, предлагающий жертве включить макросы. После включения макросов VBA выполняется в фоновом режиме, а полезная нагрузка загружается и выполняется на компьютере жертвы.
Код VBA
Давайте быстро посмотрим, как мы можем получить доступ к коду VBA из зараженного документа Microsoft Word. Чтобы включить представление разработчика в Word, перейдите в «Файл» и выберите «Параметры». В разделе «Параметры» нажмите «Настроить ленту». Включите опцию «Разработчик» и нажмите OK.
Теперь в верхней строке меню должен появиться пункт «Разработчик». После того, как вы нажмете «Разработчик», вы увидите вариант «Visual Basic».
Щелкните Visual Basic, и вы увидите весь проект в отдельном окне. Теперь мы можем приступить к анализу кода.
В качестве альтернативы мы можем использовать автоматический способ извлечения этого сценария Powershell, запустив документ на виртуальной машине и проверив параметры, с которыми был развернут Powershell, то есть с помощью ProcessExplorer. Также песочницы, такие как Гибридный анализ, извлекают его автоматически.
Выполнение кода
Как только контент включен (макросы), запускается выполнение.
Код VBA входит в состав вредоносного документа MS Office. Как только макросы включены, код выполняется в фоновом режиме.
В качестве попытки обфускации кода разработчики включили много текста, который не используется. Можно использовать только часть всего кода, и она довольно хорошо скрыта.
Более быстрый способ попасть прямо в код - начать с кода макроса, который вызывается для выполнения начальных команд. В случае анализируемого здесь образца это Sub AutoOpen (). Начнем с выполнения этой подпроцедуры.
Теперь мы отбросим весь бесполезный код, который был включен в подпрограмму, чтобы усложнить анализ.
Мы видим, что в конце подпроцедуры вызывается метод Application.run:
Чтобы выполнить метод, показанный выше, мы видим, что метод вызывает подпрограмму и функцию.
Сначала рассмотрим подпункт ndUzTzJ.
В этой подпункте снова есть бесполезный текст, который просто добавляет сложности в целях анализа. Мы сосредоточимся только на используемом коде.
Вот как должна выглядеть подпрограмма после того, как мы отбросили бесполезный код:
vbHide будет присвоено значение 0, что означает, что окно скрыто и фокус передается скрытому окну.
DsPBkKtzcIwF - формирует команду.
ndUzTzJ - вызывает WScript.Shell для выполнения команды.
Давайте посмотрим на раздел функции DsPBkKtzcIwF ():
В приведенном выше фрагменте кода мы можем увидеть несколько примечательных вещей:
Переменные используются для хранения присвоенных значений. Затем значения будут переданы в другую функцию yy222222222222222y () для обработки. После обработки значения снова присваиваются различным переменным, и эти переменные будут использоваться для создания зашифрованного кода, который будет передан в систему для дешифрования с помощью PowerShell.
Глубокое погружение
Давайте углубимся здесь и внимательно проанализируем код:
JMArl = «zahajUZomiAjVADEAMAA4ADMdpokrTZ»
Переменной JMArl присваивается значение «zahajUZomiAjVADEAMAA4ADMdpokrTZ».
szFqp = sRWNiPRldXLv = 21790 + 2115454 * PhcMjZjwl - CLng (8712932) / (zunFnTXk - Sqr (1328634 * Oct (7463260) - 1977628–4976151) * (294265 / XiFEWH))
vLkhkiRclJ = GcDcX = 3122978 + 1398811 * JTkURPW - CLng (9593915) / (krXPEiFIa - Sqr (1266549 * Oct (1775652) - 8314095–5625841) * (8872696 / mNsSkdPD))
Этот код нельзя использовать - мы его отбросим.
sEVQo = IjKrpJC + yy222222222222222y (JMArl, 14, 11)
Здесь происходит большая часть действия. Переменной sEVQo присваивается значение вывода «IjKrpJC + yy222222222222222y (JMArl, 14, 11)»
«IjKrpJC» не служит никакой цели, мы откажемся от него.
yy222222222222222y () - это вызываемая функция. Давайте посмотрим на саму функцию:
Теперь давайте избавимся от всего мусорного кода функции и посмотрим на него еще раз:
Функция вызывает функцию Mid, которая обрабатывает данные для дальнейшего использования.
Средняя функция
hPoMiTjfoDT - ТЕКСТ; twOYMDvfbGk - это START_POSITION; VSTcawBYGW - это NUMBER_OF_CHARACTERS
Теперь, когда мы понимаем, как был структурирован поток кода, давайте посмотрим, как выполняется программа.
Вот переменная sEVQo до того, как ей было присвоено какое-либо значение:
sEVQo теперь вызывает yy222222222222222y (). Мы видим, что значение «14» было передано переменной функции «twOYMDvfbGk»:
sEVQo = IjKrpJC + yy222222222222222y (JMArl, 14, 11)
Двигаясь дальше, мы видим, что значение «11» было передано в функциональную переменную «VSTcawBYGW»:
sEVQo = IjKrpJC + yy222222222222222y (JMArl, 14, 11)
Наконец, текстовая строка будет передана в переменную mbPRLWAjZ, которая сначала ПУСТО:
Теперь эти данные будут обрабатываться с помощью функции Mid, как описано выше.
Давайте посмотрим, как это происходит:
mbPRLWAjZ = zahajUZomiAjVADEAMAA4ADMdpokrTZ
twOYMDvfbGk = 14
VSTcawBYGW = 11
Мид (hPoMiTjfoDT, twOYMDvfbGk, VSTcawBYGW):
Середина («zahajUZomiAjVADEAMAA4ADMdpokrTZ», 14, 11)
Это должно переводиться на:
ADEAMAA4AD \
Теперь давайте снова посмотрим на выполняемую функцию:
И он будет передан обратно в вызывающую переменную:
И теперь значение переменной sEVQo присвоено ADEAMAA4AD. Это был взгляд на одну из многих переменных, которые использовались в этой функции.
Чтобы увидеть, как все это переходит в конечный результат для этого значения, мы можем взглянуть на окончательное присвоение переменной:
Значение, присвоенное DsPBkKtzcIwF после выполнения указанной выше строки кода, представляет собой команду, которая будет выполняться подчиненным ndUzTzJ:
Теперь мы можем распечатать вывод на экран (с помощью MsgBox), чтобы быстро просмотреть, или в немедленное окно (с помощью Debug.Print) для получения полного результата.
Вот часть приведенной выше команды, которая вызывает PowerShell:
Что должно быть переведено (посмотрите на выделенный текст) на:
Это был взгляд на то, как получить последнюю команду с зашифрованными данными из кода VBA. Во второй части этой серии мы расшифруем эти данные, чтобы извлечь из них URL-адреса полезной нагрузки второго этапа.