Hardening Cisco IOS XE: Blue Team Web UI Zero-Day Defense Guide

Hardening Cisco IOS XE: Blue Team Web UI Zero-Day Defense Guide

Overview & Defensive Context: Cisco IOS XE Web UI Zero-Day (CVE-2023-20198)#

Harden Cisco IOS XE against CVE-2023-20198 and CVE-2023-20273: disable Web UI, restrict management ACLs, audit rogue users, and deploy Sigma rules.

In our morning exploit architecture analysis, we deconstructed the offensive mechanics of the Cisco IOS XE Web UI Zero-Day Exploit Chain (CVE-2023-20198, CVSS 10.0, Critical, and CVE-2023-20273, CVSS 7.2, High, mapped to MITRE ATT&CK T1190: Exploit Public-Facing Application, T1078.003: Local Accounts, and T1505.003: Web Shell). We analyzed how an unauthenticated attacker leverages an internal authentication logic flaw in the Web Infrastructure Security Protocol (WISP) and Web Services Management Agent (WSMA) dispatch pipeline to create rogue Privilege Level 15 local user accounts, subsequently chaining an authenticated command injection flaw in the software management API to install the stealth in-memory BadCandy Lua web shell into Nginx (/usr/binos/conf/nginx-conf/cisco_service.conf).

For enterprise blue teams, principal network architects, and SOC analysts, defending Cisco edge networking infrastructure against this zero-day chain exposes critical structural realities of network appliance defense:

  • The Fallacy of Perimeter Self-Protection: Network routers, switches, and edge security gateways are deployed to enforce perimeter access controls for downstream enterprise hosts. However, when the management plane of the edge appliance itself is exposed to the public internet, the gateway transitions from a security enforcement point to an unauthenticated entry bridge for nation-state and opportunistic adversaries.
  • The Failure of Out-of-the-Box Ingress Defenses: Firewalls, cloud security groups, and intrusion prevention systems (IPS) sitting in front of or parallel to edge routers often pass HTTPS traffic destined for the router's management IP if remote administration is required. Because the initial exploit payload utilizes standard SOAP-over-HTTP formatting on legitimate endpoints (/webui/logoutconfirm.html), signature-less defenses cannot differentiate between valid administrative workflows and unauthenticated user provisioning.
  • The Dual-Plane Persistence Asymmetry: The BadCandy Lua implant hooks into the active Nginx process in volatile memory, meaning a device reboot (reload) clears the web shell. However, the rogue Privilege Level 15 accounts created during Stage 1 are committed directly to the device's running configuration and startup configuration (nvram:/startup-config). Merely rebooting the appliance without auditing and purging local accounts leaves the door open for immediate re-infection.
  • The Blast Radius of Edge Compromise: A compromised edge router running Cisco IOS XE grants adversaries unconstrained access to mirror raw network traffic, harvest routing tables (OSPF, BGP, EIGRP), forge VPN sessions, intercept cleartext credentials, and establish persistent lateral movement conduits into the internal enterprise core.
Warning

Disabling the HTTP and HTTPS server features (no ip http server and no ip http secure-server) is the definitive, immediate mitigation for unpatched systems. If web management is required for operational workflows, access must be strictly constrained to dedicated, trusted management IP ranges via access-lists (ip http access-class).

⚔️ Exploitation Mechanics: For root-cause memory corruption analysis and attack flow, see our deep-dive: Deconstructing Breakdown.


Architecture Hardening: Multi-Tiered Management Plane Protection (T1190)#

Eliminating the attack surface of CVE-2023-20198 and CVE-2023-20273 requires establishing a multi-layered defense-in-depth architecture across the control plane, data plane, management plane, and enterprise authentication infrastructure.

Defense Architecture Flowchart#

