你打开了一个 PDF。看起来就是一份普通报表。
但你可能不知道——它正在偷偷把你的 NTLM 密码哈希发给远程服务器。或者向你的内网发了个 SSRF 请求。或者执行了一段 JavaScript,把你整个 PDF 阅读器的内容提交到了某个 URL。
GitHub 上刚火了一个开源工具:Malicious PDF Generator。名字很直白——恶意 PDF 生成器。作者 jonaslejon 是个安全研究员,做这个工具的原因也很实在:他需要一个能批量生成各类恶意 PDF 的工具来测 PDF 查看器、转换器和 Web 应用程序中的各类情况。当前市面上没有好用的,于是自己写了一个。
重点:一个 PDF 可以藏 67 种不同的攻击向量——从窃取凭据到内网探测,你能想到的和想不到的,这个工具全覆盖。
一个 PDF,能做什么坏事?
先说几个你大概率没想到的:
偷你的 NTLM 密码。在 PDF 里嵌入一个 UNC 路径(比如\\attacker-server\share\file),当 PDF 阅读器尝试访问这个路径时,Windows 会自动发送当前用户的 NTLM 哈希过去。不需要漏洞,不需要点击,打开 PDF 就行。
对内网发请求。PDF 支持外链图片和外部资源加载。在 PDF 的 XObject 里引用一个远程 URL,PDF 阅读器渲染页面时就会自动请求。如果这个请求指向的是内网地址(`http://192.168.1.1/admin`),就是一个完美的 SSRF。
偷走 PDF 的全部内容。/SubmitForm配合特定 Flag,能直接把整份 PDF 文件 POST 到外部服务器。你在看一份合同?攻击者拿到的是合同全文。(这里你可能觉得很怪,它看当前恶意的PDF怎么把其他PDF的文件post到外部服务器呢?建议先看文章,然后查看github就懂了~)
在 PDF.js 里执行任意 JS。CVE-2024-4367,一个字体解析漏洞,通过 Type1 字体的 FontMatrix 字段注入 JavaScript。Firefox 的 PDF.js 在版本 126 之前全部中招。不需要你打开什么奇怪的附件——在浏览器里预览 PDF 就够了。
这些只是冰山一角。Malicious PDF Generator 覆盖了 67+个测试用例,从 Adobe Acrobat 的 JS API 到 Foxit Reader 的专有回调,从 LibreOffice 的环境变量泄露到 ImageMagick 的 shell 注入。
你以为的安全边界,在 PDF 格式面前基本等于不存在。
三行命令,全部跑起来
这个工具用 Python 写的,依赖极简。配 Burp Collaborator 或者 Interact.sh 就能看到所有回调。
先装依赖:
pip install -r requirements.txt然后一行命令生成全部 67 个测试 PDF:
python3 malicious-pdf.py https://your-burp-collaborator-url生成的 PDF 全部放在output/目录下,从test1.pdf排到test67.pdf。
拿去测你的 PDF 上传接口、文档转换服务、或者 PDF 阅读器。哪个文件触发了回调,你就知道哪个攻击向量能用。
如果你的目标有 WAF 或者静态扫描,加一个混淆参数:
python3 malicious-pdf.py https://your-url --obfuscate 2混淆分 4 级:1 级做 hex 编码,2 级加 JS 括号记法和大小写混淆,3 级上 FlateDecode 流压缩,4 级直接把 JS payload 套进 base64 解码器——源码里的危险 API 名一个字面量都不留。
重点:Level 4 混淆能绕过大多少基于正则
/JS的静态扫描器,因为 payload 里根本没有app.launchURL这样的字面字符串。
(PS:Python 环境安装本文就不讲了哈,实在不行您问问豆包呢。)
哪些测试用例最值得关注?
67 个文件太多了。挑几个最"亮眼"的说:
凭证窃取类:test34_1到test34_9,覆盖了 9 种不同的 UNC 路径注入方式——图片流、远程跳转、线程引用、URI 动作、JS 表单提交……每一种都能偷 NTLM 哈希。
数据外泄类:test21用/SubmitForm把整份 PDF 内容 POST 出去,test25用getPageNthWord()逐词读取渲染后的文本再发送。
服务端攻击类:test36和test37在 PDF 元数据和 XFA 表单里嵌入 XXE,专打 PDFBox 和 iText 这些 Java PDF 库。test42的 OOB 参数实体 XXE 针对 Tika、Confluence、Jira。
隐蔽回调类:test30不用任何 JS 或 Action,只在图片流的 XObject 里引用外部 URL——页面渲染时静默回调,传统扫描器根本不会标记。
JS 执行链:test33_1到test33_15,覆盖了 Acrobat JS API 的 15 种回调方式和 PDF.js 的 4 种 Web API。最狠的是test33_14,util.readFileIntoStream()读本地文件+SOAP.request()外传——完整的数据窃取链路。
每个文件都标注了对应的 CVE 编号或研究来源,方便写报告的时候引用。
这是一个专业工具。建议大家仅用于技术研究~不要做违法的事情。
说到底,这个工具的价值不在于它"能做坏事",而在于它提醒你——你每天不经思考就打开的那些 PDF,可能远比你想象的危险。
这大概就是开源安全工具的独特魅力:坏人本来就会这些手法,但好人能批量测试了,防守方才可能堵上这些洞。
参考链接:Malicious PDF Generator GitHub https://github.com/jonaslejon/malicious-pdf
点赞·转发·在看——欢迎在评论区聊聊你见过的 PDF 攻击手法!
— 完 —
夜雨聆风