Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
assless-chaps — Descifra desafíos/respuestas MSCHAPv2 rápidamente usando una base de datos de hashes NT. | Kitploit
Herramientas/GitHubGitHub/sensepost/assless-chaps
Descifrado de ContraseñasAuditoría Wi-FiAnálisis de HashCriptografíaPruebas de Penetración
GitHubsensepost/assless-chaps

assless-chaps

Descifra desafíos/respuestas MSCHAPv2 rápidamente usando una base de datos de hashes NT.

Ver Repositorio
14119hace 28 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

assless-chaps

Rompe desafíos/respuestas de MSCHAPv2/NTLMv1 rápidamente usando una base de datos de hashes NT

Introducción

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.

Técnica

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.

Presentación

Esto se presentó por primera vez en Defcon 29's RF Hacking Village. Las diapositivas están incluidas en este repositorio.

Velocidad

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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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

Instalación

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.

Compilación

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/.

Uso

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í:

root@kitploit:~
[-] 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.

Búsqueda de dos bytes - Solo Python

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

root@kitploit:~
[+] 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

Creando tu propio diccionario de hashes

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:

  • Los últimos dos bytes del hash (los últimos cuatro caracteres ASCII)
  • Los primeros 7 bytes (los primeros 14 caracteres ASCII)
  • Los segundos 7 bytes (los caracteres ASCII 15-29)

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.

Usando Have I Been Pwned

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.

Convirtiendo una lista de palabras en una lista de hashes

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.

Usando hashcat para crear un archivo CSV de hashes a partir de listas de palabras y reglas

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.

  • Cambia al directorio OpenCL de hashcat: cd hashcat/OpenCL
  • Aplica el parche: patch < m01000_a0-pure.cl.patch
  • Prepara un archivo con un hash NT imposible de descifrar, por ejemplo echo 11111111111111111111111111111111 > impossible_hash
  • Descifra como de costumbre, pero desactiva tu potfile y redirige la salida a un archivo: hashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csv
  • Crea tu base de datos de hashes: python3 mksqlitedb.py rockyou.db rockyou.csv

Nota sobre espacio en disco y tamaños de archivo

La 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:

  • Diccionario base rockyou 129M
  • rockyou.csv generado por hashcat 462M
  • Base de datos SQLite resultante rockyou.db 746M
  • rockyou.db.bz2 con compresión máxima BZip2 339M

Podrías ahorrar espacio convirtiendo e insertando cada hash dinámicamente y omitiendo la necesidad del archivo CSV intermedio.

NTLMv1 SSP

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

Descargar herramienta