nayem-m/drupalgeddon2-cli
GitHub: nayem-m/drupalgeddon2-cli
Drupalgeddon2(CVE-2018-7600)漏洞利用 PoC 的 CLI 重写版本,专为授权测试和教育场景设计。
Stars: 0 | Forks: 0
# drupalgeddon2-cli
## 背景 — 我为何构建此工具
Drupal 是 HTB Academy *Attacking Common Applications* 模块中涵盖的“常见应用程序”之一,而 CVE-2018-7600(“Drupalgeddon2”)是针对它的典型的无需认证的 RCE 示例。我不想只是复制粘贴一个一次性的脚本然后就抛之脑后,而是希望真正理解导致该漏洞生效的 Form API 注入原理——因此我从头开始重建了公开的 PoC,以此作为一项学习实践。
被广泛引用的原始脚本是由 Vitalii Rudnykh 编写的 [a2u/CVE-2018-7600](https://github.com/a2u/CVE-2018-7600),它非常适合用于*演示*该漏洞,但它要求你每次运行时都在原处修改 payload。在实验室/CTF 的工作流中——针对不同的目标重复运行,或者希望获得一个可重复的立足点——这会变得非常繁琐。此版本将其转变为了一个正式的 CLI 工具:
- 目标和命令作为参数传递;每次运行无需修改源码
- 自动植入一个小型的 PHP web shell(由存在漏洞的服务器自行写入文件),从而提供稳定、可重复使用的立足点
- 你可以执行单条命令、进入交互式伪 shell,或者仅部署 shell 然后离开
- shell 的文件名和命令参数在每次运行时都是随机的,因此重复运行不会发生冲突,也不会留下一个可预测的 `cmd=` 后门
它被特意限定在一个**早已修复的**已知漏洞(于 2018 年披露)范围内。其目的是理解该技术并生成一个干净、有文档说明的参考实现——而不是开发新型的攻击能力。
## 关于作者身份的说明
本仓库中的代码是在我学习 HTB 模块期间,借助 **AI 助手(Anthropic 的 Claude)** 编写的。我设定了设计目标和需求——CLI 的人性化设计、自动部署 web shell、交互模式、随机化的 shell 名称和参数——并对结果进行了审查和测试。我声明这一点是因为这是诚实之举,也因为这里的价值在于对其原理的理解和工程决策,而不是每一行代码的署名。
## 它的功能
1. 利用 CVE-2018-7600 Form API 注入,在目标上植入一个小型的 PHP web shell。存在漏洞的服务器会自行解码并写入文件,从而避开了注入命令时的引号/转义问题。
2. 允许你通过该 shell 使用 `--cmd` 运行命令,或者使用 `--shell` 进入交互式伪 shell。
3. 在报告成功之前,验证 shell 是否确实已成功部署并执行(它会回显一个随机 token 并对其进行检查)。
## 受影响的版本
CVE-2018-7600 影响:
- **7.58** 之前的 **Drupal 7.x**
- **8.5.1** 之前的 **Drupal 8.x**(也包括 8.3.x < 8.3.9 和 8.4.x < 8.4.6)
此实现针对的是 **Drupal 8** 的 Form API 攻击向量(`user/register` AJAX endpoint)。Drupal 7 可以通过不同的 endpoint/payload 被利用,在此**不**作处理。
已修复的版本(7.58 / 8.5.1 及更高版本)不受影响。
## 环境要求
- Python 3.7+
- [`requests`](https://pypi.org/project/requests/)
```
pip install requests
```
## 用法
```
# 一次性命令
python3 drupalgeddon2.py -u http://target/ -c id
# 交互式伪 shell
python3 drupalgeddon2.py -u http://target/ --shell
# 只需植入 shell,不运行任何内容
python3 drupalgeddon2.py -u http://target/ --deploy-only
# 通过 Burp 路由,忽略代理的自签名证书
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
```
| 标志 | 描述 |
|------|-------------|
| `-u`, `--url` | **(必填)** 目标基础 URL,例如 `http://target/` |
| `-c`, `--cmd` | 在目标上运行的单条命令 |
| `--shell` | 进入交互式伪 shell |
| `--deploy-only` | 仅植入 web shell,不执行任何操作 |
| `--shell-name` | 植入的 shell 的文件名(默认:随机 `.php`) |
| `--param` | shell 的 GET 参数名称(默认:随机 md5) |
| `--proxy` | 代理 URL,例如 `http://127.0.0.1:8080` |
| `-k`, `--insecure` | 禁用 TLS 验证(用于自签名代理证书) |
| `--timeout` | 单次请求超时时间(秒)(默认:15) |
## 工作原理
CVE-2018-7600 是 Drupal **Form API** 中的一处输入过滤失败漏洞。Drupal 将表单表示为嵌套的 *renderable arrays*,并且以 `#` 开头的数组键会被视为特殊的渲染属性,而不是用户数据。补丁(SA-CORE-2018-002)添加了过滤机制,以将这些带有 `#` 前缀的键从用户提供的输入中剔除。
在打补丁之前,未经认证的攻击者可以将渲染属性注入到由 Drupal 的 AJAX handler 处理的表单元素中。提交诸如以下属性:
- `#post_render` — Drupal 在渲染后调用的 callable 列表,以及
- `#markup` — 传递给它们的参数
作用于用户注册表单的 `mail` 元素时,会导致 Drupal 在渲染步骤中调用任意的 PHP 函数(在此例中为 `exec`)并传入攻击者控制的输入——即无需任何身份验证的远程代码执行。
此 PoC 利用这一原语在本地对单行 PHP shell 进行 base64 编码,让服务器将其解码为 webroot 中的文件,然后通过正常的 GET 请求与该文件进行交互。
## 检测与修复
如果你处于此漏洞的防守方:
**修复**
- 升级到 Drupal **7.58 / 8.5.1** 或更高版本(应用 SA-CORE-2018-002)。这是唯一真正的修复方法。
- 如果无法立即打补丁,Drupal 安全团队在漏洞披露时发布了一个缓解补丁——但强烈建议进行升级。
**检测思路**
- 检查发往 form/AJAX endpoint 的 POST 正文,查找 render-array 键:`#post_render`、`#markup`、`#type`、`#lazy_builder` 等。合法的表单提交不包含这些内容。
- 标记发往 `…/user/register?element_parents=…&_wrapper_format=drupal_ajax` 且带有可疑参数的请求。
- 将发往 AJAX 表单 endpoint 的 POST 请求与随后对 webroot 中新建 `.php` 文件的 GET 请求进行关联。
- 监视 Drupal webroot 中意外的文件创建行为,以及短小的单参数 PHP 文件(`system($_GET[...])` shell)。
- 这些行为可以直接编码为 Suricata/Snort 签名,或者用于 web 服务器日志的 Sigma 规则。
## 法律与合规使用声明
此工具发布仅用于**教育**目的以及**经过授权的**安全测试——你自己的实验室环境、HTB/CTF 目标,或者你拥有明确书面许可进行评估的系统。根据英国《1990 年计算机滥用法》、美国《计算机欺诈和滥用法》以及其他地区的类似法律,未经授权访问计算机系统是犯罪行为。你需对自己的使用方式负全责。作者不对滥用行为或造成的任何损害承担责任。
## 许可证
MIT
标签:CISA项目, OpenVAS, PHP, Web安全, 蓝队分析, 逆向工具