flowchart TD
    classDef client fill:#1e293b,stroke:#ef4444,stroke-width:2px,color:#f8fafc
    classDef gate fill:#0f172a,stroke:#3b82f6,stroke-width:2px,color:#93c5fd
    classDef secure fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#6ee7b7
    classDef audit fill:#4c1d95,stroke:#8b5cf6,stroke-width:2px,color:#ddd6fe
    classDef drop fill:#450a0a,stroke:#dc2626,stroke-width:2px,color:#fca5a5
    classDef pass fill:#065f46,stroke:#34d399,stroke-width:2px,color:#a7f3d0

    IncomingTraffic[Internet / Untrusted Traffic targeting TCP 80 / 443]:::client --> ServiceStateGate{Tier 1: Web UI HTTP/S Server Active?}:::gate

    ServiceStateGate -- no ip http server & no ip http secure-server --> DropDisabled[Action: Port Closed / TCP RST Dropped]:::pass
    ServiceStateGate -- HTTP/S Server Enabled --> AccessClassGate{Tier 2: Management Access-Class ACL Filter}:::gate

    AccessClassGate -- Source IP Not Permitted in ACL --> DropACL[Action: Silent Drop by Infrastructure ACL]:::drop
    AccessClassGate -- Source IP in Trusted Management Subnet --> CoPPGate{Tier 3: Control Plane Policing Policy}:::gate

    CoPPGate -- Web Management Traffic Exceeds CoPP Threshold --> DropCoPP[Action: Rate-Limited by CoPP Management Class]:::drop
    CoPPGate -- Legitimate Rate-Limited Management Stream --> PatchVerification{Tier 4: Firmware Patch Verification}:::secure

    PatchVerification -- Vulnerable Release < 17.9.4a --> ExploitationRisk[Risk: WSMA Logic Flaw & Shell Injection Active]:::drop
    PatchVerification -- Patched Cisco IOS XE Release >= 17.9.4a --> HardenedWSMA[Patched: WISP Enforces Strict Auth Gate]:::pass

    HardenedWSMA --> AAAGate{Tier 5: Centralized AAA & TACACS+ Authorization}:::secure
    ExploitationRisk --> TelemetryPipeline[Tier 6: Syslog & SIEM Ingestion Stream]:::audit

    AAAGate -- Command Accounting & Mandatory TACACS+ Check --> SafeOperation[Legitimate Admin Session Established]:::pass
    AAAGate -- Rogue Local User Login Attempt --> DropAAA[Action: Denied by Centralized AAA Policy]:::drop

    DropACL -.-> TelemetryPipeline
    DropAAA -.-> TelemetryPipeline
    TelemetryPipeline --> SOCAlert[SOC Incident Triage & Automated Quarantine]:::pass

Layer 1: Immediate Control Plane Service Deactivation#

The primary mitigation recommended by Cisco PSIRT, CISA, and the Canadian Centre for Cyber Security is the immediate deactivation of the embedded HTTP and HTTPS server features across all internet-facing and untrusted interfaces.

Emergency CLI Deactivation Script

Execute the following commands in global configuration mode across all Cisco IOS XE devices:

CISCO
! Disable both insecure HTTP and secure HTTPS management servers
configure terminal
 no ip http server
 no ip http secure-server
end
write memory

Verification of Service Shutdown

Verify that the web daemon processes have terminated and are no longer listening on TCP ports 80 or 443:

CISCO
! Verify web service operational state
show ip http server status
! Expected output:
! HTTP server status: Disabled
! HTTP secure server status: Disabled

! Verify no active TCP listeners exist on ports 80 or 443
show tcp brief | include :(80|443)

Layer 2: Management Access-Class & Infrastructure ACL Restrictions#

If disabling the web server is operationally impossible due to centralized orchestration dependencies (such as Cisco DNA Center, Catalyst Center, or legacy web-based workflows), network teams must restrict access to designated management subnets using access-classes.

Restricting Web UI Access via Standard ACL

CISCO
configure terminal
! Define trusted management subnets (Out-of-Band Management Network)
ip access-list standard PERMIT-TRUSTED-MGMT
 10 permit 10.100.50.0 0.0.0.255
 20 permit 192.168.1.50 0.0.0.0
 30 deny any log

! Apply access-class restriction to the HTTP/S web server
ip http access-class PERMIT-TRUSTED-MGMT
end
write memory

Restricting Control Plane Access via Control Plane Policing (CoPP)

Control Plane Policing (CoPP) protects the router's Route Processor (RP) from unauthorized traffic by enforcing packet filtering at the hardware forwarding plane (ASIC/TCAM layer):

CISCO
configure terminal
! 1. Define ACL for management traffic
ip access-list extended ACL-COPP-MANAGEMENT
 permit tcp 10.100.50.0 0.0.0.255 any eq 443
 permit tcp 10.100.50.0 0.0.0.255 any eq 22
 deny tcp any any eq 443
 deny tcp any any eq 80

! 2. Create Class-Map for management
class-map match-all CLASS-COPP-MGMT
 match access-group name ACL-COPP-MANAGEMENT

