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安全, 蓝队分析, 逆向工具