
MSCHAPv2-Challenge/Response schnell mit einer Datenbank von NT-Hashes knacken.
Knacken von MSCHAPv2/NTLMv1 Challenge/Response schnell mit einer Datenbank von NT-Hashes
Assless CHAPs ist eine effiziente Methode, um den NT-Hash wiederherzustellen, der in einem MSCHAPv2/NTLMv1-Austausch verwendet wird, wenn du die Challenge und Response hast (z. B. von einem WiFi EAP WPE-Angriff).
Es erfordert eine Datenbank von NT-Hashes; Anleitungen zur Erstellung dieser aus vorhandenen Listen oder mit hashcat mit Wortlisten und Regeln findest du weiter unten. Ich habe eine Beispieldatenbank von SecLists beigefügt. Du musst sie entpacken (bunzip).
Ein MSCHAPv2-Austausch erfordert nicht, dass das Klartext-Passwort „geknackt“ wird, sondern wir benötigen lediglich den verwendeten NThash.
MSCHAPv2 teilt den NThash in drei Teile auf und verwendet jeden Teil als unterschiedlichen Schlüssel zur DES-Verschlüsselung derselben Challenge (abgeleitet von der Peer- und Authentifikator-Challenge). Der NTHash wird in zwei 7-Byte-Schlüssel und einen 2-Byte-Schlüssel aufgeteilt. Das bedeutet, dass der letzte Schlüssel mit NULLs aufgefüllt wird, um einen Schlüssel der erforderlichen Länge zu erhalten. Dieser kann aufgrund der Effizienz der DES-Operation und eines Schlüsselraums von 65.535 schnell brute-forced werden. Sobald wir diese zwei Bytes haben, können wir alle NThashes in unserer Datenbank nachschlagen, die auf diese zwei Bytes enden. Dies ergibt eine viel kleinere Menge möglicher Hashes zur Überprüfung.
Dies ist eine Form des Speicher-Zeit-Kompromisses, ähnlich einer Regenbogentabelle. Es ist auch eine Form des Hash Shuckings.
Dies wurde zum ersten Mal auf dem RF Hacking Village der Defcon 29 vorgestellt. Die Folien sind in diesem Repository enthalten.
Hier ist der Vergleich für drei Beispiel-Challenge/Response und drei verschiedene Wortlisten, eine kleine private, rockyou und die Have I Been Pwned-Liste. Diese wurden auf meinem Macbook Pro 2016 durchgeführt. Hashcat verwendet diesen Hash-Shucking-Kernel und die beiden integrierten GPUs sowie einen reinen statt optimierten Kernel (da letzterer noch nicht existiert). Hash3 ist nicht in den Listen enthalten, um die Leistung im ungünstigsten Fall zu simulieren. Ich habe die Zeit, die Hashcat benötigt, um den Wörterbuch-Cache beim ersten Durchlauf aufzubauen, nicht mit einbezogen.
Hash1
Kleine Hashliste:
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Rockyou-Hashliste:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
HIBP-Hashliste:
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash 2
Kleine Hashliste:
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Rockyou-Hashliste:
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
HIBP-Hashliste:
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash 3
Hash 3 existiert in keiner der Hashlisten, um die Leistung im ungünstigsten Fall zu simulieren.
Kleine Hashliste:
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Rockyou-Hashliste:
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
HIBP-Hashliste:
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
Die Rust-Version erfordert SQLite 3.6.8 oder neuer.
Die Python-Version erfordert python3, sqlite3 und pycryptodome.
Das Dienstprogramm zur Datenbankerstellung erfordert python3 und das sqlite3 CLI.
Dies gilt nur für die Rust-Version. Du benötigst cargo.
Nach der Installation von cargo wechsle einfach in das assless-chaps-rs-Verzeichnis und baue es mit:
cargo build --release
Das resultierende Binary befindet sich im Verzeichnis target/release/.
Assless benötigt die Challenge, Response und eine Datenbank von NThashes. Optional kann die Python-Version die gebündelte optimierte Zwei-Byte-Nachschlagdatei verwenden. Die einfachste Verwendung sieht so aus:
./assless-chaps <Challenge> <Response> <hashes.db>
Zum Beispiel:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
Die Ausgabe sollte wie folgt aussehen:
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
Der endgültige vollständige Hash 8846f7eaee8fb117ad06bdd830b7586c ist der NT-Hash für password.
Ich habe einige Zeit damit verbracht, eine Liste aller 65.535 möglichen Zwei-Byte-Werte zu erstellen, sortiert nach der häufigsten Verwendung in einem großen Korpus von Passwörtern. Diese Datei ist als twobytes enthalten. Du kannst sie einfach als viertes Argument an assless übergeben.
Dies spart normalerweise ein paar Runden DES, macht aber keinen großen Geschwindigkeitsunterschied. Vielleicht, wenn du viele Hashes verarbeitest.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
Die Datei mksqlitedb.py hilft dabei, eine CSV-Hashdatei in die Datenbank umzuwandeln.
python3 mksqlitedb.py <database name> <csv file>
Die CSV-Datei erfordert drei Spalten:
Zum Beispiel wird der Hash 8846f7eaee8fb117ad06bdd830b7586c zu:
586c,8846f7eaee8fb1,17ad06bdd830b7
Ein Beispiel für eine Regexp-Transformation dafür wäre:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Du kannst entweder eine vorhandene Liste von Hashes nehmen (wie die Have I Been Pwned-Listen) oder deine eigenen mit hashcat und deinen bevorzugten Wortlisten/Regel-Kombinationen erstellen.
Die HIBP-Passwortlisten sind bereits als NT-Hashes herunterladbar; man muss lediglich die Anzahl aus der Datei entfernen und sie in das CSV-Format konvertieren, um sie in die Datenbank zu importieren.
Dies kann mit dem standardmäßigen Unix-Dienstprogramm sed wie folgt erledigt werden:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
Danach kann es mit mksqlitedb.py hibp.db hibp.csv importiert werden.
Um eine reine Wortliste in eine Hashliste von nthashes zu konvertieren, kannst du nthasher verwenden, das große Wortlisten schnell verarbeiten kann. Die resultierenden Hashes müssen wie oben beschrieben in das erforderliche CSV-Format umgewandelt werden.