Самый опасный вектор атак — социальная инженерия. Хакеры отправляют жертве сообщение с прикрепленным файлом на электронную почту, как правило — файл Microsoft Office с вреодносным содержимым. Сегодня я покажу, как анализировать вредоносные файлы Microsoft Office.
Еще по теме: Как хакеры скрывают вирусы в документах Office
Анализ вредоносных файлов Microsoft Office
Для удобства чтения кода я переименовал переменные. Алгоритм декодирования очень прост. С каждым байтом выполняется операция XOR (исключающее «или») с ключом, который хранится в переменной KEY. После каждого преобразования байта изменяется и сам ключ.
Напишем собственный скрипт для декодирования полезной нагрузки, используя Python 3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import re def Decode(bVar): # Алгоритм декодирования полезной нагрузки result = "" key = 45 for i in range(0,len(bVar)): result += chr(bVar[i] ^ key) key = (key ^ 99) ^ (i % 254) return result reg = b"MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74dlb1SiFOkR1Hh" f = open("49b367ac261a722a7c2bbbc328c32545","rb") w = open("maintools.js","w") # Файл для записи раскодированной полезной нагрузки data_read = f.read() start = re.search(reg,data).span()[1] # Начало полезной нагрузки stop = start + 16827 # Конец полезной нагрузки data1 = data_read[start:stop] w.write(Decode(data)) f.close() w.close() |
Этот скрипт находит строку MxOH8... в исследуемом документе и считывает данные размером 16 827 байт. Далее по алгоритму, реализованному в функции Decode, он расшифровывает полезную нагрузку и сохраняет результат в файл maintools.js.
Итак, с помощью нашей программы мы вытащили расшифрованный JS-сценарий. Посмотрим, что у него внутри?

В переменную wvy1 сохраняются аргументы командной строки. Функция y3zb() возвращает основную полезную нагрузку, которая преобразуется по определенному алгоритму. Рассмотрим эту функцию повнимательнее.

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

В функции LXv5 реализован алгоритм декодирования Base64, поэтому переименуем ее в Base64_decode. Функция CpPT содержит алгоритм шифрования RC4, дадим ей имя RC4(). Этой функции в качестве аргумента передается строка EzZETcSXyKAdF_e5I2i1, которая является аргументом командной строки и одновременно ключом для деобфускации полезной нагрузки. А расшифрованный код JavaScript выполняет функция eval.

В первых двух циклах реализован алгоритм Key-scheduling algorithm, с помощью которого в дальнейшем генерируется ключ. Напишем скрипт на Python 3, расшифровывающий полезную нагрузку из переменной qGxZ функции
1 2 3 4 5 6 7 8 9 10 |
y3zb(). from Crypto.Cipher import ARC4 import base64 payload = "zAubgpaJRj0tIneNNZL0 ... rbhue4N84o9YPBy/SFieRfjQP5lsrSZWJKNJ5ZSbf06ZO4="; key = b"EzZETcSXyKAdF_e5I2i1" rc4 = ARC4.new(key) decode = rc4.decrypt(base64.b64decode(payload)) w = open('result.js','wb') w.write(decode) w.close() |
После преобразования полезной нагрузки мы получили еще один код JavaScript, в котором и реализована основная функциональность.

Этот сценарий собирает информацию о скомпрометированной системе и отправляет ее на управляющие серверы.

Из рисунка выше виден заголовок, который формируется для отправки данных методом POST.

