PoC Archive PoC Archive
Critical CVE-2025-20333 unpatched

Cisco ASA/FTD WebVPN File-Handler Heap Buffer Overflow Exposure Scanner (CVE-2025-20333)

by curtishoughton · 2026-07-06

CVSS 9.9/10
Severity
Critical
CVE
CVE-2025-20333
Category
network
Affected product
Cisco Secure ASA and Cisco Secure FTD (WebVPN / AnyConnect file upload handler)
Affected versions
Per Cisco advisory for CVE-2025-20333 (see references; not enumerated in this repository)
Disclosed
2026-07-06
Patch status
unpatched

Metadata

FieldValue
Date Added2026-07-06
Last Updated2026-07-06
Author / Researchercurtishoughton
CVE / AdvisoryCVE-2025-20333
Categorynetwork
SeverityCritical
CVSS Score9.9 (per repository)
StatusPoC
Tagscisco, asa, ftd, webvpn, anyconnect, heap-buffer-overflow, cwe-120, rce-as-root, exposure-scanner, path-traversal, python
RelatedCVE-2025-20362

Affected Target

FieldValue
Software / SystemCisco Secure ASA and Cisco Secure FTD (WebVPN / AnyConnect file upload handler)
Versions AffectedPer Cisco advisory for CVE-2025-20333 (see references; not enumerated in this repository)
Language / PlatformPython 3 scanner against a network appliance’s HTTPS WebVPN interface
Authentication RequiredUsually required for full exploitation (often chained with the CVE-2025-20362 authentication bypass); this scanner itself performs unauthenticated reconnaissance only
Network Access RequiredYes

Summary

CVE-2025-20333 is a critical heap-based buffer overflow in the WebVPN file-upload handler of Cisco Secure ASA and FTD devices, which can lead to remote code execution as root when successfully exploited (typically after first bypassing authentication via the related CVE-2025-20362). This repository provides a non-destructive, detection-only scanner: it performs safe GET requests against the known vulnerable file-handling endpoints (+CSCOE+/files/file_action.html, file_list.html, file.php) combined with common path-normalization/traversal bypass patterns, and reports which endpoints are reachable and exhibit indicators consistent with the vulnerable handler, without sending any exploit payload.


Vulnerability Details

Root Cause

The underlying flaw is a heap buffer overflow (CWE-120) in how the WebVPN file-upload/file-handling component parses attacker-supplied file operations; the scanner does not trigger the overflow itself but targets exactly the endpoints where it lives:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
key_paths = [
    "/+CSCOE+/files/file_action.html",
    "/+CSCOE+/files/file_list.html",
    "/+CSCOE+/file.php",
]
bypass_patterns = [
    "", "/..", "/../",
    "/+CSCOE+/../+CSCOE+/",
    "/%2bCSCOE%2b/../%2bCSCOE%2b/",
    "/+CSCOE+/..;/",
]

Reachability of these paths (optionally via normalization-bypass variants that may evade upstream ACLs/proxies) combined with response content matching known keywords (upload, file, action, mode=, path=, webvpn) is used as a proxy signal for exposure to the vulnerable code path.

Attack Vector

  1. Scanner sends safe GET requests to each key WebVPN file-handler path, combined with each bypass/normalization pattern, against the target HTTPS endpoint.
  2. Response status code, length, and content are inspected for indicators that the file-handling endpoint is live and reachable (rather than blocked/404).
  3. If reachable endpoints are found, the tool flags the target as exposed to the CVE-2025-20333 attack surface; actual exploitation (achieving the heap overflow and RCE as root, typically requiring authentication bypass via CVE-2025-20362 first) is out of scope for this scanner.

Impact

As documented (not directly demonstrated by this non-destructive scanner): successful exploitation of the underlying heap buffer overflow yields remote code execution as root on the Cisco ASA/FTD appliance.


Environment / Lab Setup

Target: Cisco Secure ASA / FTD appliance with WebVPN/AnyConnect enabled, reachable
        over HTTPS
Attacker: Python 3 (see repository for exact dependency list; uses requests/urllib3)

Proof of Concept

PoC Script

See CVE-2025-20333-Scanner.py in this folder.

1
python CVE-2025-20333-Scanner.py https://TARGET-VPN.example.com

Detection & Indicators of Compromise

