Разобранный USB-накопитель с отпаянным чипом памяти лежит рядом с распечаткой документа с подсвеченными строками VBA-макроса. Жёсткий конус света от лампы, глубокие тени, надпись CVE-2021-40444 на...


По данным IBM X-Force Threat Intelligence Index 2025, инфостилеры заняли первое место среди всех категорий малвари за 2024 год - 32% обнаруженных образцов. Основной канал доставки не изменился: фишинговое письмо с вложением .docm или .pdf. А по данным CrowdStrike Global Threat Report 2025, вредоносное использование GenAI для фишинга удвоилось за год - атакующие клепают убедительные приманки быстрее, чем аналитики успевают их разбирать. На практике это означает одно: подозрительных вложений на столе у аналитика всё больше, а времени на каждое - всё меньше. Дальше - пошаговый workflow анализа вредоносных документов: от определения типа угрозы до извлечения payload и C2-адресов.

Место вредоносного документа в цепочке атаки​

1783451394170.webp

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

Типовая kill chain для document-based атаки по MITRE ATT&CK:
  1. Initial Access - доставка документа через Spearphishing Attachment (T1566.001). Жертва получает письмо с вложением.
  2. Execution- жертва открывает файл. Варианты срабатывания:
    • Malicious File (T1204.002): пользователь включает макросы по запросу документа
    • Visual Basic (T1059.005): VBA-макрос запускает вредоносный код
    • Exploitation for Client Execution (T1203): эксплойт срабатывает без действий пользователя помимо открытия (например, CVE-2021-40444)
    • PowerShell (T1059.001): макрос вызывает powershell.exe для загрузки следующего stage
    • Windows Command Shell (T1059.003): макрос использует cmd.exe для выполнения команд, загрузки файлов (T1105) или сокрытия данных в NTFS-потоках (T1564.004)
  3. Defense Evasion - payload скрыт внутри документа через Embedded Payloads (T1027.009) и требует Deobfuscation/Decode (T1140) при выполнении.
  4. Command and Control - загрузка основного импланта через Ingress Tool Transfer (T1105).
Задача аналитика - пройти эту цепочку в обратном направлении: от документа к макросу, от макроса к payload, от payload к C2-инфраструктуре, от C2 к индикаторам компрометации.

Бизнес-логика: злоумышленник использует документ как дешёвый масштабируемый вектор initial access. По данным Verizon DBIR 2025, 68% утечек включают человеческий фактор - социальная инженерия через документ эксплуатирует именно это. Конечная цель варьируется: от установки инфостилера для продажи credentials на маркетплейсах до развёртывания ransomware (медианный выкуп - $46,000 по данным того же отчёта).

Требования к окружению для maldoc анализа​

Прежде чем трогать файл - подготовь рабочее место:
  • ОС: REMnux 7.0 (Ubuntu-based дистрибутив для reverse engineering, активно поддерживается) или любой Linux с Python 3.8+
  • RAM: минимум 4 ГБ для VM анализа, рекомендуется 8 ГБ при параллельном запуске sandbox
  • Сеть: строго изолированная - host-only или internal network в VirtualBox/VMware. NAT запрещён: вредоносный документ при детонации может обратиться к реальному C2, и тогда вместо анализа получишь инцидент
  • oletools (версия 0.60.2, проект активно поддерживается на GitHub): pip3 install oletools - даёт olevba, oleid, olemeta, oleobj, mraptor
  • PDF-инструменты: pdfid и pdf-parser (Didier Stevens, активно обновляются), peepdf
  • Дополнительно: CyberChef (GCHQ, offline-версия), YARA, xorsearch, Wireshark
В REMnux всё это предустановлено из коробки. На других дистрибутивах придётся ставить руками.

Статический анализ вредоносных Office файлов с oletools​

1783451439060.webp

Статический анализ вредоносных файлов - первый этап, и часто он даёт достаточно IoC без запуска образца. Для Office-документов основной рабочий инструмент - пакет oletools.

Форматы и что в них опасно​

Перед разбором - ключевое различие форматов. Бинарные файлы (.doc, .xls) используют формат OLE2 (Structured Storage). OOXML-файлы (.docx, .xlsx) - ZIP-архивы. VBA-макросы в OOXML хранятся внутри вложенного OLE2-файла, который лежит в этом ZIP-архиве. Файлы с поддержкой макросов имеют расширение с суффиксом m: .docm, .xlsm, .pptm. Файлы .docx и .xlsx не могут содержать VBA-макросы по спецификации OOXML, но могут содержать Excel 4.0 (XLM) макросы в формулах листов - без OLE2-контейнера. RTF-файлы макросы не поддерживают, зато могут содержать вредоносные встроенные OLE-объекты и эксплойты парсера.