! 3. Create Policy-Map to enforce rate-limiting and drop unauthorized traffic
policy-map POLICY-COPP-CONTROL-PLANE
 class CLASS-COPP-MGMT
  police 8000000 conform-action transmit exceed-action transmit
 class class-default
  police 1000000 conform-action transmit exceed-action drop

! 4. Apply policy-map to the control plane
control-plane
 service-policy input POLICY-COPP-CONTROL-PLANE
end
write memory

Layer 3: Centralized AAA & TACACS+ Authorization Hardening#

Relying exclusively on local user accounts allows attackers who compromise the local user database to bypass centralized accounting. Enforcing centralized TACACS+ or RADIUS authentication and command authorization ensures that any local user creation triggers audit alarms or requires external server validation.

CISCO
configure terminal
! Define TACACS+ Server Group
aaa new-model
tacacs server ISE-PRIMARY
 address ipv4 10.100.50.15
 key 7 070C285F4D0616
!
aaa group server tacacs+ ISE-GROUP
 server name ISE-PRIMARY

! Enforce TACACS+ for login authentication with fallback to local only on server failure
aaa authentication login default group ISE-GROUP local
aaa authentication enable default group ISE-GROUP enable

! Enforce command authorization at Privilege Level 15
aaa authorization commands 15 default group ISE-GROUP local

! Enable command accounting to capture all configuration changes
aaa accounting commands 15 default start-stop group ISE-GROUP
end
write memory

Layer 4: Automated Node Auditing via Cisco EEM (Embedded Event Manager)#

Cisco IOS XE includes the Embedded Event Manager (EEM), an on-box automation engine capable of intercepting syslog messages and CLI commands in real time. We can deploy an EEM applet that monitors for any programmatic user configuration events originating from SEP_webui_wsma_http or unknown local user additions, immediately neutralizing the rogue account:

CISCO
configure terminal
! EEM Applet to detect and alert on unauthorized user creation
event manager applet DETECT-ROGUE-USER-CREATION
 event syslog pattern "%SYS-5-CONFIG_P.*SEP_webui_wsma_http"
 action 1.0 syslog priority critical msg "ALERT: CVE-2023-20198 Exploit Attempt Detected via WSMA!"
 action 2.0 cli command "enable"
 action 3.0 cli command "show running-config | include username"
 action 4.0 mail server "10.100.50.25" to "soc-alerts@enterprise.internal" from "router@enterprise.internal" subject "SECURITY ALERT: Rogue User Creation on Router" body "$_cli_result"
end
write memory

Production Detection Queries: Hunting BadCandy & Rogue WSMA Accounts#

To detect compromise across enterprise SIEM, network sensor, and log aggregation platforms, blue teams must deploy targeted detection queries mapping to the observed tactics of the threat actors.

1. Production Sigma Rule: Cisco IOS XE Rogue Account Created via WSMA (CVE-2023-20198)#

The following production Sigma rule detects programmatic configuration events generated by SEP_webui_wsma_http or the creation of known rogue user accounts associated with the campaign.

YAML
title: Cisco IOS XE Rogue Account Created via WSMA (CVE-2023-20198)
id: 8b7d41f2-3c1a-4e9b-a62f-0d5e8a9b1c34
status: production
description: Detects programmatic local user creation on Cisco IOS XE devices via the SEP_webui_wsma_http process indicative of CVE-2023-20198 exploitation.
references:
    - https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-iosxe-webui-privesc-j22SaA4z
    - https://blog.talosintelligence.com/active-exploitation-of-cisco-ios-xe-software/

tags:
    - attack.initial_access
    - attack.persistence
    - attack.t1190
    - attack.t1078.003
    - cve.2023.20198
logsource:
    product: cisco
    service: ios_xe
detection:
    selection_wsma_proc:
        Message|contains:
            - '%SYS-5-CONFIG_P'
            - 'SEP_webui_wsma_http'
    selection_user_creation:
        Message|contains:
            - 'cisco_tac_admin'
            - 'cisco_support'
            - 'cisco_sys_manager'
            - 'cisco_sys_mgr'
    selection_software_install:
        Message|contains:
            - '%WEBUI-6-INSTALL_OPERATION_INFO'
            - 'ADD'
    condition: selection_wsma_proc or selection_user_creation or selection_software_install
falsepositives:
    - Legitimate automated configuration orchestrators leveraging WSMA (verify source IP against change management tickets).
level: critical

2. Snort 3 / Suricata Network Signatures#

Deploy these network intrusion detection rules to intercept exploitation traffic targeting edge appliances:

