
Descifra desafíos/respuestas MSCHAPv2 rápidamente usando una base de datos de hashes NT.
Rompe desafíos/respuestas de MSCHAPv2/NTLMv1 rápidamente usando una base de datos de hashes NT
Assless CHAPs es una forma eficiente de recuperar el hash NT utilizado en un intercambio MSCHAPv2/NTLMv1 si tienes el desafío y la respuesta (por ejemplo, de un ataque WiFi EAP WPE).
Requiere una base de datos de hashes NT; las instrucciones sobre cómo crearlos a partir de listas existentes o usando hashcat con listas de palabras y reglas están disponibles a continuación. He incluido una base de datos de ejemplo de SecLists. Necesitarás descomprimirla con bunzip.
Un intercambio MSCHAPv2 no requiere que la contraseña en texto claro sea "descifrada", sino que simplemente necesitamos el NThash utilizado.
MSCHAPv2 divide el NThash en tres partes, y usa cada parte como diferentes claves para cifrar con DES el mismo desafío (derivado de los desafíos del par y del autenticador). El NThash se divide en dos claves de 7 bytes y una clave de 2 bytes. Esto significa que la última clave se rellena con NULLs para hacer una clave de la longitud requerida. Esto se puede forzar rápidamente debido a la eficiencia de la operación DES y un espacio de claves de 65 535. Una vez que tenemos esos dos bytes, podemos buscar todos los NThashes en nuestra base de datos que terminen en esos dos bytes. Esto proporciona un conjunto mucho más pequeño de hashes posibles para verificar.
Esta es una forma de compromiso entre espacio y tiempo, similar a una tabla rainbow. También es una forma de hash shucking.
Esto se presentó por primera vez en Defcon 29's RF Hacking Village. Las diapositivas están incluidas en este repositorio.
Aquí está la comparación para tres desafíos/respuestas de muestra y tres listas de palabras diferentes: una pequeña privada, rockyou y la lista Have I Been Pwned. Se realizaron en mi Macbook Pro 2016. Hashcat está usando este kernel de hash shucking y las dos GPU integradas y un kernel puro en lugar de optimizado (ya que este último aún no existe). Hash3 no está en las listas para simular el peor rendimiento. No incluyo el tiempo que tarda hashcat en construir la caché del diccionario en la primera ejecución.
Hash1
Lista pequeña:
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
Lista rockyou:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
Lista HIBP:
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
Lista pequeña:
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
Lista rockyou:
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
Lista HIBP:
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 no existe en ninguna de las listas para simular el peor rendimiento de búsqueda.
Lista pequeña:
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
Lista rockyou:
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
Lista HIBP:
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
La versión en Rust requerirá SQLite 3.6.8 o más reciente.
La versión en Python requiere python3, sqlite3 y pycryptodome.
La utilidad de creación de base de datos requiere python3 y la CLI de sqlite3.
Esto solo aplica para la versión en Rust. Necesitarás cargo.
Con cargo instalado, simplemente cambia al directorio assless-chaps-rs y compílalo con:
cargo build --release
El binario resultante estará en el directorio target/release/.
Assless requiere el desafío, la respuesta y la base de datos de NThashes. Opcionalmente, la versión en Python puede usar el archivo de búsqueda de dos bytes optimizado incluido. El uso más simple es así:
./assless-chaps <Desafío> <Respuesta> <hashes.db>
Por ejemplo:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
La salida debería verse así:
[-] Archivo de búsqueda de dos bytes no proporcionado, se forzará en su lugar.
[+] Encontrado en 22636 intentos: 586c
[-] Se encontraron 222 hashes que terminan en 586c
[+] Hash encontrado: 8846f7eaee8fb1
[-] Encontrado después de 186 hashes.
[+] Hash encontrado: 17ad06bdd830b7
[+] Hash completo: 8846f7eaee8fb117ad06bdd830b7586c
El hash completo final 8846f7eaee8fb117ad06bdd830b7586c es el hash NT de password.
Pasé algún tiempo construyendo una lista de los 65 535 posibles valores de dos bytes ordenados por los más frecuentes en un gran corpus de contraseñas. Este archivo está incluido como twobytes. Puedes pasarlo como el cuarto argumento a assless.
Esto normalmente ahorra algunas rondas de DES, pero no supone una gran diferencia de velocidad. Podría ser útil si estás procesando muchos hashes.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Encontrado en 65533 intentos: 586c
[-] Se encontraron 222 hashes que terminan en 586c
[+] Hash encontrado: 8846f7eaee8fb1
[-] Encontrado después de 186 hashes.
[+] Hash encontrado: 17ad06bdd830b7
[+] Hash completo: 8846f7eaee8fb117ad06bdd830b7586c
El archivo mksqlitedb.py ayudará a convertir un archivo CSV de hashes en la base de datos.
python3 mksqlitedb.py <nombre de la base de datos> <archivo csv>
El archivo CSV requiere tres columnas:
Por ejemplo, el hash 8846f7eaee8fb117ad06bdd830b7586c se convertirá en:
586c,8846f7eaee8fb1,17ad06bdd830b7
Una transformación de ejemplo con regexp para esto sería:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Puedes tomar una lista existente de hashes (como las listas de Have I Been Pwned) o generar las tuyas propias a partir de hashcat y tus combinaciones favoritas de listas de palabras/reglas.
Las listas de contraseñas HIBP ya se pueden descargar como hashes NT, solo es necesario eliminar el conteo del archivo y convertirlas al formato CSV para importarlas a la base de datos.
Esto se puede hacer con la utilidad estándar de Unix sed de la siguiente manera:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
Después de eso, se puede importar usando mksqlitedb.py hibp.db hibp.csv.
Para convertir una lista de palabras directamente en una lista de hashes de nthashes, puedes usar nthasher que puede manejar listas grandes rápidamente. Los hashes resultantes deberán convertirse al formato CSV requerido como se describió anteriormente.
En este repositorio se incluye un nthasher mucho más lento que generará los hashes directamente en el formato CSV requerido, y se ejecuta simplemente con:
python3 nthash-from-clear.py <lista_de_palabras> > hashlist.csv
Si deseas expandir la lista de palabras con reglas, consulta la siguiente sección sobre el uso de hashcat.
Necesitarás hacer un pequeño cambio en el módulo OpenCL del modo 1000 para que genere todos los hashes, en lugar de solo aquellos que coinciden con tu candidato de crack. Por defecto, generará el hash en el formato CSV correcto requerido.
OpenCL de hashcat: cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvLa base de datos SQLite suele ser un 61% más grande que el archivo CSV utilizado para crearla. También puede llevar tiempo crear la base de datos dependiendo del tamaño de los archivos. Prepara los requisitos de tu sistema de archivos en consecuencia.
Aquí hay un ejemplo usando el diccionario rockyou:
Podrías ahorrar espacio convirtiendo e insertando cada hash dinámicamente y omitiendo la necesidad del archivo CSV intermedio.
NTLMv1 funcionará exactamente de la misma manera, a menos que esté usando SSP. Sabrás si se está usando SSP si obtienes una respuesta LM que termina en un montón de ceros. Puedes usar el archivo incluido ntlm-ssp.py para producir el desafío del servidor que assless necesitará.
Ejecútalo así:
python3 ntlm-ssp.py <respuesta lm> <desafío>
Por ejemplo, si usamos el ejemplo de desafío/respuesta NTLMv1-SSP de los hashes de ejemplo de hashcat:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
Pasarías el LM y el desafío así:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
Y obtendrías la siguiente respuesta:
El desafío del servidor es: 724edf24aea0d68b
Que luego se puede descifrar con assless-chaps como de costumbre:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db