Workflow: oleid, olemeta, mraptor, olevba​

Последовательность действий на реальном образце:

Шаг 1. oleid suspicious.docm - определяет формат файла, наличие VBA-макросов, зашифрованных данных, XLM-макросов и внешних связей (External Relationships).

Шаг 2. olemeta suspicious.docm - извлекает метаданные: автор, дата создания и модификации, компания, путь к шаблону. Метаданные могут содержать артефакты атакующего - реальное имя пользователя, название организации, путь к файлу на машине разработчика. Бывает, что в поле Author торчит Иван Петров с путём C:\Users\ivan.petrov\Desktop\payload_builder\ - и это уже полдела. Время создания через oletimes уточняет хронологию.

Шаг 3. mraptor suspicious.docm - быстрый triage: проверяет наличие авто-триггеров (AutoOpen, AutoExec, Document_Open, Workbook_Open). Если находит автоматический запуск + запись в файловую систему + выполнение внешних команд - помечает файл как SUSPICIOUS. Удобно для сортировки больших объёмов образцов, когда на столе 50 вложений из утреннего фишинга.

Шаг 4. olevba -a suspicious.docm - центральный инструмент. Флаг -a запускает анализ и выводит таблицу подозрительных ключевых слов. Типичный вывод:
Код:
+----------+--------------------+---------------------------------------------+
| Type     | Keyword            | Description                                 |
+----------+--------------------+---------------------------------------------+
| AutoExec | AutoOpen           | Runs when the Word document is opened       |
| Suspicious | Shell            | May run an executable or system command      |
| Suspicious | powershell       | May run PowerShell commands                  |
| Suspicious | CreateObject     | May create an OLE object                     |
| Suspicious | MSXML2.XMLHTTP   | May download files from the Internet         |
| IOC      | http://evil[.]com  | URL (potential C2 or download)               |
+----------+--------------------+---------------------------------------------+
Для полного дампа VBA-кода: olevba -c suspicious.docm > macro_dump.vba. Это даёт сырой код для ручного разбора обфускации.

На что обращать внимание в выводе olevba:

Ключевое словоЗначениеРиск
AutoOpen / Document_OpenАвтоматический запуск при открытииВысокий
Shell / WScript.ShellВыполнение команд ОСВысокий
CreateObjectСоздание COM-объектов (WMI, Shell, XMLHTTP)Средний
microsoft.xmlhttpЗагрузка файлов из сетиВысокий
powershell / cmd.exeВызов системного интерпретатораВысокий
Chr() / ChrW()Посимвольная обфускация строкСредний
Environ / TempРабота с файловой системойСредний

[Ограничения oletools: инструменты работают только с валидной OLE2/OOXML-структурой. Сильно повреждённые файлы или нестандартные контейнеры (например, password-protected ZIP с .doc внутри - типичный приём Qakbot) требуют предварительной распаковки вручную.]

Разбор вредоносных макросов VBA: обфускация и деобфускация

Малварь в макросах Office практически никогда не приходит в чистом виде. Разбор вредоносных макросов VBA - это на 80% деобфускация и на 20% трассировка потока выполнения. Оставшиеся 0% - надежда, что автор малвари забыл обфусцировать (бывает, но редко).

Типовые техники обфускации​

Chr() и ChrW() цепочки - каждый символ строки заменяется вызовом функции. Строка "powershell" превращается в Chr(112) & Chr(111) & Chr(119) & Chr(101) & Chr(114) & Chr(115) & Chr(104) & Chr(101) & Chr(108) & Chr(108). Деобфускация в CyberChef: рецепт From Charcode (Decimal).

Конкатенация строк - разбиение на фрагменты: "pow" & "er" & "she" & "ll". Часто комбинируется с Chr() для усложнения.

Base64-кодирование - полезная нагрузка кодируется в Base64 и декодируется в рантайме. Характерный маркер в olevba: вызов powershell -enc [base64_blob] или функция FromBase64String. Для ручного декодирования: echo "[base64]" | base64 -d в терминале. Нюанс, на котором спотыкаются: PowerShell -EncodedCommand использует UTF-16LE, поэтому для таких строк нужно printf '%s' '[base64]' | base64 -d | iconv -f UTF-16LE -t UTF-8.

