jonaslejon/malicious-pdf
GitHub: jonaslejon/malicious-pdf
一个用于生成多种恶意 PDF 测试文件的 Python 工具,覆盖多类注入与数据外泄场景。
Stars: 3661 | Forks: 459

[](https://www.python.org/) [](https://www.bestpractices.dev/projects/9599)
# 恶意 PDF 生成器 ☠️
生成 67 个恶意 PDF 测试文件,用于在 PDF 查看器、转换器及 Web 应用程序中测试电话回拨、SSRF、XSS、XXE、NTLM 凭证窃取和数据外泄。可与 [Burp Collaborator](https://portswigger.net/burp/documentation/collaborator) 或 [Interact.sh](https://github.com/projectdiscovery/interactsh) 配合使用。
适用于渗透测试、漏洞赏金狩猎和/或红队行动等。我创建此工具是因为需要一个能够生成包含各种链接的 PDF 文件的工具。仅限教育和职业用途。
## 用法
```
pip install -r requirements.txt
python3 malicious-pdf.py burp-collaborator-url
```
输出将写入 `output/` 目录,文件名为:test1.pdf、test2.pdf、test3.pdf 等。
### 选项
```
--output-dir DIR Directory to save generated PDF files (default: output/)
--no-credit Do not embed credit/attribution metadata in generated PDFs
--obfuscate LEVEL Obfuscation level (0-3):
0 = None (default)
1 = PDF name hex encoding + string octal/hex encoding
2 = Level 1 + JS bracket notation + javascript: URI case/whitespace obfuscation
3 = Level 2 + FlateDecode stream compression
```
带混淆的示例:
```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 2
```
最大混淆(Level 4 将 JS 载荷包装在 Base64 解码器中,使原始 API 调用永不以字面子字符串形式出现):
```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 4
```
## 用途
- 测试接受 PDF 文件的网页/服务
- 测试安全产品
- 测试 PDF 阅读器
- 测试 PDF 转换器
- 测试服务器端 PDF 处理库(如 PDFBox、iText 等)
- 测试 PDF 静态分析工具 — 分阶段 JS 载荷(表单字段 `/V`、Base64 解码器)可绕过简单的 `/JS` 正则扫描
- 漏洞赏金狩猎 — 在文件上传端点、PDF 转图像转换器及文档处理流水线中查找 SSRF、XXE、盲回拨和 NTLM 泄露(适用于接受 PDF 输入的程序)
## 致谢
- [PDF 中的不安全特性](https://web-in-security.blogspot.com/2021/01/insecure-features-in-pdfs.html)
- [Burp Suite UploadScanner](https://github.com/modzero/mod0BurpUploadScanner/)
- [Bad-Pdf](https://github.com/deepzec/Bad-Pdf)
- [PDF 文档的恶意探索](https://www.scitepress.org/Papers/2020/89923/89923.pdf)
- ["Portable Document Flaws 101" Black Hat USA 2020 演讲](https://github.com/RUB-NDS/PDF101)
- [Adobe Reader — 通过 XFA 样式表的 PDF 回调](https://insert-script.blogspot.com/2019/01/adobe-reader-pdf-callback-via-xslt.html)
- [Foxit PDF 阅读器 PoC,DoHyun Lee](https://twitter.com/l33d0hyun/status/1448342241647366152)
- [Eicar 测试文件,Stas Yakobov](https://github.com/fire1ce/eicar-standard-antivirus-test-files)
- [多种 PDF 漏洞 — FormCalc 与 XXE](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
- [PDF — 玩弄 Web:FormCalc 头部注入](https://insert-script.blogspot.com/2015/05/pdf-mess-with-web.html)
- [Adobe Reader PDF — 客户端请求注入](https://insert-script.blogspot.com/2018/05/adobe-reader-pdf-client-side-request.html)
- [ImageMagick — 通过 PDF 密码的 Shell 注入](https://insert-script.blogspot.com/2020/11/imagemagick-shell-injection-via-pdf.html)
- [便携式数据外泄 — PortSwigger Research](https://portswigger.net/research/portable-data-exfiltration)
- [CVE-2024-4367 — PDF.js 中的任意 JS 执行](https://codeanlabs.com/2024/05/cve-2024-4367-arbitrary-js-execution-in-pdf-js/)
- [PDF 文件格式安全 — Philippe Lagadec](https://www.decalage.info/hugo/file_formats_security/pdf/)
- [CVE-2016-2175 — Apache PDFBox XXE](https://nvd.nist.gov/vuln/detail/CVE-2016-2175)
- [CVE-2017-9096 — iText XXE](https://nvd.nist.gov/vuln/detail/CVE-2017-9096)
- [CVE-2020-29075 — Acrobat Reader 静默 DNS 追踪](https://nvd.nist.gov/vuln/detail/CVE-2020-29075)
- [CVE-2022-28244 — Acrobat Reader CSP 绕过](https://nvd.nist.gov/vuln/detail/CVE-2022-28244)
- [CVE-2018-5158 — Firefox PDF.js PostScript 计算器注入](https://nvd.nist.gov/vuln/detail/CVE-2018-5158)
- [CVE-2018-20065 — PDFium 在无用户手势下的 URI 动作](https://nvd.nist.gov/vuln/detail/CVE-2018-20065)
- [ExpMon — Sophisticated Adobe Reader 0-day 分析(2026 年 4 月)](https://justhaifei1.blogspot.com/2026/04/expmon-detected-sophisticated-zero-day-adobe-reader.html) — 启发自 test33_13/14/15 与 Level 4 混淆
## 媒体报道
- [Brisk Infosec](https://www.briskinfosec.com/tooloftheday/toolofthedaydetail/Malicious-PDF)
- [Daily REDTeam](https://www.linkedin.com/posts/daily-red-team_github-jonaslejonmalicious-pdf-generate-activity-7096476604016582656-d9xM/)
- [恶意 PDF 文件 | 红队 | 渗透测试](https://www.youtube.com/watch?v=hf3p_t8CPWs)
- [John Hammond — PDF 文件能成为恶意软件吗?](https://www.youtube.com/watch?v=TP4n8fBl6DA)
- [Black Hat 伦理黑客](https://www.blackhatethicalhacking.com/tools/malicious-pdf/)
- [0x1 渗透测试合集](https://0x1.gitlab.io/pentesting/malicious-pdf/)
- [Security Toolkit / WADComs](https://securitytoolkit.github.io/wadcoms/malicious-pdf/)
- [unsafe.sh](https://unsafe.sh/go-111577.html)
- [Cristi Zot 在 LinkedIn](https://www.linkedin.com/posts/cristivlad_github-jonaslejonmalicious-pdf-generate-activity-7026575045871239169-RKFK)
- [Siva R. 在 LinkedIn](https://al.linkedin.com/posts/siva-rajendran_github-jonaslejonmalicious-pdf-generate-activity-7026634093891059712-PDcl)
## 完整测试矩阵
## 待办事项:新测试用例
- **Acrobat JS 指纹识别 API** — 添加用于侦察/指纹识别 API 的测试用例,这些 API 在 2026 年 4 月 Adobe 0-day 漏洞利用链中被使用([ref](https://x.com/Gi7w0rm/status/2042370775546482815)):`Collab.isDocReadOnly`(文件系统探测)、`app.plugIns`(枚举已安装插件)、`app.viewerVersion`(版本指纹识别)
## 待办事项:尚未实现的混淆方法
- **空密码 PDF 加密** — 使用空用户密码加密所有字符串/流。文档可无提示打开,但静态分析工具无法读取内容。这是当前混淆中最大的缺口。参考:[Didier Stevens](https://blog.didierstevens.com/category/pdf/)、[PDF 加密有多安全?](https://www.decalage.info/hugo/file_formats_security/pdf/)
- **对象流(ObjStm)** — 将 PDF 对象隐藏在压缩流容器中。简单解析器(包括未带 `-O` 标志的 PDFiD)会完全遗漏这些对象。参考:[PDF 规范 ISO 32000 §7.5.7](https://www.iso.org/standard/63534.html)
- **getAnnots() 代码存储** — 将 JavaScript 载荷拆分到注解元数据字段(主题、作者)中,在运行时通过 `app.doc.getAnnots()[n].subject` 和 `eval` 检索。参考:[Julia Wolf - PDF Obfuscation using getAnnots()](https://blog.didierstevens.com/2010/01/14/)
- **信息字典数据提取** — 将编码载荷存储在 `/Info` 预告字段(`/Title`、`/Author`)中,在运行时通过 `info.Title` 在 JS 中检索。参考:[corkami PDF 技巧](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **AcroForm 字段值提取** — 将载荷片段存储在表单字段 `/V` 的值中,通过 JS 的 `getField("name").value` 检索。参考:[corkami PDF 技巧](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **名称树分步执行** — 将 JavaScript 拆分到多个 `/Names` 条目中按顺序执行。参考:[corkami PDF 技巧](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **增量更新(%%EOF 之后)** — 通过增量更新在原始 `%%EOF` 标记后追加新对象/动作。参考:[PDF101 内容掩码](https://github.com/RUB-NDS/PDF101)、[Didier Stevens](https://blog.didierstevens.com/2010/05/18/more-malformed-pdfs/)
- **JS `unescape()` 编码** — 将 JS 载荷包裹在 `eval(unescape("%61%6C%65%72%74..."))` 中。参考:[corkami PDF 技巧](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **伪造文件头** — 在 `%PDF-` 标头前添加 JPEG/HTML/其他魔数(规范允许标头位于前 1024 字节内)。混淆文件类型检测。参考:[corkami](https://github.com/corkami/docs/blob/master/PDF/PDF.md)、[Decalage](https://www.decalage.info/hugo/file_formats_security/pdf/)
- **反模拟检测** — 通过 `event.target.zoomType == "FitPage"` 或全局变量类型检查,在执行载荷前检测真实的 Adobe Reader。参考:[corkami PDF 技巧https://github.com/corkami/docs/blob/master/PDF/PDF.md)
## 不会实现的功能
- ~~CVE-2023-26369 — Adobe Acrobat TTF 字体堆溢出写操作~~ — 需要二进制利用(堆喷洒、ROP 链、Shellcode)。无公开 PoC,无法生成简单的回拨载荷。
- ~~CVE-2021-28550 — Adobe Acrobat 使用后释放~~ — 需要二进制利用链 + 沙箱逃逸(CVE-2021-31199/31201)。无公开 PoC,无法生成简单的回拨载荷。
## 星标历史
[](https://www.star-history.com/#jonaslejon/malicious-pdf&Date)
点击展开全部 70 个测试用例
| 测试文件 | 功能 | CVE/参考 | 攻击向量 | 方法 | 影响 | |----------|------|----------|----------|------|------| | test1.pdf | `create_malpdf()` | CVE-2018-4993 | 外部文件访问 | `/GoToE` 动作配合 UNC 路径 | 通过文件系统实现网络回拨 | | test1_1.pdf | `create_malpdf()` | CVE-2018-4993 | 外部文件访问 | `/GoToE` 动作配合 HTTPS URL | 通过 HTTPS 实现网络回拨 | | test2.pdf | `create_malpdf2()` | XFA 表单提交 | 表单数据外泄 | 带有提交事件的 XDP 表单 | 自动表单提交 | | test3.pdf | `create_malpdf3()` | JavaScript 注入 | 代码执行 | `/OpenAction` 配合 `app.openDoc()` | 外部文档加载 | | test4.pdf | `create_malpdf4()` | CVE-2019-7089 | XSLT 注入 | 带有外部 XSLT 样式表的 XFA | UNC 路径回拨 | | test5.pdf | `create_malpdf5()` | PDF101 研究 | URI 动作 | `/URI` 动作类型 | DNS 预取/HTTP 请求 | | test6.pdf | `create_malpdf6()` | PDF101 研究 | 启动动作 | `/Launch` 配合外部 URL | 外部资源执行 | | test7.pdf | `create_malpdf7()` | PDF101 研究 | 远程 PDF | `/GoToR` 动作 | 远程 PDF 加载 | | test8.pdf | `create_malpdf8()` | PDF101 研究 | 表单提交 | `/SubmitForm` 配合 HTML 标志 | 表单数据提交 | | test9.pdf | `create_malpdf9()` | PDF101 研究 | 数据导入 | `/ImportData` 动作 | 外部数据导入 | | test10.pdf | `create_malpdf10()` | CVE-2017-10951 | JavaScript 执行 | Foxit 的 `this.getURL()` 回拨 | 通过 Foxit Reader 的网络回拨 | | test11.pdf | `create_malpdf11()` | EICAR 测试 | AV 检测 | 嵌入的 EICAR 字符串 | 防病毒测试 | | test12.pdf | `create_malpdf12()` | CVE-2014-8453 | FormCalc 数据外泄 | XFA FormCalc 的 `Post()` 函数 | 同源数据外泄(携带 Cookie) | | test13.pdf | `create_malpdf13()` | 请求注入 | CRLF 头部注入 | XFA 提交的 `textEncoding` CRLF | HTTP 头部操控 | | test14.svg | `create_malpdf1()` | ImageMagick Shell 注入 | 通过 SVG/MSL 的 Shell 注入 | SVG-MSL 伪装 `authenticate` 属性 | 通过 ImageMagick 的远程代码执行 | | test15.pdf | `create_malpdf15()` | PDF 规范 | FormCalc 头部注入 | XFA FormCalc 的 `Post()` 配合自定义头部 | 任意 HTTP 头部注入 | | test16.pdf | `create_malpdf16()` | PDF 规范 | 通过 GoToE 的 JavaScript | `/GoToE` 配合 `javascript:` URI | 通过 `标签:Bug赏金, Burp Collaborator, Interact.sh, NTLM凭证窃取, PDF注入, PDF漏洞, PDF生成器, PDF转换器, Python, SEO, SSRF, Web应用程序, XSS, XXE, 安全测试, 开源安全工具, 恶意PDF, 攻击性安全, 数据展示, 无后门, 测试文件, 漏洞情报, 电话回家回调, 红队, 逆向工具, 逆向工程平台