reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
---
name: re-doc-malware
type: atomic
description: >
恶意文档分析:PDF/Office 武器化、宏链、文档漏洞利用、载荷提取。
触发词:恶意文档、钓鱼文档、PDF恶意、宏文档、docm、文档漏洞、恶意附件。
capabilities: [document-malware]
---
# 恶意文档分析
## 何时使用 / 何时不用
- 用:钓鱼附件(PDF/Office/RTF)、文档漏洞利用样本、宏文档、文档型恶意载荷
- 用:仅拿到单文档样本,需还原载荷提取链(宏 → 脚本 → 可执行 → 回连)
- 不用:纯脚本宏(转 [[re-script-deob]]);文档仅是载体(核心逻辑在下载载荷)
- 不用:只有网页/邮件网关侧元数据(无样本文件本身)——先要样本再分析
- 注意:动态打开文档必须沙箱([[re-sandbox]],[[re-analyze/platform-tips]] 最高原则);文档可能检测环境后不触发(见坑 6)
## 工具准备
### pdf-parser / pdfid(PDF 结构分析)
- Linux: `apt install pdf-parser pdfid`(Kali 常预装;Debian/Ubuntu 仓库同名包)或 GitHub `DidierStevens/DidierStevensSuite` 源码运行;macOS: `brew install pdf-parser` / pip
- Windows: pip(WSL 亦可)
- 验证: `pdf-parser --version`(无则 `python3 pdf_parser.py --help`);`pdfid.py sample.pdf` 能输出对象计数
- 补充(备注:peepdf 已归档、Python 2 时代,PyPI 仅 0.3.6——首选 pdf-parser/pdfid)
### qpdf(PDF 流解压,可选)
- Linux: `apt install qpdf`;macOS: `brew install qpdf`
- 验证: `qpdf --version`
- 用途: 展开对象流/压缩流为可读形式(`qpdf --qdf --object-streams=disable in.pdf out.pdf`),配合 `-d` dump 对照
### olevba / rtfobj(Office/RTF 宏与嵌入对象提取)
- 多平台: `pip install oletools`(oletools 内含 olevba、rtfobj、oleobj、msodde、oleid、mraptor 等)
- 验证: `olevba --help`;`rtfobj --help`
- 注意: oledump **不在** oletools 包内——是独立工具(GitHub `DidierStevens/DidierStevensSuite` 取 oledump.py,需 `pip install olefile` 依赖;`python3 oledump.py -s <流号> <文件>` 按流转储)
### xlmdeobfuscator(Excel 4.0 宏去混淆,可选)
- `pip install xlmdeobfuscator`
- 验证: `xlmdeobfuscator --help`
- 适用: .xls 里的 XLM 宏表(olevba 0.54+ 已能识别 XLM,混淆深时用本工具还原)
### LibreOffice(沙箱打开验证,可选)
- Linux: `apt install libreoffice` / `dnf install libreoffice`;macOS: `brew install --cask libreoffice`;Windows: 官方安装包
- 验证: `libreoffice --version`
- 注意: LibreOffice 默认**不执行** VBA 宏(宏安全性限制)——沙箱里要验证宏行为需装真实 Office 或改 LibreOffice 宏安全设置(见 [[gotchas]])
### 7z(OLE/OOXML 解包)
- Linux: `apt install p7zip-full`;macOS: `brew install sevenzip`;Windows: 官方安装包
- 验证: `7z --help`
- 7z 可直接列出 OLE 复合文档内部流(WordDocument/1Table/VBA/PROJECT 等)与 OOXML 包内文件
## 操作步骤
按顺序执行;每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **文档类型识别**:
```sh
file sample.pdf sample.docm sample.rtf
```
- PDF:`%PDF` 头;Office 旧格式:CFB(OLE 复合文档,`D0 CF 11 E0`);OOXML:zip(`PK`);RTF:`{\rtf`
- 类型决定后续工具链;多类型混合(如 PDF 内嵌 OLE)按各分支分别走
2. **PDF 静态分析**:
```sh
pdfid.py sample.pdf # 对象计数,恶意特征速览
pdf-parser -f sample.pdf | head -50 # 对象树遍历(-f 经过 filter 解压流)
pdf-parser -s /JS sample.pdf # JavaScript 动作
pdf-parser -s /OpenAction sample.pdf # 打开即执行动作
pdf-parser -O sample.pdf # 解析对象流(ObjStm)内的对象
```
- 恶意特征:`/JS`(JavaScript 动作)、`/OpenAction`(打开触发)、`/AA`(附加动作,页级/文档级)、`/Launch`(外部程序)、`/EmbeddedFile`(嵌入文件)、`/RichMedia`(Flash 遗留)
- 漏洞文档:`/JBIG2Decode`(JBIG2 漏洞)、`/RichMedia` 等 CVE 对应结构——按结构特征(非版本号)对照已知利用模式
- JS 载荷 → [[re-script-deob]] 还原;结构可疑但对象树不全时先 `qpdf --qdf --object-streams=disable` 展开再看
3. **Office 宏提取**:
```sh
olevba -c sample.docm > macro.txt # 提取宏源码(-c 只输出源码)
olevba --decode -c sample.docm > macro_decoded.txt # 自动解常见字符串混淆(--decode 自 oletools 0.24 起;源码内解码串显示用 --reveal)
olevba --deobf -c sample.docm # 表达式级去混淆(0.46+)
strings sample.docm | grep -iE 'DDEAUTO|http|powershell' | head
```
- 宏链入口:Word `Document_Open` / `AutoOpen` / `AutoExec`;Excel `Workbook_Open` / `Auto_Open`;表单控件/快捷键/自定义按钮触发也不少见
- 其他向量:DDE 域(`DDEAUTO`,较新 Word 默认禁用——旧版仍触发)、外部链接(`/hyperlink`)、OLE 嵌入对象(`oleobj` 提取后逐个分析)、Excel 4.0 XLM 宏表(`xlmdeobfuscator`)
- olevba 输出警告 `VBA stomping` 时注意:实际执行的是 P-code 而非提取出的源码(见坑 2)
- 宏载荷 → [[re-script-deob]] 去混淆链
4. **RTF 分析**:
```sh
rtfobj sample.rtf # 列出嵌入 OLE 对象与 CLSID
```
- RTF 可整篇 `\'XX` 十六进制转义混淆——先还原转义再查关键字
- 嵌入对象(`\objdata`)提取后按 OLE/CFB 分支继续;漏洞文档常见 `\pict` 内嵌数据
5. **模板注入与关系文件(OOXML)**:
```sh
7z l sample.docx | head -40
7z x sample.docx -oext/
grep -r 'TargetMode="External"' ext/word/_rels/ 2>/dev/null
```
- 检查全部 rels 文件:`document.xml.rels` 中 `attachedTemplate` / `externalLink` 外部目标 = 远程模板注入
- 模板注入让文档无宏也有外联行为(远程模板带宏)——解包后逐个 rels 核对
6. **载荷提取**:
- 提取项:脚本/URL/二进制/多级载荷(每层存档编号 + sha256,路径与哈希进 [[re-analyze/analysis-contract]])
- 指标提取 → [[re-ioc]](URL/域名/哈希);提取物初勘 → [[re-triage]]
- 多级链(文档 → 脚本 → 下载器 → 可执行)逐层展开,每层注明触发方式
7. **动态验证**(沙箱):
- [[re-sandbox]] 内用 LibreOffice/阅读器打开,网络隔离(INetSim/fake DNS)
- 观察:文件释放、进程链、网络回连([[re-behavior]] 衔接);延长观察窗口、模拟用户交互对抗延迟执行(见坑 6)
- 宏执行验证优先用真实 Office(LibreOffice 默认不执行 VBA,见工具准备)
## 跨域联合
- [[re-malware]] 网关:本技能归属(选择树「钓鱼附件」分支)
- [[re-script-deob]]:宏/JS 去混淆还原
- [[re-sandbox]]:动态打开强制前置
- [[re-ioc]]:提取指标
- [[re-behavior]]:行为验证衔接
- [[re-triage]]:哈希/初勘与载荷提取存证
## 常见坑与陷阱
- **PDF 对象流压缩未解**:现象——pdf-parser 输出无 `/JS`;原因——对象在 FlateDecode 压缩流或 ObjStm 内;对策——`-f` 强制解压、`-O` 展开对象流再查
- **VBA stomping(执行与源码不一致)**:现象——olevba 提取的源码看起来无害/乱码,但动态行为异常;原因——Office 执行编译后的 P-code,源码只是存档(可被替换/截断);对策——olevba 警告时以动态行为为准,必要时 pcodedmp 反汇编 P-code 对照
- **宏被混淆**:现象——olevba 提取后满屏拼接/编码;原因——宏混淆;对策——`--decode`/`--reveal`/`--deobf` 逐层解,[[re-script-deob]] 去混淆链
- **文档漏洞版本特征**:现象——结构特征与已知 CVE 不符;原因——利用代码针对特定版本;对策——按结构特征(非版本号)对照利用模式,标注版本假设
- **MOTW 拦宏(沙箱执行失败)**:现象——沙箱里打开文档宏不触发;原因——下载文件带 Mark-of-the-Web(Zone.Identifier),Office 2016+ 默认拦截其宏;对策——Windows 侧 `Unblock-File`(PowerShell)或删 Zone.Identifier ADS 后再开;检测型文档见坑 6
- **沙箱检测文档(延迟执行)**:现象——沙箱内无行为;原因——文档检测环境后不触发或推迟触发;对策——延长观察窗口、模拟用户交互(滚动/点击/Office 版本核对)
- **模板注入易漏**:现象——宏正常但仍有外联;原因——`/word/_rels` 远程模板;对策——解包后检查全部 rels 文件(步骤 5)
- 工具差异与更多边界(oledump 用法、RTF 反例、LibreOffice 宏设置)见 [[gotchas]] 与 [[decision-tree]]