GET /+CSCOE+/files/file_action.html HTTP/1.1
GET /+CSCOE+/files/file_list.html HTTP/1.1
GET /+CSCOE+/file.php HTTP/1.1
GET /+CSCOE+/files/file_action.html/.. HTTP/1.1
GET /%2bCSCOE%2b/../%2bCSCOE%2b/files/file_action.html HTTP/1.1

Signs of compromise:

  • WebVPN interface crashes, restarts, or core dumps around file-upload/file-handler requests
  • Unusual outbound connections or new local accounts/processes originating from the ASA/FTD management plane
  • Requests to +CSCOE+/files/* endpoints containing unusually large or malformed multipart/file-upload bodies
  • Presence of path-traversal or URL-encoding bypass patterns (e.g. ..;/, %2b variants) targeting +CSCOE+ paths in web/proxy logs

Remediation

ActionDetail
Primary fixApply the Cisco security advisory patch for CVE-2025-20333 (and the related CVE-2025-20362 authentication bypass) per Cisco’s published fixed software releases
Interim mitigationRestrict WebVPN/AnyConnect management interface exposure to trusted networks only; disable WebVPN file-upload features if not required; monitor for crash/restart events on the ASA/FTD WebVPN process

References


Notes

Mirrored from https://github.com/curtishoughton/Cisco-ASA-CVE-2025-20333-Scanner on 2026-07-06. Functional, non-destructive GET-only scanner testing WebVPN file-handler endpoint reachability relevant to the Cisco ASA/FTD buffer overflow; it is a detection tool, not a weaponized RCE exploit — status marked as PoC accordingly.

CVE-2025-20333-Scanner.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import requests
import sys
import warnings
from urllib3.exceptions import InsecureRequestWarning

warnings.simplefilter("ignore", InsecureRequestWarning)

def test_cve_2025_20333(base_url):
    base_url = base_url.rstrip('/')
    
    # Primary vulnerable endpoint for CVE-2025-20333 (file upload handler)
    key_paths = [
        "/+CSCOE+/files/file_action.html",
        "/+CSCOE+/files/file_list.html",
        "/+CSCOE+/file.php",
    ]
    
    # Common bypass patterns (can be chained with CVE-2025-20362)
    bypass_patterns = [
        "",
        "/..",
        "/../",
        "/+CSCOE+/../+CSCOE+/",
        "/%2bCSCOE%2b/../%2bCSCOE%2b/",
        "/+CSCOE+/..;/",
    ]
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (compatible; CVE-2025-20333-Scanner)',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    }
    
    print(f"[+] Testing {base_url} for CVE-2025-20333 (Buffer Overflow / RCE)")
    print("[+] This checks the file upload handler used in exploitation.\n")
    
    vulnerable_indicators = 0
    hits = []
    
    for base_path in key_paths:
        for bypass in bypass_patterns:
            try:
                test_url = base_url + base_path + bypass
                # Use GET first (safer)
                r = requests.get(
                    test_url,
                    headers=headers,
                    verify=False,
                    timeout=12,
                    allow_redirects=True
                )
                
                status = r.status_code
                length = len(r.text)
                
                print(f"  {status:3d} | {length:6d} bytes | {base_path}{bypass}")
                
                lower_text = r.text.lower()
                
                # Indicators that the endpoint is active/reachable
                if status == 200 and length > 300:
                    if any(kw in lower_text for kw in ["upload", "file", "action", "mode=", "path=", "webvpn"]):
                        print(f"    ⚠️  ENDPOINT REACHABLE - Potential attack surface for CVE-2025-20333")
                        vulnerable_indicators += 1
                        hits.append(test_url)
                
            except requests.exceptions.RequestException:
                continue
    
    # Summary
    if vulnerable_indicators >= 2:
        print("\n🚨 HIGH RISK: Key endpoints for CVE-2025-20333 are accessible.")
        print("   This vulnerability is a heap buffer overflow that can lead to RCE as root.")
        print("   Recommendation: Patch immediately + check for compromise.")
    elif vulnerable_indicators > 0:
        print("\n⚠️  Potential exposure to CVE-2025-20333 detected.")
    else:
        print("\n✅ No clear indicators of the vulnerable endpoint (may be patched or not exposed).")
    
    if hits:
        print("\nReachable endpoints:")
        for url in hits[:6]:
            print(f"   → {url}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python cve_2025_20333_test.py https://target-vpn.example.com")
        sys.exit(1)
    
    test_cve_2025_20333(sys.argv[1])