Первоначально опубликовано в Блоге 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-адреса полезной нагрузки второго этапа.