自包含的安全培训实验室,复现 CVE-2026-20253(Splunk Enterprise 未认证远程代码执行)。提供基于 Docker 的环境,通过文档化的攻击链练习 Web 漏洞利用、权限提升和凭据窃取。
Splunk Enterprise 10.2.3 · PostgreSQL 恢复侧车 · CWE-306(关键功能缺少身份验证) 一个经授权的、自包含的复现环境,模拟了真实安全公告的内容, 用于防御性安全教育。它不包含 Splunk 的专有代码。
本仓库是一个 Vulhub/DVWA 风格的安全训练实验环境。它搭建了一个
Splunk Enterprise 10.2.3 的忠实模型,并复现了 CVE-2026-20253 背后的
已记录行为:自带的 PostgreSQL 恢复侧车 暴露了特权文件写入和 SQL 执行功能,
且没有真正的身份验证(接受空/任意 Basic 头),而 Splunk Web 层会
在登录门禁之前将 __raw/v1/postgres/* 中继到该侧车。
将这些链接起来,即可在非 root 的 splunk 服务账户下实现未认证的远程代码执行。
该实验环境可端到端完整解出:指纹识别边缘入口,沿着预认证的健康状态徽标 找到内部恢复 API,证明任意文件写入,窃取内部 Postgres 凭据,并将 SQL 恢复的 文件写入原语转化为在计划模块化输入脚本上的代码执行。
| 厂商公告 | 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 |
边缘网络 核心网络
┌───────────────────┐ ┌───────────────────────────────┐
browser ─▶ proxy :8080 ──▶ web :8001 (SPA)
(nginx edge) └▶ splunkd :8089 ─┬─▶ db :5432 (postgres)
login API + ├─▶ redis :6379 (jobs/cache)
__raw relay ───┼─▶ pg-sidecar :5435 ◀── 漏洞所在
│ (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)
两个 Docker 桥接网络:edge(proxy)和 core(其他所有服务)。在
存在漏洞的构建中,pg-sidecar 位于 core 网络上,并可从 Web 层的
中继访问——这种可达性正是关键所在。已修补的覆盖层将其隔离。
cp .env.example .env
docker compose up --build -d
然后访问 http://localhost:8080。
关键漏洞利用(恢复侧车)完全无需认证——你 不需要登录即可触达它。下面预置的平台账户仅作为 灰盒视角的发现起点(在 Search & Reporting 中阅读 Splunk 自身的审计日志)。 将 analyst 账户交给参与者,让他们自行发现其余内容。
这些凭据是有意记录在文档中的——这是一个自包含的 训练实验环境,不是生产系统。练习不要求破解或提权其中任何账户; 关键的
pg-sidecar恢复 API 是未认证的。完整的操作员说明见docs/DEPLOYMENT.md。
需要捕获两面旗帜。两者都是 SPLUNK{...} 字符串;其值
位于实验环境中,并在文档中揭示——这里故意不打印出来,
以便你可以亲自挣得它们。
__raw 中继
触达恢复 API,绕过虚假的 Basic 认证,并从侧车的 .pgpass 中
泄露内部 Postgres 凭据。splunk 身份实现未认证 RCE。 将侧车的文件写入
和 SQL 恢复原语转化为在计划模块化输入脚本上的代码执行,
然后读取受保护的机密。不要跳步查看:docs/DISCOVERY_WALKTHROUGH.md
是为“被发现”而写的,不是为“被剧透”而写的。为培训人员准备的渐进式提示阶梯
和完整讲师解答,刻意不包含在本包中,以保证练习保持盲解。
patched/ 目录树镜像了 Splunk 的真实修复(10.2.4)以及公告中的
临时缓解措施,并作为纵深防御分层部署:在恢复路由上实施真实的凭据校验、
backupFile 路径遍历净化、消除 libpq 连接字符串注入、使用非超级用户恢复角色、
移除预认证的 __raw 中继,以及对侧车进行网络隔离。详见
patched/PATCH_NOTES.md。
使用覆盖层启动加固构建:
docker compose -f docker-compose.yml -f patched/deploy/compose.override.hardened.yml up --build -d
参照公告中的缓解建议,你可以在不打补丁的情况下完全禁用恢复侧车——
相当于在 server.conf 中设置 [postgres] disabled = true。在 .env 中
设置以下内容并重建堆栈:
PG_SIDECAR_DISABLED=true
禁用侧车后,recovery/* 函数将不复存在,攻击链在源头即被切断。
培训材料。 本实验环境是经授权的、自包含的复现, 它模拟了 Splunk Enterprise CVE-2026-20253,用于防御性教育。 它不包含 Splunk 的专有源码或二进制文件;这里的服务是 对 文档记载的 漏洞行为的独立重新实现。 仅可针对本实验环境使用。将这些技术用于你并不拥有的系统是违法的。
| 服务 | 镜像 | 监听端口 | 已发布端口 | 角色 |
|---|
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(令牌认证) |
pg-sidecar | splunk/pg-sidecar:10.2.3 | 5435 | — | 漏洞所在 — PostgreSQL 恢复侧车(/v1/postgres/*) |
scheduler | splunk/scheduler:10.2.3 | — | — | 以 splunk 身份运行计划模块化输入脚本 → RCE 落点 |
db | postgres:16-alpine | 5432 | — | 侧车进行备份/恢复的内部 Postgres |
redis | redis:7-alpine | 6379 | — | 任务队列 / 缓存 |
| 用户名 | 密码 | 角色 | 说明 |
|---|
admin | Str@ta-Admin-2026! | admin | 完整平台管理员(Settings、Users、Data Inputs) |
j.okafor | Analyst!Winter24 | analyst | 从这里开始 — 只读的 Search & Reporting 控制台 |
m.reyes | Operator#2311 | operator | 管理数据源 / 集群视图 |
svc_forwarder | fwd-3f9a1c77b204 | operator | 服务账户(HEC 转发器) |
| 文档 | 受众 / 用途 |
|---|
docs/DISCOVERY_WALKTHROUGH.md | 从指纹识别到 RCE 的发现驱动路径 |
docs/ROOT_CAUSE.md | 为何存在漏洞(CWE-306)以及补丁如何修复 |
docs/ARCHITECTURE.md | 服务、网络、__raw 中继与数据流 |
docs/DETECTION.md | 蓝队检测机会与特征 |
docs/PLAYER_GUIDE.md | 参与者简报与范围 |
docs/HINTS.md | 渐进式提示阶梯 — 内部保留,不包含在本包中 |
docs/INSTRUCTOR_GUIDE.md | 仅限培训人员 — 完整解答 + 旗帜,内部保留,不包含在本包中 |
docs/DEPLOYMENT.md | 搭建、运维和拆除该环境 |