SNORT
# Rule 1: Intercept unauthenticated WSMA privilege escalation payload
alert tcp $EXTERNAL_NET any -> $HOME_NET [80,443] (
    msg:"SERVER-OTHER Cisco IOS XE Web UI unauthenticated privilege escalation attempt (CVE-2023-20198)";
    flow:to_server,established;
    http_uri; content:"/webui/logoutconfirm.html",fast_pattern;
    http_client_body; content:"SOAP-ENV:Envelope"; content:"username"; content:"privilege 15";
    metadata:service http, attack_target client_and_server;
    classtype:attempted-admin;
    sid:3000201; rev:1;
)

# Rule 2: Intercept BadCandy Lua web shell probe with hardcoded token check
alert tcp $EXTERNAL_NET any -> $HOME_NET [80,443] (
    msg:"MALWARE-BACKDOOR Cisco IOS XE BadCandy Lua web shell probe detected";
    flow:to_server,established;
    http_uri; content:"/webui/logoutconfirm.html",fast_pattern;
    http_uri; content:"logon_hash=1";
    metadata:service http, attack_target client_and_server;
    classtype:trojan-activity;
    sid:3000202; rev:1;
)

3. YARA Rule: BadCandy In-Memory Lua Web Shell (cisco_service.conf)#

For memory forensics or firmware filesystem inspections, the following YARA rule identifies the decompiled logic of the BadCandy Nginx configuration hook:

YARA
rule BadCandy_Lua_Webshell_Cisco_IOS_XE {
    meta:
        description = "Identifies the BadCandy Lua web shell implant configured in Nginx on Cisco IOS XE"
        author = "Md Redwan Ahmed (Fast Cyber Defense)"
        reference = "https://blog.talosintelligence.com/active-exploitation-of-cisco-ios-xe-software/"
        date = "2026-10-17"
        hash = "cisco_service.conf"
    strings:
        $s1 = "content_by_lua_block" ascii
        $s2 = "ngx.req.get_uri_args()" ascii
        $s3 = "ngx.req.get_post_args()" ascii
        $s4 = "logon_hash" ascii
        $s5 = "common_type" ascii
        $s6 = "subsystem" ascii
        $s7 = "cli -c" ascii
        $s8 = "io.popen" ascii
    condition:
        all of ($s1, $s2, $s3, $s4) and (2 of ($s5, $s6, $s7, $s8))
}

Enterprise Mitigation Matrix: Comparing Remediations for Cisco Web UI#

The following matrix evaluates the trade-offs between emergency workarounds, official vendor hotfixes, and architectural defenses across enterprise environments:

Remediation Strategy Mechanism & Action Implementation Complexity Protection Scope Performance Overhead Operational Risk & Dependencies
Emergency Workaround Deactivate HTTP & HTTPS servers (no ip http server, no ip http secure-server) Low (Immediate single CLI command) Complete (Eliminates web attack surface entirely) Zero (Frees Route Processor memory) Breaks web-based management interfaces and third-party tools relying on HTTP REST
Access-Class Workaround Enforce ip http access-class to restrict web management to trusted subnets Low (Requires standard ACL definition) Broad (Blocks unauthenticated internet traffic; internal threats persist) Negligible (< 1% CPU utilization) Misconfigurations in ACL ranges may expose the service or inadvertently lock out administrators
Control Plane Policing Implement hardware CoPP rate-limiting and drop filters for TCP 80/443 Medium (Requires class-map and policy-map configuration) High (Protects Route Processor from volumetric and exploit traffic) Zero (Enforced in ASIC hardware forwarding plane) Complexity in tuning rate limits; improperly tuned policies may drop legitimate telemetry
Definitive Vendor Patch Upgrade Cisco IOS XE firmware to patched maintenance release (17.9.4a+, 17.6.6a+, 17.3.8a+) Medium to High (Requires change window, node reload, and testing) Complete (Fixes WISP authentication logic and software management validation) Zero Requires maintenance downtime for device reload; potential firmware regression risks
Architectural Defense Isolate management plane into dedicated Out-of-Band Management VRF High (Requires network topology restructuring and VRF configuration) Complete (Physical and logical segregation of management traffic) Zero High network redesign effort; requires dedicated management cabling and switch ports

Incident Response & Verification Playbook: Blue Team Containment & Auditing#

If a network edge device is suspected of compromise by CVE-2023-20198 or BadCandy, execute the following five-phase incident response runbook.

