
NTLMv1 Multitool
Esta herramienta revierte hashes NTLMv1 a NTLM o, más específicamente, formatea las respuestas al desafío NTLMv1 en un formato que puede crackearse con el modo 14000 de hashcat.
Si especificas --ct3, calculará los últimos 4 dígitos del NTLM por ti; si especificas --json, --ct3 está implícito y lo devolverá como el elemento pt3, por ejemplo:
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"}
Por último, en esta actualización he movido las funciones a main() para que puedas importar el módulo y usarlo directamente.
Añadí 2 nuevas opciones, --hashcat y --hcutils, que establecen la ruta a tu hashcat y hashcat-utils respectivamente, de modo que puedes hacer un copiar y pegar directo desde la herramienta.
Ejecutarías la herramienta así si tu directorio de hashcat estuviera en ~/git/hashcat y tu directorio de hashcat-utils estuviera en ~/git/hashcat-utils:
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
Sí, esto es supuestamente compatible con python 3; también he fusionado ntlmv1 y ntlmv1-ess.
NTLMv1 Multitool
Esta herramienta modifica hashes NTLMv1/NTLMv1-ESS/MSCHAPv2 para que puedan crackearse con el modo DES 14000 en hashcat.
Esta herramienta se basa en el trabajo realizado por atom, del equipo Hashcat https://hashcat.net/forum/thread-5832.html
También se basa en https://hashcat.net/forum/thread-5912.html y https://www.youtube.com/watch?v=LIHACAct2vo
Instala la herramienta de nueva generación ntlmv1_nextgen.py como comando global ntlmv1-multi con uv:
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
O ejecútala directamente desde el repositorio sin instalarla:
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
El proyecto incluye un pyproject.toml (dependencia pycryptodome, Python 3.14+) por lo que
uv resuelve todo por ti; el ntlmv1.py original sigue ejecutándose de forma independiente
con cualquier intérprete de Python 3.
ntlmv1_nextgen.py)ntlmv1_nextgen.py (instalado como el comando ntlmv1-multi) es el analizador
moderno. Acepta NTLMv1, blobs $99$ y MSCHAPv2, maneja ESS automáticamente
y puede completar la conversión completa de NTLMv1 -> NTLM a partir de un potfile crackeado en un solo
paso. Opciones disponibles:
Para capturar, usa responder con la bandera --lm; sin --lm activarás ESS, lo que tardará más en crackear. También hay una nueva bandera, --disable-ess, que intentará deshabilitar ESS y forzar la degradación. Prueba primero --disable-ess y, si falla, prueba --lm. Si usas --disable-ess o --lm, asegúrate de que tu desafío de cliente sea 1122334455667788 para usar la FPGA; sin embargo, esto puede activar algunas protecciones de IDS/IPS de red si ven ese tráfico.
La captura se verá así.
[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 del hash se ve así
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Así que usa la multi herramienta de esta manera (también es compatible con python 2)
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Generará los siguientes datos sin modificar los desafíos del servidor, 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
La contraseña usada en este caso es "password" y podemos verificar el hash NTLM con
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Con la utilidad ct3_to_ntlm.bin de hashcat-utils que escribió atom, puedes calcular los últimos 4 caracteres del hash NTLM a partir del desafío NTLMv1, que la herramienta muestra.
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
Esto coincide con el final del hash NTLM, así que estamos listos; el siguiente paso es crackear los hashes con hashcat, por lo que necesitamos crear un archivo hashes.txt con
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
Para crackear esto con hashcat usa
./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 es que hashcat devolverá claves DES y no claves NTLM; tendrás que convertirlas a NTLM usando deskey_to_ntlm.pl de Hashcat Utils, lo cual se puede hacer con
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Luego combinas las dos claves NTLM con la tercera parte de la contraseña, calculada por (lo que la herramienta genere)
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
Suma esas 3 partes y listo.
Si solo estás probando mi código y ya conoces la contraseña, puedes usar el conversor des
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Básicamente haces lo siguiente
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
./hashcat -m 14000 -a 0 hashes.txt des.cand
Y deberías tener algunos hashes revertidos
ESS cambia el desafío del servidor; si ves ESS en tu responder porque no usaste --lm o el cliente está configurado para no entregar una respuesta LM, entonces ESS se activa. Además, --disable-ess intentará forzar la desactivación de ESS; sin embargo, esto requiere una copia reciente (agosto de 2021 o más reciente) de impacket y responder.
La salida de ESS se ve así
[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
El hash real se ve así
hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Para usar la herramienta, ejecuta (es compatible con python3)
python3 ntlmv1.py --ntlmv1 "hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788"
La herramienta generará
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
Ahora, la contraseña que usamos en este caso es password, que tiene un hash NTLM de b4b9b02e6f09a9bd760f388b67351e2b
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Así que para calcular los últimos 4 caracteres del hash NTLM para nuestro desafío NTLMv1-ESS usamos el siguiente comando de la salida de la herramienta para obtener 586c
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
Debemos crear un archivo de hashes con el siguiente contenido, según la herramienta, que tiene los desafíos SRV modificados para lidiar con ESS
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
Para crackear con hashcat usamos lo siguiente, según la herramienta
./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 es que hashcat devolverá claves DES y no claves NTLM; tendrás que convertirlas a NTLM usando deskey_to_ntlm.pl de Hashcat Utils, lo cual se puede hacer con
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Ahora, suponiendo que ya sabíamos cuál era el hash NTLM en este caso porque lo creamos nosotros y queremos validar la herramienta, usamos lo siguiente
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
Esto nos mostrará algunos datos
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
La parte importante aquí es
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Ahora podemos crackear con hashcat usando lo siguiente y sin esperar 8 días
./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
La herramienta ahora admite salida json; activa la bandera --json y generará una salida 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"}
Los campos importantes son:
Después de haber crackeado los hashes DES del modo 14000 con hashcat, las claves DES
crackeadas quedan en tu potfile como líneas ct:challenge:key (la clave normalmente se almacena
como $HEX[...] porque son bytes crudos). En lugar de copiar manualmente las claves
con --key1/--key2, apunta ntlmv1_nextgen.py al potfile y
recuperará las claves, las validará contra los textos cifrados y completará la
conversión NTLMv1 -> NTLM en un solo paso:
python3 ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788" --potfile ~/.local/share/hashcat/hashcat.potfile
El hash NTLM recuperado se muestra como el campo NTLM (o ntlm en --json).
--potfile funciona con --ntlmv1, --99 y --mschapv2, maneja hashes ESS
(emparejando con el desafío derivado de MD5) e ignora entradas de potfile no relacionadas.
Los --key1/--key2 explícitos siguen teniendo prioridad sobre las coincidencias del potfile.
Se aceptan potfiles tanto de hashcat como de rainbowcrackalack. El campo de clave crackeada
puede ser un blob $HEX[...] de hashcat, bytes imprimibles sin formato, una clave de 8 bytes en 16 hex sin formato,
o una clave de 7 bytes en 14 hex sin formato (la forma que emite rainbowcrackalack); todos se
normalizan y se vuelven a validar contra el texto cifrado antes de usarse.
Este repositorio se basa en publicaciones del foro de atom, el autor de hashcat, y en la investigación de moxie marlinspike. Como el código de atom está en gran parte bajo licencia MIT, este proyecto también ha adoptado esa licencia para ser compatible. Este proyecto no es GPL, de modo que cualquier entidad puede incorporarlo a un proyecto comercial sin restricciones.
| Opción | Descripción |
|---|
--ntlmv1 <hash> | Hash NTLMv1 en formato Responder (user::host:LM:NT:challenge). |
--99 <blob> | Blob base64 de estilo $99$. |
--mschapv2 <hash> | Hash MSCHAPv2 en formato John the Ripper. |
--nthash <hex> | Hash NTLM de 32 caracteres; deriva las claves DES y los candidatos de hashcat. |
--password <pw> | Deriva las claves DES --key1/--key2 a partir de una contraseña conocida. |
--key1 <hex> / --key2 <hex> | Proporciona las claves DES de 16 hex para CT1/CT2 directamente (tiene prioridad sobre --potfile). |
--potfile <path> | Potfile hashcat/rainbowcrackalack con claves del modo 14000 crackeadas; recupera key1/key2 automáticamente para completar la conversión NTLMv1 -> NTLM. |
--hashcat | Emite cadenas en formato hashcat para CT1/CT2. |
--json | Salida solo JSON (implica el cálculo de CT3). |