
CVE-2026-41940 cPanel/WHM contournement d'authentification — scanner IOC qui corrige les faux positifs du script de détection en amont et ajoute une corrélation croisée des journaux.
Script de détection pour la contournement d'authentification cPanel/WHM (CVE-2026-41940) affectant toutes les versions de cPanel après la 11.40.
Il s'agit d'une réécriture du script de détection cPanel en amont avec des corrections pour les faux positifs et une corrélation de journaux ajoutée.
Analyse /var/cpanel/sessions/raw/ à la recherche de fichiers de session présentant des signes d'exploitation par injection de nouvelle ligne, puis recoupe les IP et jetons de session suspects avec les journaux d'accès/connexion/erreurs de cPanel. Analyse également l'access_log pour détecter une exploitation historique où le fichier de session a depuis expiré ou été purgé.
pass défectueuse qui génère des faux positifs sur chaque session authentifiée en production (l'expression correspond à tout champ pass= suivi d'une autre ligne, c'est-à-dire chaque fichier de session).method=badpass origin + TOUT attribut post-authentification au lieu d'exiger la combinaison étroite . Capture les variantes de PoC qui omettent .token_denied + cp_security_tokentoken_deniedPOST /login/?login_only=1 -> 401) avec l'utilisation ultérieure réussie d'un jeton cpsess depuis la même IP.--extended pour une analyse plus approfondie des journaux sur des sources supplémentaires.# Bash — fonctionne partout, sans dépendances
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — plus rapide sur les grands répertoires de sessions, prend en charge --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# Analyse étendue (l'une ou l'autre variante)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# Vérifier le code de sortie après exécution ($? = 0 propre, 1 IOC trouvés, 2 erreur d'environnement)
echo $?
Indicateurs curl :
-féchoue sur les erreurs HTTP au lieu de rediriger une page d'erreur vers bash,-ssilencieux (pas de barre de progression),-Saffiche quand même les erreurs malgré-s,-Lsuit les redirections.
La variante Python prend en charge --json pour une sortie structurée que vous pouvez rediriger vers jq, alimenter un SIEM, ou traiter par programmation.
# Sortie JSON complète
python3 ioc.py --json
# Juste les compteurs récapitulatifs
python3 ioc.py --json | jq '.counts'
# Lister tous les résultats CRITIQUES
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# Extraire les IP d'attaquant uniques
python3 ioc.py --json | jq '.suspect_ips[]'
# Afficher les résultats avec leurs IP sources (pour les listes de blocage pare-feu)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# Obtenir toutes les IP ayant eu une utilisation de jeton réussie (pour blocage immédiat)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# Alimenter les données de recoupement pour une IP spécifique
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
Exemple de structure 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 # par défaut (CRITIQUE/ÉLEVÉE développées, MOYENNE/AVERTISSEMENT comptées uniquement)
bash ioc.sh -v # verbeux (développer tous les résultats)
bash ioc.sh --extended # verbeux + journaux plus profonds + toutes les IP dans le recoupement
# Variante Python (même logique de détection, plus rapide, sortie structurée)
python3 ioc.py # par défaut (même comportement de repli que bash)
python3 ioc.py -v # verbeux
python3 ioc.py --extended # verbeux + journaux plus profonds
python3 ioc.py --json # JSON structuré (inclut toujours tous les résultats)
Doit être exécuté en tant que root sur le serveur cPanel cible. La variante Python nécessite Python 3.6+ (fourni avec CentOS 7 / CloudLinux 7+).
| Code | Signification |
|---|---|
| 0 | Aucun indicateur trouvé |
| 1 | IOC détectés |
| 2 | Erreur d'environnement (pas un serveur cPanel) |
MIT