Phase 1: Rapid Exposure Identification & Service Triage#

  1. Audit Global Web Server Exposure: Run the following commands across all network nodes to identify active HTTP/HTTPS listeners:
CISCO
show running-config | include ip http
   show ip http server status
  1. Scan External Perimeter: Verify whether TCP ports 80 and 443 are reachable from untrusted external networks.

Phase 2: Active Compromise Auditing & User Database Inspection#

  1. Inspect Local User Accounts: Check for rogue or unfamiliar user accounts configured at Privilege Level 15:
CISCO
show running-config | include username

Suspect usernames observed in wild campaigns: cisco_tac_admin, cisco_support, cisco_sys_manager, cisco_sys_mgr, system_admin. 2. Review Historical Syslog Messages: Query the central SIEM or local logging buffer for programmatic configuration events:

CISCO
show logging | include (%SYS-5-CONFIG_P|%SEC_LOGIN-5-WEBLOGIN_SUCCESS|%WEBUI-6-INSTALL_OPERATION_INFO)
  1. Execute BadCandy Implant Probe: Execute the active hunting probe from a trusted management workstation:
BASH
curl -k -H "Authorization: 0ff4fbf0ecffa77ce8d3852a29263e263838e9bb"         -X POST "https://[ROUTER_IP]/webui/logoutconfirm.html?logon_hash=1"

Assessment: If the router returns an 18-character hexadecimal string, the BadCandy implant is active in memory.

Phase 3: Rogue Account Eradication & Configuration Sanitization#

  1. Remove Unauthorized User Accounts: Enter global configuration mode and immediately delete any unrecognized administrative accounts:
CISCO
configure terminal
    no username cisco_tac_admin
    no username cisco_support
    no username cisco_sys_manager
   end
  1. Rotate All Legitimate Administrative Passwords: Assume that existing credentials in the configuration file may have been exfiltrated:
CISCO
configure terminal
    enable secret <NEW_STRONG_SECRET>
    username <LEGIT_ADMIN> privilege 15 secret <NEW_STRONG_SECRET>
   end
   write memory

Phase 4: Implant Cleansing via Device Reload#

Because the BadCandy Lua web shell resides strictly in the running Nginx process memory (/usr/binos/conf/nginx-conf/cisco_service.conf), rebooting the device flushes volatile memory and completely purges the implant.

CISCO
! Verify configuration is saved without rogue users before reloading
write memory
reload
Important

A device reload will purge BadCandy from memory. However, if the HTTP/S server is not disabled or if the rogue local users were not deleted prior to the reload, attackers can immediately reconnect and re-stage the implant. Complete Phase 3 and Layer 1 before reloading.

Phase 5: Firmware Upgrade & Image Integrity Verification#

  1. Verify Bootflash Integrity: Confirm that the bootflash image has not been modified or corrupted by computing its MD5 hash against Cisco's published software checksums:
CISCO
verify /md5 bootflash:c8000v-universalk9.17.09.04a.SPA.bin
  1. Install Patched Cisco IOS XE Release: Upgrade the device to a patched maintenance train:
    • 17.9 Train: Upgrade to 17.9.4a or later.
    • 17.6 Train: Upgrade to 17.6.6a or later.
    • 17.3 Train: Upgrade to 17.3.8a or later.

Executive Takeaway Table: Cisco IOS XE Attack & Mitigation Matrix#

Attack Vector & Threat Action Exploited Component & Mechanism Critical Blue Team Detection Signal Primary Defensive Mitigation
Unauthenticated User Creation WISP authentication logic flaw in /webui/logoutconfirm.html (CVE-2023-20198) Syslog %SYS-5-CONFIG_P from SEP_webui_wsma_http Disable HTTP server (no ip http server / secure-server); restrict via ACL
Guest OS Command Injection Unsanitized filename parameter in software install API (CVE-2023-20273) Syslog %WEBUI-6-INSTALL_OPERATION_INFO containing shell delimiters Apply official Cisco IOS XE patch (17.9.4a+, 17.6.6a+, 17.3.8a+)
In-Memory Lua Web Shell BadCandy implant hooked into Nginx at cisco_service.conf External probe returning 18-char hex string on logon_hash=1 Execute device reload (reload) to flush volatile memory after user purge
Credential & Configuration Theft Privilege 15 access executing show running-config and show ip route High-frequency administrative CLI execution logged via AAA accounting Rotate all enable secrets, VPN pre-shared keys, and SNMP community strings

Authoritative References & Hardening Guidelines#

Comments