
CVE-2026-41940 escáner de IOC de bypass de autenticación en cPanel/WHM: corrige falsos positivos en el script de detección upstream y añade correlación cruzada de registros.
Script de detección para la omisión de autenticación en cPanel/WHM (CVE-2026-41940) que afecta a todas las versiones de cPanel posteriores a la 11.40.
Esta es una reescritura del script de detección de cPanel original con correcciones para falsos positivos y correlación de registros añadida.
Escanea /var/cpanel/sessions/raw/ en busca de archivos de sesión que muestren signos de explotación por inyección de nuevas líneas, y luego cruza las IPs y tokens de sesión sospechosos con los registros de acceso/inicio de sesión/error de cPanel. También escanea el access_log en busca de explotación histórica donde el archivo de sesión ya haya expirado o haya sido purgado.
pass defectuosa que genera falsos positivos en cada sesión autenticada en producción (la regex coincide con cualquier campo pass= seguido de otra línea, que es todos los archivos de sesión).method=badpass origin + CUALQUIER atributo posterior a la autenticación en lugar de exigir la combinación limitada . Detecta variantes de PoC que omiten .token_denied + cp_security_tokentoken_deniedPOST /login/?login_only=1 -> 401) con el uso posterior exitoso del token cpsess desde la misma IP.--extended para un barrido de registros más profundo en fuentes adicionales.# Bash — funciona en cualquier lugar, sin dependencias
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — más rápido en directorios de sesión grandes, soporta --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# Escaneo extendido (cualquier variante)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# Verificar el código de salida después de la ejecución ($? = 0 limpio, 1 IOC encontrados, 2 error de entorno)
echo $?
Flags de curl:
-ffalla en errores HTTP en lugar de canalizar una página de error a bash,-ssilencioso (sin barra de progreso),-Saún muestra errores a pesar de-s,-Lsigue redirecciones.
La variante Python soporta --json para salida estructurada que puedes canalizar a jq, alimentar a un SIEM, o procesar programáticamente.
# Salida JSON completa
python3 ioc.py --json
# Solo los recuentos de resumen
python3 ioc.py --json | jq '.counts'
# Listar todos los hallazgos CRÍTICOS
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# Extraer IPs de atacante únicas
python3 ioc.py --json | jq '.suspect_ips[]'
# Mostrar hallazgos con sus IPs de origen (para listas de bloqueo de firewall)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# Obtener todas las IPs que tuvieron uso exitoso de token (para bloqueo inmediato)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# Alimentar datos de referencia cruzada para una IP específica
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
Ejemplo de estructura JSON:
{
"findings": [
{
"severity": "CRITICAL",
"file": "/var/cpanel/sessions/raw/:Q3f8Ag2epeBuTaIZ",
"verdict": "Injected token used successfully (2xx/3xx in access_log)",
"origin": "address=203.0.113.50,app=whostmgrd,method=badpass",
"source_ip": "203.0.113.50",
"user": "root",
"hasroot": "1",
"tfa_verified": "0",
"cp_security_token": "/cpsess04396539398",
"token_denied": "1",
"successful_internal_auth_with_timestamp": "9999999999",
"token_hits": [
"203.0.113.50 - root [04/30/2026:12:12:01 -0000] \"GET /cpsess04396539398/json-api/version HTTP/1.1\" 200 0 ..."
]
},
{
"severity": "MEDIUM",
"file": "/var/cpanel/sessions/raw/:2TDiaHwh_r8qOH5y",
"verdict": "Injection landed; token was tried but BLOCKED (all 4xx/5xx)",
"source_ip": "198.51.100.23",
"cp_security_token": "/cpsess5637704041",
"token_hits": [
"198.51.100.23 - root [04/30/2026:04:08:09 -0000] \"GET /cpsess5637704041/json-api/version HTTP/1.1\" 403 0 ..."
]
},
{
"severity": "CRITICAL",
"file": null,
"verdict": "Injected cpsess token used with 2xx/3xx after failed login; session expired or purged",
"source_ip": "203.0.113.99",
"cp_security_token": "/cpsess8705792557",
"token_hits": ["..."]
}
],
"counts": {"critical": 2, "high": 15, "medium": 71, "warning": 0},
"suspect_ips": ["203.0.113.50", "198.51.100.23", "203.0.113.99"],
"suspect_ips_omitted": 0,
"cross_ref": {
"203.0.113.50": {
"cpanel_access_log": ["...last 5 lines..."],
"cpanel_login_log": ["..."]
}
},
"advisory": "https://support.cpanel.net/hc/en-us/articles/40073787579671"
}
git clone https://github.com/AndreiG6/cpanel-cve-2026-41940-ioc.git
cd cpanel-cve-2026-41940-ioc
# Variante Bash
bash ioc.sh # predeterminado (CRÍTICO/ALTO expandido, MEDIO/ADVERTENCIA solo recuentos)
bash ioc.sh -v # verboso (expandir todos los hallazgos)
bash ioc.sh --extended # verboso + registros más profundos + todas las IPs en referencia cruzada
# Variante Python (misma lógica de detección, más rápida, salida estructurada)
python3 ioc.py # predeterminado (mismo comportamiento de colapso que bash)
python3 ioc.py -v # verboso
python3 ioc.py --extended # verboso + registros más profundos
python3 ioc.py --json # JSON estructurado (siempre incluye todos los hallazgos)
Debe ejecutarse como root en el servidor cPanel de destino. La variante Python requiere Python 3.6+ (incluido con CentOS 7 / CloudLinux 7+).
| Código | Significado |
|---|---|
| 0 | No se encontraron indicadores |
| 1 | IOC detectados |
| 2 | Error de entorno (no es un servidor cPanel) |
MIT