После запуска вредоносный скрипт копирует себя в следующую папку:
1 |
C:\Users\<Пользователь>\AppData\Local\Microsoft\Windows |
А затем создает в планировщике задач Windows новую задачу, которая запускается при входе пользователя в систему. Задача имеет имя Task Manager, описание Windows Task Manager, а сам скрипт запускается из каталога WPD.
Найти в системе это задание можно с помощью команды schtasks /query /fo csv /v, а еще можно просто зайти в папку C:\Windows\System32\Tasks и отыскать в ней подкаталог WPD. Весь свой трафик сценарий шифрует алгоритмом RC4 с ключом 2f532d6baec3d0ec7b1f98aed4774843. Для запуска JS-скрипта используется утилита командной строки cscript.exe.
Emprisa Maldoc
Разберем задание с вредоносным документом в формате Microsoft Rich Text Format (RTF). Такие файлы очень часто используются злоумышленниками при фишинговых атаках и, как правило, содержат эксплоиты.
Для начала соберем информацию об объекте исследования с помощью утилиты rtfobj.
1 |
rtfobj c39-EmprisaMaldoc.rtf |
Тулза определила, что RTF-документ содержит встроенный объект. Для выполнения вредоносного кода используется уязвимость CVE-2017-11882, эксплуатирующая переполнение буфера в редакторе Microsoft Equation. Проанализируем этот файл с помощью утилиты rtfdump.
1 |
rtfdump c39-EmprisaMaldoc.rtf |
Как видно из рисунка, в документе спрятан объект с именем Equation.e, magic-байт d0cf11e0. Исследуем поток 7, затем выгрузим из него OLE-объект и сохраним в файл objrtf.
1 |
rtfdump c39-EmprisaMaldoc.rtf -s 7 -H -E -d > objrtf |
Полученный OLE-объект можно изучить при помощи утилиты oledump.
1 |
oledump objrtf |
После строки Equation Native в шестнадцатеричном представлении содержится обфусцированный шелл‑код. Сохраним его дамп в файл shell.
1 |
oledump objrtf -s 4 -d > shell |
Чтобы разобраться, как работает этот шелл‑код, нам понадобится утилита scdbg. Запустим ее с параметром /findsc, который эмулирует выполнение шелл‑кода при каждом смещении в файле.
1 |
scdbg /f shell findsc |
Функция LoadLibraryA загружает динамическую библиотеку urlmon.dll. Далее с использованием функции URLDownloadToFileA из этой библиотеки с ресурса raw.githubusercontent.com скачивается полезная нагрузка и сохраняется в файл o.exe. Затем выполняется выход из процесса с помощью функции ExitProcess.
Получим полезную нагрузку и посмотрим, что это такое. Адрес следующий:
1 |
https://raw.githubusercontent.com/accidentalrebel/accidentalrebel.com/gh-pages/theme/images/test.png |
Поведенческий анализ вредоносного документа
Зайдем в виртуальную машину Kali Linux, перейдем в каталог
1 |
/var/lib/inetsim/http/fakefiles |
и сохраним полезную нагрузку под именем sample.png.

Вернемся в виртуальную машину с Windows 10, установим Microsoft Office и откроем в нем исследуемый файл c39-EmprisaMaldoc.rtf, чтобы проанализировать его поведение.
Если файл открыть, запустится дочерний процесс EQNEDT32.EXE (компонент MS Office, отвечающий за вставку и редактирование объектов OLE в документы). Уязвимость срабатывает, когда EQNEDT32.EXE пытается скопировать имя шрифта в локально созданный буфер.
Размер буфера составляет всего 40 (0x28) байт, однако, если имя шрифта длиннее 40 байт, буфер и регистр EBP переполнятся, а адреса возврата будут перезаписаны. Когда функция завершит выполнение, поток управления доставится по назначенному злоумышленником адресу.
Выполняющийся таким образом шелл‑код загружает полезную нагрузку из виртуальной машины Kali Linux (файл sample.png) и сохраняет по пути C:\o.exe. После запуска этого исполняемого файла появляется модальное окно, содержащее флаг.

Давай посмотрим, какое имя шрифта загружается процессом, когда открывают вредоносный документ. Для этого запустим Proccess Hacker 2, откроем документ, найдем процесс Winword.exe и перейдем на вкладку Memory. В памяти отыщем обращение к папке C:\Windows\Fonts и увидим, что процесс пытается загрузить шрифт times.ttf. Значит, это шрифт Times New Roman.
Итого
На этих двух примерах мы рассмотрели методику исследования подозрительных документов, которые распространяются злоумышленниками по электронной почте при фишинговых атаках. На GitHub можно найти РОС для рассмотренной нами эксплуатации уязвимости CVE-2017-11882, который выполняет шелл‑код по адресу в памяти 0x00402114. Microsoft закрыла эту уязвимость, выпустив патч KB4011604. Не забудь установить это обновление, чтобы обезопасить себя от подобной атаки.
Еще по теме: Удаленная отладка вредоносных программ