
OpenSSH jusqu'à la version 7.7 permet à des attaquants distants d'énumérer les noms d'utilisateurs valides en envoyant des requêtes d'authentification malformées et en observant les réponses différentielles du serveur.
| Champ | Valeur |
|---|---|
| Logiciel concerné | OpenSSH 2.3 à 7.7 |
| CVSS v3.1 | 5.3 (Moyen) |
| Vecteur d'attaque | Réseau (distant, aucune authentification requise) |
| Cause racine | Le serveur ne retarde pas l'abandon pour les utilisateurs invalides jusqu'après l'analyse complète du paquet (auth2-gss.c, auth2-hostbased.c, auth2-pubkey.c) |
| Impact | Divulgation d'informations — énumération des noms d'utilisateurs valides |
exploit.py — Paquet malformé (rapide, multi-threadé)Envoie une requête SSH_MSG_USERAUTH_REQUEST tronquée (champ booléen supprimé). Les utilisateurs invalides déclenchent un abandon anticipé (USERAUTH_FAILURE), les utilisateurs valides provoquent la déconnexion du serveur.
exploit_timing.py — Attaque temporelle (plus lente, fonctionne sur les serveurs corrigés)Envoie un mot de passe très long (~100 Ko) via l'authentification par mot de passe. Les utilisateurs valides prennent plus de temps car le serveur hache le mot de passe avant de le rejeter, tandis que les utilisateurs invalides sont rejetés immédiatement. S'exécute de manière séquentielle et auto-calibre le seuil.
Utilisez ce script lorsque exploit.py renvoie des faux positifs (serveurs corrigés).
git clone <this-repo-url>
cd cve-2018-15473
pip install -r requirements.txt
# Malformed packet (try this first)
python3 exploit.py <target_ip> 22 <lhost> <lport> -u root
python3 exploit.py <target_ip> 22 <lhost> <lport> -w usernames.txt -t 8
# Timing attack (fallback for patched servers)
python3 exploit_timing.py <target_ip> 22 <lhost> <lport> -u root
python3 exploit_timing.py <target_ip> 22 <lhost> <lport> -w usernames.txt
| Argument | Description |
|---|
target_ip | Adresse IP du serveur SSH cible |
target_port | Port SSH cible (généralement 22) |
lhost | IP de l'attaquant (inutilisée, conservée pour la cohérence du modèle) |
lport | Port de l'attaquant (inutilisé, conservé pour la cohérence du modèle) |
-u, --username | Nom d'utilisateur unique à tester |
-w, --wordlist | Chemin vers un fichier de liste de mots (un nom d'utilisateur par ligne) |
-t, --threads | Nombre de threads (défaut : 4, exploit.py uniquement) |