Het-Kalariya/CVE-2026-20253
GitHub: Het-Kalariya/CVE-2026-20253
基于 Docker Compose 的 Splunk Enterprise CVE-2026-20253 漏洞复现与安全训练靶场,复现了未授权 RCE 的完整利用链路。
Stars: 0 | Forks: 0
# Splunk Enterprise — CVE-2026-20253 训练实验环境
本仓库是一个 Vulhub/DVWA 风格的安全训练实验环境。它构建了一个忠实于 **Splunk Enterprise 10.2.3** 的模型,并重现了 **CVE-2026-2026-20253** 背后记录的行为:内置的 **PostgreSQL 恢复 sidecar** 暴露了带有特权文件写入和 SQL 执行功能的接口,且*没有真正的身份验证*(接受空白或任意的 `Basic` 请求头),同时 Splunk Web 层在登录门禁**之前**就将 `__raw/v1/postgres/*` 请求中继到了该 sidecar。
将这些组合利用,即可实现以非 root 用户 `splunk`(服务账户)身份的**未授权远程代码执行**。
该实验环境完全可以端到端破解:指纹识别边缘服务,通过无需授权的健康检查标识访问内部恢复 API,证明任意文件写入能力,窃取内部 Postgres 凭证,并将 SQL-restore 的文件写入原语转化为针对计划内 modular-input 脚本的代码执行。
## 安全公告
| | |
|---|---|
| **厂商公告** | SVD-2026-0603 |
| **CVE** | CVE-2026-20253 |
| **弱点** | CWE-306 — 关键功能缺失身份验证 |
| **受影响版本** | Splunk Enterprise 10.2.3 |
| **修复版本** | Splunk Enterprise 10.2.4 |
| **CVSS 3.1** | **9.8 (严重)** — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` |
## 架构
```
edge network core network
┌───────────────────┐ ┌───────────────────────────────┐
browser ─▶ proxy :8080 ──▶ web :8001 (SPA)
(nginx edge) └▶ splunkd :8089 ─┬─▶ db :5432 (postgres)
login API + ├─▶ redis :6379 (jobs/cache)
__raw relay ───┼─▶ pg-sidecar :5435 ◀── THE VULN
│ (recovery API, blank Basic)
forwarders ─▶ ingest :8088 (HEC) ─────────┘
scheduler ──▶ runs modular-input script
as `splunk` (uid 1000) — RCE sink
shared volume app_data mounted into
pg-sidecar (write) + scheduler (exec)
```
| 服务 | 镜像 | 监听端口 | 发布端口 | 角色 |
|---|---|---|---|---|
| `proxy` | `splunk/proxy:10.2.3` | 8080 | **8080:8080** | nginx 边缘服务;Splunk Web + `__raw` 中继入口 |
| `web` | `splunk/web:10.2.3` | 8001 | — | Splunk Web 单页应用 (静态) |
| `splunkd` | `splunk/splunkd:10.2.3` | 8089 | — | Splunk 守护进程 / Web 层:登录 API **+** 会话前的 `/{locale}/splunkd/__raw/v1/postgres/*` 中继 |
| `ingest` | `splunk/ingest:10.2.3` | 8088 | **8088:8088** | HTTP Event Collector (token 认证) |
| `pg-sidecar` | `splunk/pg-sidecar:10.2.3` | 5435 | — | **漏洞所在** — PostgreSQL 恢复 sidecar (`/v1/postgres/*`) |
| `scheduler` | `splunk/scheduler:10.2.3` | — | — | **以 `splunk` 用户身份**运行计划内的 modular-input 脚本 → RCE 触发点 |
| `db` | `postgres:16-alpine` | 5432 | — | sidecar 备份/恢复所使用的内部 Postgres |
| `redis` | `redis:7-alpine` | 6379 | — | 任务队列 / 缓存 |
有两个 Docker 网桥:`edge` (proxy) 和 `core` (其他所有服务)。在存在漏洞的构建版本中,`pg-sidecar` 位于 `core` 上,并且可以从 Web 层的中继访问——这种可达性正是关键所在。修复补丁的 overlay 配置将其隔离了。
## 快速开始
```
cp .env.example .env
docker compose up --build -d
```
然后使用浏览器访问 。
关键的漏洞利用(恢复 sidecar)是**完全无需授权的**——你不需要登录即可访问它。下面植入的平台账户仅作为灰盒测试的视角用于信息发现(在 Search & Reporting 中读取 Splunk 自身的审计日志)。将 **analyst** 账户分配给参与者,让他们自行发现其余内容。
### 植入的账户
| 用户名 | 密码 | 角色 | 备注 |
|---|---|---|---|
| `admin` | `Str@ta-Admin-2026!` | **admin** | 平台超级管理员 (设置, 用户, 数据输入) |
| `j.okafor` | `Analyst!Winter24` | **analyst** | **从这里开始** — 只读的 Search & Reporting 控制台 |
| `m.reyes` | `Operator#2311` | **operator** | 管理数据源 / 集群视图 |
| `svc_forwarder` | `fwd-3f9a1c77b204` | **operator** | 服务账户 (HEC 转发器) |
## 目标
共有**两个 flag 需要捕获**。它们都是 `SPLUNK{...}` 字符串;它们的值存在于实验环境中,并会在文档中揭示——这里有意**不**直接打印它们,以便你能亲手获取。
1. **Flag 1 — 身份验证绕过 + 凭证窃取。** 通过会话前的 `__raw` 中继访问恢复 API,绕过虚假的 `Basic` 认证,并从 sidecar 的 `.pgpass` 中泄露内部 Postgres 凭证。
2. **Flag 2 — 以 `splunk` 身份进行未授权 RCE。** 将 sidecar 的文件写入和 SQL-restore 原语转化为在计划内 modular-input 脚本上的代码执行,然后读取受保护的机密信息。
不要跳步:[`docs/DISCOVERY_WALKTHROUGH.md`](docs/DISCOVERY_WALKTHROUGH.md) 是为引导你逐步发现而编写的,而不是为了直接剧透。为培训人员提供了渐进式的提示梯子和完整的指导方案,但它们被排除在此软件包之外,以确保练习保持盲测破解的状态。
## 文档
| 文档 | 受众 / 用途 |
|---|---|
| [`docs/DISCOVERY_WALKTHROUGH.md`](docs/DISCOVERY_WALKTHROUGH.md) | 从指纹识别到 RCE 的发现驱动路径 |
| [`docs/ROOT_CAUSE.md`](docs/ROOT_CAUSE.md) | 为什么会存在漏洞 (CWE-306) 以及补丁如何修复它 |
| [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 服务、网络、`__raw` 中继以及数据流 |
| [`docs/DETECTION.md`](docs/DETECTION.md) | 蓝队检测机会与特征签名 |
| [`docs/PLAYER_GUIDE.md`](docs/PLAYER_GUIDE.md) | 参与者简报与范围 |
| `docs/HINTS.md` | 渐进式提示梯子 — **保留在内部,未包含在此软件包中** |
| `docs/INSTRUCTOR_GUIDE.md` | **仅限培训人员** — 完整解决方案 + flags,**保留在内部,未包含** |
| [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md) | 启动、操作和销毁环境 |
## 修复方案
`patched/` 树镜像了 Splunk 的真实修复方案 (10.2.4) 加上安全公告的变通措施,作为纵深防御分层部署:对恢复路由进行真实的凭证验证、`backupFile` 路径穿越过滤、消除 libpq 连接字符串注入、使用非超级用户的还原角色、移除授权前的 `__raw` 中继,以及 sidecar 的网络隔离。参见 [`patched/PATCH_NOTES.md`](patched/PATCH_NOTES.md)。
使用 overlay 配置启动加固版本:
```
docker compose -f docker-compose.yml -f patched/deploy/compose.override.hardened.yml up --build -d
```
### 变通方案 (无需补丁)
镜像安全公告的缓解措施,你可以在不打补丁的情况下完全禁用恢复 sidecar——这类似于在 `server.conf` 中设置 `[postgres] disabled = true`。在你的 `.env` 中进行以下设置并重建堆栈:
```
PG_SIDECAR_DISABLED=true
```
禁用 sidecar 后,`recovery/*` 功能将不复存在,利用链也会从源头被切断。
## 参考资料
- Splunk 安全公告 — **SVD-2026-0603** —
- NVD — **CVE-2026-20253** —
- Picus Security — 关于 Splunk 恢复 sidecar RCE 的技术分析文章
- Orca Security — 关于 PostgreSQL sidecar 缺失身份验证缺陷的分析
- The Hacker News — 关于 Splunk Enterprise 严重漏洞的报道
- Help Net Security — 公告摘要与修复指南
- BleepingComputer — 关于 CVE-2026-20253 的报道
标签:CISA项目, Docker, XXE攻击, 安全防御评估, 安全靶场, 搜索引擎查询, 测试用例, 漏洞复现, 版权保护, 红队训练, 编程工具, 自定义脚本, 远程代码执行