View File

@@ -0,0 +1,99 @@
# 恶意文档分析决策树与证据分级
## 场景决策树(入口 → 分支)
### 1. 文件类型识别(第一级)
```
拿到文档样本
├─ 头 %PDF → PDF 分支(第 2 节)
├─ 头 D0 CF 11 E0 → CFB/OLE 分支(第 3 节:doc/xls/ppt 旧格式)
├─ 头 PK → OOXML 分支(第 3 节:docx/xlsx/docm/zip 包)
├─ 头 {\rtf → RTF 分支(第 4 节)
└─ 其他 → 真格式伪装?再 file 二次判定;仍不是文档 → 换 [[re-triage]]
```
- 判定依据是**文件头字节**不是扩展名(扩展名可伪造);`file` 输出的 MIME 只作参考
- 多类型混合(PDF 内嵌 OLE 对象、RTF 内嵌 OLE、OOXML 内嵌 PDF)→ 外层分支走完后,提取出的内嵌物回到第一级重新分支
### 2. PDF 分支
```
PDF 样本
├─ /JS 或 /JavaScript 动作 → 提取 JS → [[re-script-deob]] 还原 → 查 shellcode/URL
├─ /OpenAction 或 /AA → 打开即执行 → 同上,并记录触发方式(文档级/页级)
├─ /Launch → 外部程序启动 → 提取 /F 参数与嵌入文件
├─ /EmbeddedFile → 嵌入载荷 → 按文件类型回第一级
├─ /JBIG2Decode /RichMedia 等已知漏洞结构 → 对照利用模式(结构特征,非版本号)
├─ 有对象流(ObjStm)且 -f 后仍无 JS → 用 qpdf 展开对象流/压缩流重查(坑 1)
└─ 全静态无特征 → 沙箱动态打开(见步骤 7),对比渲染前后行为
```
### 3. Office 分支(CFB / OOXML)
```
Office 样本
├─ olevba 提到宏(AutoOpen/Workbook_Open/Document_Open/Auto_Open 等)
│ ├─ 有 VBA stomping 警告 → 以动态行为为准,P-code 反汇编对照
│ ├─ 宏源码混淆 → --decode/--reveal/--deobf 逐层解
│ └─ 宏干净但行为异常 → 查非宏向量(下表)
├─ 无宏
│ ├─ rels 有 TargetMode="External" → 模板注入/外部链接 → 追远程目标(网络侧)
│ ├─ 有 DDEAUTO 域 → 较新 Word 默认禁用;旧版触发 → 记录版本假设
│ ├─ 有 OLE 嵌入对象 → oleobj/rtfobj 提取 → 回第一级
│ ├─ XLM 宏表(.xls) → xlmdeobfuscator 还原
│ └─ 全静态无特征 → 沙箱动态打开
└─ 加密/损坏(olevba 读不出)→ 查是否加密文档(oleid);口令型样本标注"无法提取宏"
```
- 宏入口不止自动宏:表单控件、快捷键、工作簿事件、自定义按钮都能触发——静态看全部 `Sub` 的调用关系
- 宏的最终载荷多为 PowerShell/mshta/regsvr32/rundll32 命令行 → 提取命令后走 [[re-script-deob]] / [[re-evasion]]
### 4. RTF 分支
```
RTF 样本
├─ 含 \objdata → 嵌入 OLE → rtfobj 提取 → 回第一级(多为 Office 漏洞利用或宏文档)
├─ 含 \pict → 图片内嵌数据 → 可疑则提取十六进制再判定
├─ 整篇 \'XX 转义 → 先还原转义(unrtf/文本替换)再查关键字
└─ 纯文本内容 → 钓鱼正文类,转 [[re-ioc]] 提 URL/身份特征
```
### 5. 载荷 → 处置分支
```
提取到的载荷
├─ JS/VBA/PowerShell 脚本 → [[re-script-deob]] 去混淆 → 还原后回到本节
├─ URL/域名 → [[re-netcap]] 抓取(沙箱)或 [[re-triage]] 初勘 → [[re-ioc]]
├─ PE/ELF 二进制 → [[re-triage]] → [[re-malware]] 网关走完整分析
├─ 多层嵌套 → 每层编号存档后递归处理,保留触发链记录
└─ 数据文件(其他格式) → 回第一级重新识别
```
## 证据分级表
结论要能回答"恶意性证据从哪来",按强度分级标注:
| 级别 | 证据形态 | 示例 | 用途 |
|---|---|---|---|
| A 强 | 动态行为 + 网络侧闭合 | 沙箱内释放/回连 URL,网络侧抓到相同 URL | 可下"恶意"结论 |
| B 中 | 载荷提取链闭合 | 宏还原出 PowerShell 下载命令,URL 可访问 | 可下"可疑/高度可疑" |
| C 弱 | 静态特征 | 只有 /JS + /OpenAction、宏存在、未知 CLSID | 只支持"需进一步分析",不下结论 |
| 反证 | 良性解释 | 宏仅为自动化办公、对象为正常嵌入 | 记录并存档,避免误报 |
- 每个结论至少对应一级证据;跨级结论(C 级特征下"恶意"结论)视为无证据支撑
- 存档时注明:工具版本(olevba 版本影响 XLM/stomping 检测能力)、文件哈希、提取链每层哈希([[re-analyze/analysis-contract]])
## 实现教训(内化)
- 先类型后特征:分支判断全部基于头字节,扩展名只当提示;类型判错整个工具链就错
- 特征定位按"动作"而非"对象":/JS 要配合 /OpenAction /AA 才构成执行链——单看对象存在不够,要看触发关系
- 静态怀疑、动态确认:任何静态特征结论都在沙箱里用行为对照一遍;VBA stomping 场景下静态源码可能完全不可信
- 每层载荷立即存档(编号 + sha256),不要等分析完再补——多层链极易在还原过程中丢失中间层
- 版本记录:Office/阅读器/工具版本影响触发行为(MOTW、DDE 默认值、宏安全)——报告里注明环境版本
- 证据链与触发方式(打开触发/交互触发/延迟触发)一起记录,动态复现才能对齐
## 使用注意
- 全部在沙箱内执行([[re-sandbox]],[[re-analyze/platform-tips]] 最高原则);动态打开 = 真实执行未知代码
- 文档类样本分析只针对授权范围内的分析任务;提取出的载荷按 [[re-malware]] 流程继续,不在此技能内处置

