一个命令行版本的 Drupalgeddon2 (CVE-2018-7600) 概念验证工具,作为学习练习在完成 Hack The Box Academy Attacking Common Applications 模块时编写。
[!WARNING] 仅限授权的安全测试和教育用途。 在非您拥有的或未经明确书面许可的系统上运行此工具,在大多数司法管辖区属于违法行为。请参阅 法律与负责任使用。
[!NOTE] 实现借助 AI 辅助编写。 请参阅 关于作者身份的说明。
Drupal 是 HTB Academy 的 Attacking Common Applications 模块中涵盖的“常见应用程序”之一,而 CVE-2018-7600(“Drupalgeddon2”)是其典型的未授权 RCE 示例。我没有简单地复制粘贴一次性脚本并继续前进,而是希望真正理解导致该漏洞的 Form API 注入——因此我重新构建了公开的 PoC,将其作为一种学习练习。
广泛引用的原始 PoC a2u/CVE-2018-7600(由 Vitalii Rudnykh 编写)非常适合演示该漏洞,但它要求您每次运行时都直接编辑 payload。在实验室/CTF 工作流程中——针对不同目标重复运行,希望获得可重复的立足点——这会变得繁琐。此版本将其转变为合适的 CLI 工具:
cmd= 后门它特意限定在已知且早已修补的漏洞(于 2018 年披露)范围内。目标是理解技术并提供一个清晰、有文档记录的参考实现——而非新颖的攻击能力。
本仓库中的代码是在我完成 HTB 模块时,借助 AI 辅助(Anthropic 的 Claude) 编写的。我设定了设计目标和需求——CLI 人机工程学、自动部署 webshell、交互模式、随机化 shell 名称和参数——并审查和测试了结果。我公开这一点是因为这是诚实之举,也因为这些代码的价值在于理解和工程决策,而非每一行的作者身份。
--cmd 在该 shell 上运行命令,或通过 --shell 进入交互式伪 shell。CVE-2018-7600 影响:
此实现针对 Drupal 8 的 Form API 向量(user/register AJAX 端点)。Drupal 7 可通过不同的端点/payload 利用,此处未涵盖。
已修补的版本(7.58 / 8.5.1 及更高版本)不受影响。
requestspip 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
CVE-2018-7600 是 Drupal Form API 中的输入净化失败。Drupal 将表单表示为嵌套的可渲染数组,以 # 开头的数组键被视为特殊的渲染属性而非用户数据。补丁(SA-CORE-2018-002)添加了净化措施,以从用户提供的输入中去除这些以 # 为前缀的键。
在补丁之前,未认证的攻击者可以将渲染属性注入到表单元素中,该元素会被 Drupal 的 AJAX 处理器处理。通过提交例如以下属性:
#post_render — Drupal 在渲染后调用的可调用对象列表,以及#markup — 传递给它们的参数针对用户注册表单的 mail 元素,会导致 Drupal 在渲染步骤中调用一个任意的 PHP 函数(此处为 exec),并传入攻击者控制的输入——即实现远程代码执行,无需任何身份验证。
此 PoC 利用该原语在本地 base64 编码一行 PHP shell,让服务器将其解码到 webroot 的文件中,然后通过正常的 GET 请求与该文件交互。
如果您处于防御方:
补救措施
检测思路
#post_render、#markup、#type、#lazy_builder 等。合法的表单提交不包含这些。…/user/register?element_parents=…&_wrapper_format=drupal_ajax 且携带可疑参数的请求。.php 文件的 GET 请求。system($_GET[...]) webshell)。此工具发布用于教育和授权的安全测试——您自己的实验室环境、HTB/CTF 目标,或您拥有明确书面许可进行评估的系统。未经授权访问计算机系统属于犯罪行为,违反英国《1990年计算机滥用法》、美国《计算机欺诈和滥用法》以及其他地区的类似法律。您对使用方式负全部责任。作者对滥用或造成的任何损害不承担任何责任。
MIT
| 标志 | 描述 |
|---|
-u, --url | (必需) 目标基础 URL,例如 http://target/ |
-c, --cmd | 要在目标上运行的单个命令 |
--shell | 进入交互式伪 shell |
--deploy-only | 仅部署 webshell,不运行任何命令 |
--shell-name | 已部署 shell 的文件名(默认:随机 .php) |
--param | shell 的 GET 参数名称(默认:随机 md5) |
--proxy | 代理 URL,例如 http://127.0.0.1:8080 |
-k, --insecure | 禁用 TLS 验证(用于自签名代理证书) |
--timeout | 每个请求的超时时间(秒)(默认:15) |