Anthropic-Cybersecurity-Skills:peepdf / pdfid / pdf-parser 恶意 PDF 静态分析完全参考
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
本文围绕 Anthropic-Cybersecurity-Skills 仓库中 malware-analysis 子域的 peepdf 技能 展开,完整覆盖 peepdf、pdfid.py、pdf-parser.py 三大工具的安装、命令行参数、交互式命令、可疑关键字分级、历史 CVE 与 shellcode 检测模式等 API 级参考内容,并结合仓库自带的自动化分析脚本 agent.py 的源码,讲清风险评分算法与报告生成链路。读完后,你既能手工完成一次武器化 PDF 的取证分析,也能直接用该技能的脚本对样本批量产出结构化风险报告。
该技能位于仓库的 817 个结构化安全技能之一,遵循 agentskills.io 开放标准,以SKILL.md的 frontmatter 声明了适用场景与框架映射:MITRE ATT&CK 的 T1204.002(恶意文件:恶意文档)、T1059.007(命令和脚本解释器:JavaScript)、T1027(混淆文件或信息)、T1106(原生 API),以及 NIST CSF 2.0 的 DE.AE-02、RS.AN-03、ID.RA-01、DE.CM-01 子类目,声明见 SKILL.md frontmatter。本文的 API 参考主体即同目录下的 references/api-reference.md。
适用场景与前置条件
按 SKILL.md 的 "When to Use" 定义,本技能适用于:
- 分诊(triage)来自钓鱼邮件的可疑 PDF 附件;
- 对 PDF 型漏洞利用文档(exploit document)做恶意软件分析;
- 从 PDF 中提取内嵌 JavaScript、shellcode 或可执行文件;
- 对武器化文档工件做取证审查;
- 为 PDF 型威胁构建检测签名(YARA、Sigma 等)。
前置条件(SKILL.md "Prerequisites" 一节):
- Python 3.8+,已安装
peepdf-3; - Didier Stevens 工具套件中的
pdfid.py与pdf-parser.py; - 隔离分析环境(虚拟机或沙箱)——PDF 是恶意文档的主要投递载体,切勿在宿主机直接打开样本;
- 可选:PyV8,用于 peepdf 内嵌 JavaScript 仿真(emulation);
- 可选:Pylibemu,用于 shellcode 行为分析。
peepdf 安装
peepdf最初为 Python 2 编写,Python 3 环境应使用社区维护的 Python 3 版本peepdf-3(对应关系见 references/api-reference.md 的 "peepdf Installation" 一节):
# Python 3 版本 pip install peepdf-3 # 从源码安装:从 peepdf 官方仓库获取源码后 cd peepdf && pip install -r requirements.txt从 agent.py 的实现可以看到,仓库的自动化流程对两种调用方式都做了兼容:优先尝试直接执行peepdf -f -l <file>,若返回非零状态则回退到python3 -m peepdf -f -l <file>。这种"命令优先、模块回退"的策略在run_pdfid(pdfid.pyvspython3 -m pdfid,L36-L42)中同样存在,适配不同安装方式下的 PATH 差异。
peepdf 命令行用法
参考文档给出的四种基本调用方式,覆盖批量分诊、交互式取证、脚本化批量执行与机器可读输出:
# 基本分析(宽松解析模式 -l,强制解析 -f) peepdf -f -l malicious.pdf # 交互模式 peepdf -i malicious.pdf # 批量执行脚本中的命令 peepdf -s commands.txt malicious.pdf # JSON 输出 peepdf -j malicious.pdf其中-f(force parsing)与-l(loose mode)组合是恶意样本分析的标准姿势:武器化 PDF 经常故意构造畸形对象树或损坏的对象引用,正常模式会直接解析失败,宽松+强制模式则能在最大程度上把对象都拉出来。agent.py 的run_peepdf_analysis正是固定使用peepdf -f -l获取文本输出,再用正则从中提取结构化信息:
- 对象总数:匹配同时含
Version与Objects的行,取最后一个数字; - JS 对象:对含
/JS或/JavaScript的行用(\d+)提取对象 ID 列表; - CVE 引用:
CVE-\d{4}-\d{4,}模式提取,用于关联已知漏洞; - URL:
https?://[^\s"<>]+提取外联地址,进入 IOC 集合。
peepdf 交互命令速查
进入交互模式(peepdf -i)后,参考文档列出的核心命令如下表。这套命令构成了"从对象树定位到字节偏移"的完整取证路径:
| 命令 | 说明 |
|---|---|
info | 显示文档摘要与可疑元素 |
tree | 展示对象树结构 |
object <id> | 显示对象的原始内容 |
stream <id> | 解码并显示流内容(自动应用 /Filter 解码) |
rawstream <id> | 显示原始(未解码)流 |
js_analyse <id> | 分析对象中的 JavaScript |
js_eval <id> | 仿真执行 JavaScript(需要 PyV8) |
vtcheck | 在 VirusTotal 上查询文件哈希 |
extract uri | 提取文档中所有 URI |
search <string> | 跨对象搜索字符串 |
offsets <id> | 显示对象在文件中的字节偏移 |
metadata | 显示文档元数据 |
实操路径通常是:tree找到疑似对象 →object <id>看结构 →stream <id>与rawstream <id>对比"解码前/解码后"以识别 FlateDecode、ASCIIHexDecode 等隐藏层 →js_analyse <id>静态检查 JS → 需要动态行为时再用js_eval <id>(注意:仿真执行应在沙箱内进行)。offsets <id>给出的字节偏移还可以与 agent.py 中compute_hashes计算的文件哈希一起写入报告,作为"证据位置"锚点。
pdfid.py:关键字快速分诊
pdfid.py是恶意 PDF 分诊的第一道关卡,只做纯文本级关键字计数,不解析、不触发任何 PDF 行为:
# 基本扫描 pdfid.py malicious.pdf # 附加"解除武装"指标(-e,扩展关键字集) pdfid.py -e malicious.pdf # 递归扫描目录 pdfid.py -r /samples/参考文档给出的可疑关键字分级表:
| 关键字 | 风险 | 含义 |
|---|---|---|
/JS | High | JavaScript 对象引用 |
/JavaScript | High | JavaScript 动作 |
/OpenAction | High | 打开文档时自动执行 |
/AA | High | 附加动作触发器(Additional Actions) |
/Launch | Critical | 启动外部应用程序 |
/EmbeddedFile | High | 内嵌文件(常见 dropper 载体) |
/XFA | High | XML Forms Architecture(漏洞利用面) |
/JBIG2Decode | Medium | JBIG2 图像解码器(CVE-2009-0658) |
/AcroForm | Medium | 交互表单(潜在利用点) |
/ObjStm | Low | 对象流(可用于隐藏对象) |
/URI | Low | 外部 URL 引用 |
这些关键字与 PDF 恶意利用的经典机制一一对应:/OpenAction//AA提供"打开即触发"的执行入口,/JS+/JavaScript提供脚本层,/Launch直接跳出 PDF 沙箱,/EmbeddedFile携带落盘载荷,/ObjStm则常被用来把对象藏进压缩流里规避简单扫描。
agent.py 在 pdfid 基础表之外扩展了一个 16 项关键字清单,额外纳入了/RichMedia、/SubmitForm、/ImportData、/Names四个指标——它们对应富媒体嵌入、表单外发、XFA 数据导入和名称树(常用于隐藏自定义对象)等利用路径。其中 6 个被标记为高风险(HIGH_RISK_KEYWORDS):/JS、/JavaScript、/OpenAction、/Launch、/EmbeddedFile、/XFA。run_pdfid函数通过line.rsplit(None, 1)解析 pdfid 输出每行的"关键字 计数"对,汇总成{keyword: count}字典供后续评分使用。
pdf-parser.py:对象级深度解析
pdf-parser.py用于绕过交互式界面、直接按对象 ID 取数,适合脚本化取证:
# 文档统计 pdf-parser.py --stats malicious.pdf # 提取指定对象 pdf-parser.py -o 10 malicious.pdf # 提取并解码过滤器 pdf-parser.py -o 10 -f malicious.pdf # 将解码后的流转储到文件 pdf-parser.py -o 10 -f -d extracted.bin malicious.pdf # 关键字搜索 pdf-parser.py --search "/JavaScript" malicious.pdf # 按类型搜索 pdf-parser.py --type "/Action" malicious.pdf-f(decode filters)会对流应用 /Filter 声明的解码,-d <file>把解码结果落盘供后续分析(丢进反汇编器、YARA 扫描或 CyberChef 二次解码)。SKILL.md 的工具对照表还列出了 VirusTotal(哈希交叉核验)与 CyberChef(解码变换)作为配套工具。
一个实用的组合拳是:--type "/Action"列出全部动作对象,确认哪些动作挂在/OpenAction上;再用-o <id> -f -d payload.bin导出流内容;最后对导出文件跑 YARA 或哈希核验。
PDF 漏洞利用中的常见 CVE
参考文档维护了一份 PDF 利用史的高频 CVE 对照表,用于在看到对应组件时快速判断利用年代与攻击面:
| CVE | 组件 | 描述 |
|---|---|---|
| CVE-2009-0658 | JBIG2 | JBIG2 解码器缓冲区溢出 |
| CVE-2009-4324 | Doc.media | 通过 newplayer 的释放后使用(UAF) |
| CVE-2010-0188 | LibTIFF | TIFF 图像处理溢出 |
| CVE-2013-0640 | XFA | XFA 内存破坏 |
| CVE-2017-11882 | Equation Editor | 公式编辑器栈溢出 |
从 agent.py 的实现看,脚本会把 peepdf 输出中匹配到的CVE-YYYY-NNNN形式编号自动收集进vulns列表,既写入报告的cve_references,也直接计入 IOC 的cves字段——当样本对象结构与上述某类组件吻合(如存在/JBIG2Decode过滤器)时,CVE 关联可显著缩短研判时间。
Shellcode 与混淆 JavaScript 检测模式
参考文档给出的模式速查表:
| 模式 | 指示意义 |
|---|---|
%u9090%u9090 | NOP sled(Unicode 形式) |
\x90\x90\x90 | NOP sled(hex 形式) |
unescape() | shellcode 解码(unescape 链) |
String.fromCharCode | 字符码拼装 |
eval() | 动态代码执行 |
new ActiveXObject | COM 对象实例化 |
spray变量名 | 堆喷射(heap spray)技术 |
仓库的 agent.py 中detect_shellcode_patterns将上述启发式落实为 7 组精确正则,并给出了比速查表更严格的匹配阈值:
| 检测项 | 正则 | 说明 |
|---|---|---|
heap_spray | (%u[0-9a-fA-F]{4}){4,} | 连续 4 个及以上 Unicode 转义(堆喷射特征) |
nop_sled | (\\x90){8,}\|(%u9090){4,} | 连续 8 个以上\x90或 4 组以上%u9090 |
unescape_chain | unescape\s*\( | unescape 解码链 |
shellcode_var | shellcode\|payload\|sc\s*=\s*["'] | shellcode/payload 变量赋值 |
fromcharcode | String\.fromCharCode | 字符码拼装 |
eval_call | eval\s*\( | eval 调用 |
activex | new\s+ActiveXObject | COM 实例化 |
从源码结构看,脚本对 NOP sled 采用"长度阈值"(8 个 hex 字节或 4 组 Unicode)而非参考表中的裸字符串匹配,可有效降低正常 PDF 中零星0x90字节的误报。检测对象是extract_javascript函数(L105-L117)导出的 JS 内容——它依据 peepdf 定位到的 JS 对象 ID,逐个执行pdf-parser.py -o <id> -f -w <file>拉取解码后的流,取前 1000 字符作为内容预览参与模式匹配。
VirusTotal 交叉核验
peepdf 内置的vtcheck命令可用文件哈希在 VirusTotal 上交叉核验(参考文档示例输出):
PPDF> vtcheck MD5: abc123... Detections: 45/72vtcheck属于"外部情报"而非本地证据:高检出率(如示例中的 45/72)可快速确认恶意属性并指导后续分析优先级;低检出则提示可能是新样本,应把分析重心转向行为层(JS 仿真、流解码)。结合 SKILL.md 输出格式 的报告模板,VirusTotal Detections: [X/Y engines]是标准报告字段。
自动化流水线:agent.py 风险评分与报告
skills/analyzing-malicious-pdf-with-peepdf/scripts/agent.py 是把上述全部 API 串成一条无人值守流水线的主脚本,入口main(L182-L215)的执行顺序为:
- 计算 MD5/SHA-256(64KB 分块流式读取,见 L25-L33);
- 运行 pdfid 分诊,得到关键字计数;
- 运行
peepdf -f -l深度分析,得到对象数、JS 对象、CVE 引用、URL; - 若发现 JS 对象(或显式指定
--extract-js),导出 JS 内容并做 shellcode 模式检测; - 汇总风险评分,生成 JSON 报告并落盘(默认
pdf_analysis_report.json)。
风险评分算法
calculate_risk_score(L139-L152)采用加权求和、封顶 100 分:
| 因子 | 权重 |
|---|---|
| 高风险关键字命中 | 每个计数 × 20 |
| 其他可疑关键字命中 | 每个计数 × 5 |
| peepdf 输出的 CVE 引用 | 每条 × 30 |
| 识别出的 JS 对象 | 每个 × 15 |
| shellcode/混淆模式命中 | 每次 × 10 |
风险等级阈值:score >= 80为 critical,>= 50为 high,>= 20为 medium,其余为 low。例如一个含/Launch(计 1)+/OpenAction(计 1)+ 2 个 JS 对象 + 1 处unescape链的样本,得分为 40 + 30 + 10 = 80,直接判为 critical——这与参考文档将/Launch定为 Critical、/OpenAction定为 High 的分级语义一致。
报告结构
generate_report(L155-L179)输出的 JSON 包含:hashes(md5/sha256)、risk_assessment(分数与等级)、pdfid_keywords(完整计数表)、peepdf_analysis(对象数、JS 对象 ID、CVE 引用、去重后的 URL)、javascript_content(最多 5 个对象的预览)、shellcode_indicators(各模式命中次数)、iocs(sha256、URL、CVE 三元组)。这与 SKILL.md 定义的文本报告骨架(文件名、SHA-256、可疑关键字、JS 对象、URL、shellcode 判定、内嵌文件、VT 检出、风险等级)在字段上一一对应,可直接转换为 IR 通报格式。
使用方式:
# 基本分析(自动哈希 + pdfid + peepdf + 风险评分) python3 skills/analyzing-malicious-pdf-with-peepdf/scripts/agent.py malicious.pdf # 显式提取 JS 对象内容并输出到指定文件 python3 skills/analyzing-malicious-pdf-with-peepdf/scripts/agent.py malicious.pdf \ --extract-js --output report.json端到端工作流与输出模板
综合 SKILL.md 的七步工作流,一次完整的恶意 PDF 静态分析应按以下顺序执行:
- pdfid 分诊:扫描
/JS、/JavaScript、/OpenAction、/Launch、/EmbeddedFile等关键字,快速定性; - peepdf 交互分析:
peepdf -i探索对象结构,tree+object定位可疑对象; - 识别可疑对象:锁定含 JavaScript、流或编码数据的对象 ID;
- 提取内容:
pdf-parser.py -o <id> -f -d导出并解码流(FlateDecode、ASCIIHexDecode 等); - JavaScript 去混淆:对提取的 JS 检查 shellcode、堆喷射与利用代码(对照前文模式表与 agent.py 正则);
- VirusTotal 核验:
vtcheck交叉比对哈希; - 生成 IOC:汇总 URL、域名、哈希与 shellcode 签名。
分析完成后按 SKILL.md 的 "Output Format" 模板产出报告:
Analysis Report: PDF-MAL-[DATE]-[SEQ] File: [filename.pdf] SHA-256: [hash] Suspicious Keywords: [/JS, /OpenAction, etc.] Objects with JavaScript: [Object IDs] Extracted URLs: [List] Shellcode Detected: [Yes/No] Embedded Files: [Count and types] VirusTotal Detections: [X/Y engines] Risk Level: [Critical/High/Medium/Low]关键概念与合规边界
SKILL.md 的 "Key Concepts" 表给出了理解上述 API 输出所需的最小概念集:/OpenAction(打开时自动执行的动作)、/JavaScript//JS(内嵌脚本对象)、/Launch(启动外部程序)、/EmbeddedFile(PDF 内嵌文件)、FlateDecode(zlib 压缩过滤器,用于隐藏内容)、Object Streams(压缩流中存储的对象)。
最后强调安全边界:仓库 README 明确要求本库中的分析技术仅用于授权测试、防御与研究场景;PDF 样本的每一步交互分析(尤其是js_eval仿真、-d导出执行)都应在隔离虚拟机或沙箱中完成,分析产物(IOC、报告)按 SKILL.md 模板归档后即可进入威胁狩猎与检测规则建设环节(对应 MITRE ATT&CK T1204.002/T1059.007 的检测覆盖)。
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考