View File

@@ -0,0 +1,35 @@
# 恶意文档分析方法论坑与边界
## PDF 结构组
- **对象流(ObjStm)藏对象**:对象可整体放进对象流内,`pdf-parser` 默认不展开——只按 `/JS` 全局搜会漏;`-O` 解析 ObjStm、`-f` 过 filter 后再查(SKILL.md 坑 1)
- **filter 链不只 FlateDecode**:`-f` 只处理 FlateDecode/ASCIIHex/ASCII85/LZW/RunLength 五种;遇到 `CryptFilter`(加密流)或自定义 filter 解不出是正常的,不是工具坏了——qpdf 对损坏/畸形 PDF 也会直接报错,需容忍坏 xref 表(可试 `--ignore-xref-streams`)
- **xref 损坏不等于假 PDF**:恶意 PDF 常带损坏/增量更新 xref 以干扰解析器——`pdf-parser -v` 显示 malformed 元素时逐条记录,别当分析失败
- **无恶意特征也有行为**:渲染引擎漏洞(阅读器 CVE)与结构特征无关——结构全干净仍要在沙箱动态打开,反例:只有字体/渲染路径的利用文档静态零特征
- **`pdfid` 计数是提示不是结论**:/JS 计数 0 但文件确实有 JS 的情况存在(对象流 + filter 组合)——计数只能做初筛
## Office 宏组
- **VBA stomping:源码 ≠ 执行码**:Office 执行编译后 P-code;攻击者可把源码流替换成无害文本,olevba 提取出"干净"源码但实际跑的是另一份代码——olevba 有警告就默认源码不可信,以动态行为为准
- **MOTW 是执行开关**:从互联网下载的文档带 Zone.Identifier(MOTW),Office 2016+ 默认禁止其宏/ActiveX——沙箱里"打开没反应"先查 MOTW 与 Protected View,别急着下"良性"结论;反过来,**分析者自己的样本若被 Unblock-File 处理过,要记录这一改动**(改变了样本原始执行语义)
- **DDE 不是默认向量**:2017 年后 Word 默认禁用 DDE 自动更新——老文档/老版本的 DDEAUTO 才触发;静态检出 DDEAUTO 需标注版本假设,动态触发不了不代表样本无害
- **宏入口不止 AutoOpen 系**:表单控件、按钮、工作表事件、快捷键触发宏的文档,静态只看自动宏会漏——遍历全部 `Sub`/`Function` 引用
- **XLM 与 VBA 并存**:老 .xls 可同时含 Excel 4.0 宏表与 VBA——只提 VBA 会漏 XLM 载荷;olevba 0.54+ 支持 XLM 识别,混淆深的 XLM 用 xlmdeobfuscator
- **加密文档读不出是常态**:olevba 对加密 OOXML/CFB 无解——用 oleid 确认加密后再决定(口令提取不在本文档技能范围,走 [[re-crypto-keys]] 思路或诚实报告)
## RTF 与嵌入对象组
- **RTF 转义是混淆重灾区**:`\'XX` 逐字符十六进制转义可把整个文档变成不可读串——先还原再分析;`\*\` 目的性标记(星号=未知控制字)也可能夹带恶意数据
- **\objdata 里不只是 OLE**:嵌入对象的内容可以是被截断/改头的数据——提取后按头字节重新识别,不要默认"objdata = OLE"
- **CLSID 已知好 ≠ 对象无害**:rtfobj 显示已注册的正常 CLSID,但对象内部数据仍可被利用(如公式编辑器类组件历史漏洞)——CLSID 只作筛选线索,不作结论
## 环境与沙箱组
- **LibreOffice 默认不执行 VBA**:宏安全设置默认禁用——用 LibreOffice 动态验证"宏行为"会得到错误的空结果;要么装真实 Office,要么显式改宏安全设置并记录
- **延迟/环境检测型样本**:沙箱里静默 30-60 秒后才有行为(检测进程名/网络/交互)——观察窗口至少覆盖 2 分钟,并模拟滚动/点击/输入;反例:检测到无交互即退出的样本,UI 自动化能触发
- **网络隔离要双向**:INetSim/fake DNS 能拦外联,但样本也可能通过 DNS 隧道/隐蔽通道——抓包日志留证([[re-netcap]]),别只开拦截不开记录
## 使用注意
- 沙箱执行是前置条件([[re-sandbox]],[[re-analyze/platform-tips]] 最高原则),未隔离环境不打开文档样本
- 所有结论按 [[decision-tree]] 证据分级标注强度;工具版本(oletools/libreoffice 版本)记录进分析日志