XOR-шифрование строк - макрос содержит XOR-функцию и массив зашифрованных байтов. Пример деобфускации:
Python:
data = b'\x82\x85\x8c\x8c\x8f'  # зашифрованные байты из макроса
key = 0xED  # ключ, найденный через xorsearch
result = bytes([b ^ key for b in data])
print(result.decode())  # "Hello"
Ключ XOR можно подобрать через xorsearch из набора REMnux, подставляя известные строки: http://, .exe, cmd.

Хранение payload в свойствах документа - атакующий записывает вредоносный код в поле Author, Comments или Custom Properties, а макрос извлекает данные оттуда через ActiveDocument.BuiltInDocumentProperties. Через olemeta это видно, но olevba не всегда связывает свойство с макросом - приходится копать вручную. Один из реальных кейсов: Base64-закодированный PowerShell прятался в поле Author, а макрос декодировал его и запускал через msbuild.exe - классический Living off the Land для обхода мониторинга powershell.exe.

Переименование переменных - осмысленные имена заменяются на случайные: Sub AutoOpen() вызывает xQ3kL(), которая вызывает pR9mN(). Тут помогает только ручной разбор - садишься и трассируешь поток выполнения, переименовывая функции по мере понимания.

Когда статический разбор VBA недостаточен​

Современные кампании используют многостадийную загрузку: первый stage - только downloader, который тянет второй stage из сети. Статический анализ покажет URL загрузки, но не финальный payload. В таких случаях без динамического анализа вредоносных документов в sandbox не обойтись.

PDF эксплойт анализ: ключевые слова и извлечение скриптов​

1783451490592.webp

PDF-файлы - второй по распространённости вектор document-based атак. В отличие от Office, PDF не использует VBA. Атакующие работают через встроенный JavaScript, эксплойты парсера PDF-ридера и встроенные объекты.

Первичная оценка с pdfid​

pdfid (Didier Stevens, активно поддерживается) сканирует PDF и подсчитывает опасные ключевые слова. Запускаем: pdfid suspicious.pdf.

Список опасных ключевых слов (по данным Lenny Zeltser, Analyzing Malicious Documents Cheat Sheet):

Ключевое словоЧто означает
/OpenAction, /AAАвтоматический запуск скрипта при открытии
/JavaScript, /JSНаличие JavaScript-кода
/AcroForm, /XFAФормы с потенциальным скриптом
/URIОбращение к внешнему URL (фишинг)
/SubmitForm, /GoToRОтправка данных на внешний сервер
/ObjStmСкрытие объектов внутри потока объектов
/LaunchЗапуск внешнего приложения

Обфускация ключевых слов - распространённый приём: /JavaScript записывается как /J#61vaScript (hex-кодирование символов). pdfid обрабатывает часть таких вариаций, но не все - держите это в голове.

Глубокий разбор с pdf-parser​

Если pdfid показал подозрительные ключевые слова, переходим к извлечению содержимого конкретных объектов: pdf-parser --search javascript suspicious.pdf находит все объекты с JavaScript. Получив номер объекта: pdf-parser --object 10 --filter --raw suspicious.pdf извлекает и декодирует его содержимое.

Внутри JavaScript-кода PDF часто обнаруживается шеллкод или вызовы системных команд через cmd.exe. Для анализа извлечённого JavaScript - SpiderMonkey или box-js в изолированной среде.

[Ограничения: pdfid и pdf-parser работают только с валидной PDF-структурой. Сильно повреждённые или специально crafted файлы с нестандартными cross-reference таблицами могут потребовать ручного hex-анализа или альтернативного инструмента peepdf.]

CVE-2021-40444: анализ эксплойта без макросов в Office документе​

CVE-2021-40444 - пример атаки, где вредоносный документ не содержит макросов. Стандартные проверки через olevba тут бесполезны. Эксплойт использует уязвимость в MSHTML для удалённого выполнения кода через вредоносный ActiveX-контроль.

Верифицированные данные NVD:
  • CVSS: 8.8 (HIGH)
  • Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:H/A:L - сетевой вектор (AV:N), низкая сложность (AC:L), привилегии не нужны (PR:N), но требуется действие пользователя (UI:R) - открытие документа
  • CWE: CWE-22 (Path Traversal) - классификация NVD; по анализу исследователей (NCC Group и др.), path traversal используется в цепочке эксплуатации на этапе размещения INF-файла из CAB-архива; корневая уязвимость - небезопасная обработка ActiveX-контента в MSHTML при парсинге OOXML-документа
  • Затронутые продукты: все поддерживаемые версии Windows с уязвимым MSHTML (Windows 10, Windows Server, Windows 11 до сентябрьского патча 2021). NVD CPE явно перечисляет Windows 10 1507/1607/1809/1909/2004
  • Включена в каталог CISA KEV (активно эксплуатируется в дикой среде), связана с ransomware-кампаниями
Механика: документ OOXML содержит внешнюю связь (external relationship) в файле word/_rels/document.xml.rels, которая указывает на URL с вредоносным ActiveX-контролем. При открытии документа MSHTML-движок обрабатывает эту ссылку и загружает эксплойт. Пользователю не нужно включать макросы - уязвимость эксплуатирует парсинг HTML-контента (T1203). По данным Microsoft MSTIC и Mandiant, CVE-2021-40444 использовалась для доставки Cobalt Strike Beacon в целевых кампаниях - для срабатывания требовалось открытие документа (UI:R), но включение макросов не требовалось. Эксплойт обходил механизм контроля доступа к активному контенту, что концептуально близко к проблеме Broken Access Control (OWASP A01:2021).

Обнаружение через oleobj​

Для анализа: oleobj -r suspicious.docx - скрипт извлекает все external relationships и отображает подозрительные URL. Альтернативный ручной метод: распаковать OOXML как ZIP (unzip suspicious.docx -d extracted/), найти файл word/_rels/document.xml.rels и проверить атрибуты TargetMode="External" - любой внешний URL здесь подозрителен.

[Применимо: DFIR-расследование инцидентов на непропатченных Windows 10 legacy-системах. На обновлённых системах эксплойт не работает.]

Извлечение payload из документов и переход к динамическому анализу​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
из модуля olevba принимает путь к файлу и даёт программный доступ к макросам, подозрительным ключевым словам и IoC. Это позволяет встроить maldoc triage в конвейер SOC без ручного запуска каждой команды.

Ещё один момент, который редко обсуждают в русскоязычных материалах: атакующие всё чаще внедряют вредоносный контент не через макросы и не через эксплойты парсера, а через механизмы, которые по сути - injection-атаки на уровне документа. DDE-инъекция в Excel - классический пример: атакующий вставляет формулу вида =cmd|'/C calc'!A0 в ячейку, и при открытии файла Excel запускает DDE-процесс (отключён по умолчанию с 2017 г. после Microsoft ADV170021). Отдельная техника - CSV/formula injection - использует =HYPERLINK, =WEBSERVICE для эксфильтрации данных. Оба паттерна концептуально близки к Injection (OWASP A03:2021): пользовательские данные попадают в интерпретатор без валидации и выполняются как команды.

Microsoft заблокировала интернет-макросы в Office в середине 2022 года, и часть сообщества решила, что document-based malware мертва. Реальность сложнее. Атакующие мгновенно переключились на альтернативные контейнеры - OneNote-вложения с .hta-файлами, ISO/IMG-образы с LNK внутри, external relationships вроде CVE-2021-40444. Формат доставки меняется каждые несколько месяцев, но суть та же: заставить пользователя открыть файл и получить выполнение кода. При этом legacy-инфраструктуры - а в ряде корпоративных сред это реальность - до сих пор работают на версиях Office без блокировки макросов из интернета. Навык ручного разбора VBA через oletools - не устаревший скилл из 2019 года, а ежедневная необходимость для аналитика, который работает с реальной инфраструктурой, где Exchange 2016 и Office 2016 - стандарт, а не исключение. Автоматизация через sandbox помогает с объёмом, но когда дело доходит до написания YARA-правил, извлечения конфигурации C2 или атрибуции кампании - ручной разбор макроса с olevba, CyberChef и блокнотом ничем не заменить.

Попробуйте взять любой образец с MalwareBazaar (тег maldoc), прогнать через описанный workflow и дойти до C2-адреса. На курсе WAPT эту цепочку разбирают на реальных семплах с лабами - от фишингового вложения до извлечения конфигурации импланта.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab