Clase 080 — Cracking de contraseñas con John y Hashcat

Parte: 3 — Hacking ético y pentesting: metodología · Fuente: Documentación oficial de Hashcat y John the Ripper (Openwall); NIST SP 800-63B ⏱️ Duración estimada: 130 min · Nivel: Avanzado


🎯 Objetivo

El alumno aprenderá a recuperar contraseñas en texto claro a partir de hashes obtenidos legítimamente en un laboratorio, usando John the Ripper y Hashcat: identificar el tipo de hash correcto, elegir entre ataque de diccionario, reglas de mutación, máscara o híbrido, aprovechar la aceleración por GPU, y a partir de los resultados evaluar la fortaleza real de la política de contraseñas de una organización.

📚 Resultados de aprendizaje

Al finalizar, el alumno podrá:

  1. Identificar correctamente el tipo de hash y su modo correspondiente en Hashcat (-m) y John (--format).
  2. Ejecutar ataques de diccionario, de reglas, de máscara e híbridos según el contexto del hash.
  3. Configurar y aprovechar la aceleración por GPU en Hashcat frente al uso de CPU.
  4. Aplicar reglas de mutación conocidas (best64, rockyou-30000) sobre wordlists estándar como rockyou.txt.
  5. Explicar por qué los KDF lentos (bcrypt, scrypt, Argon2) resisten el cracking masivo por diseño.
  6. Redactar una recomendación de política de contraseñas basada en los resultados obtenidos.

🗺️ Temas

# Tema Por qué importa
1 Identificación del tipo de hash Un modo incorrecto en Hashcat/John no produce ningún resultado
2 Ataque de diccionario El método más eficiente contra contraseñas elegidas por humanos
3 Reglas de mutación Transforman password en variantes como P@ssw0rd! automáticamente
4 Ataques de máscara Fuerza bruta dirigida por un patrón conocido, mucho más eficiente que la fuerza bruta pura
5 Ataques híbridos Combinan diccionario y máscara para cubrir patrones parcialmente predecibles
6 Aceleración por GPU Diferencia de varios órdenes de magnitud frente al cracking por CPU
7 Salting y rainbow tables El salt individual por hash inutiliza las tablas precomputadas
8 KDF lentos (bcrypt/Argon2) Diseñados deliberadamente para hacer inviable el cracking a escala

🧠 Explicación en profundidad

Los hashes robados solo valen si se rompen (o se reutilizan)

La post-explotación y la enumeración producen hashes de contraseñas. Algunos se reutilizan directamente (Pass-the-Hash, Clase 078), pero muchos —los de servicios web, los de aplicaciones, los que hay que usar en un portal— necesitan la contraseña en claro, y recuperarla es el cracking. La idea es la de la Clase 057 vista desde el lado ofensivo: como un hash no se invierte, se hashean candidatos hasta encontrar uno que coincida. Todo el arte está en generar buenos candidatos rápido.

El primer paso, y el que más se falla, es identificar el tipo de hash. John the Ripper y Hashcat necesitan saber el algoritmo exacto (NTLM, MD5, bcrypt, SHA-512crypt…) para elegir el modo correcto; un modo equivocado no produce ningún resultado, y el pentester novato pasa horas atacando con el algoritmo incorrecto. Herramientas como hashid o hash-identifier ayudan, pero el contexto (de dónde salió el hash) suele ser la mejor pista.

lista de palabras

diccionario + transformaciones

patron conocido

mezcla

MD5/NTLM/SHA rapido

bcrypt/Argon2

Hash capturado

Identificar el algoritmo
NTLM, bcrypt, SHA-512crypt...

Estrategia de candidatos

Diccionario
rockyou + wordlists tematicas

Reglas de mutacion
password -> P@ssw0rd!

Mascara
fuerza bruta dirigida

Hibrido
diccionario + mascara

Aceleracion por GPU
ordenes de magnitud mas rapida

El KDF es lento?

Se rompe

Inviable a escala

Diccionario, reglas, máscara e híbrido: de lo probable a lo exhaustivo

Los humanos eligen contraseñas predecibles, y la estrategia de cracking lo explota en orden de eficiencia. El ataque de diccionario prueba listas de contraseñas conocidas —rockyou es la clásica, con millones de contraseñas reales filtradas— y resuelve la mayoría de los casos porque la gente reutiliza las mismas. Las reglas de mutación multiplican ese diccionario aplicando transformaciones que imitan cómo la gente "fortalece" sus contraseñas: password → Password1, P@ssw0rd!, password2024. Los ataques de máscara son fuerza bruta dirigida por un patrón conocido (?u?l?l?l?l?l?d?d = mayúscula, cinco minúsculas, dos dígitos): al acotar el espacio, son mucho más rápidos que la fuerza bruta ciega. Y los ataques híbridos combinan diccionario y máscara (una palabra del diccionario seguida de dos dígitos), cubriendo el patrón humano más común de todos.

GPU y KDF: la carrera armamentística

La aceleración por GPU es lo que hace el cracking viable: una tarjeta gráfica prueba miles de millones de candidatos por segundo contra un hash rápido, órdenes de magnitud por encima de una CPU. Contra MD5, SHA-1, NTLM o SHA-256 —hashes rápidos, pensados para velocidad— esto es demoledor: contraseñas mediocres caen en segundos. Aquí es donde se cierra el círculo con la Parte 2: los KDF lentos y memory-hard (bcrypt, scrypt, Argon2) están diseñados precisamente para que esta aceleración no sirva, encareciendo cada intento hasta hacer el ataque inviable a escala. Y el salt individual por hash (la Clase 057) inutiliza las rainbow tables, obligando a atacar cada hash por separado.

El valor de esta clase para el pentest es doble. Por un lado, recuperar contraseñas reales que permiten avanzar. Por otro —y más importante para el informe— medir la resistencia real de las contraseñas de la organización: cuántas cayeron, en cuánto tiempo, y con qué patrones, es una métrica de riesgo mucho más elocuente que "la política exige ocho caracteres". Y la frontera ética es la de siempre: se crackean solo hashes propios o del alcance autorizado (Clase 025); hacerlo sobre credenciales ajenas es delito.

📖 Definiciones y características

📔 Glosario

Término Definición concisa
Cracking Recuperar la contraseña en claro a partir de su hash
Identificación de hash Determinar el algoritmo antes de atacar
John the Ripper / Hashcat Herramientas de cracking (CPU y GPU)
Ataque de diccionario Probar listas de contraseñas conocidas
rockyou Diccionario clásico de contraseñas filtradas
Reglas de mutación Transforman el diccionario imitando hábitos humanos
Ataque de máscara Fuerza bruta dirigida por un patrón conocido
Ataque híbrido Combina diccionario y máscara
Aceleración por GPU Miles de millones de candidatos por segundo
Hash rápido MD5, NTLM, SHA-*; vulnerable al cracking a escala
KDF lento bcrypt, scrypt, Argon2; diseñado para resistir el cracking
Salt Valor único por hash que inutiliza las rainbow tables
Rainbow table Tabla precomputada; el salt la inutiliza
Métrica de resistencia Cuántas contraseñas caen y en cuánto tiempo

🧰 Herramientas y preparación

🧪 Laboratorio guiado

El cracking de contraseñas se practica exclusivamente sobre hashes propios o extraídos en un engagement autorizado por escrito. Las contraseñas recuperadas son datos altamente sensibles: se documentan únicamente para demostrar impacto y deben destruirse al cerrar el laboratorio o el contrato, nunca reutilizarse fuera del alcance acordado.

  1. Identifica el tipo de hash antes de cualquier ataque: hashcat --identify hashes.txt o hashid '$1$xyz$abc...'.
  2. Lanza un ataque de diccionario puro con Hashcat (ejemplo para NTLM, modo 1000): hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt.
  3. Repite el ataque añadiendo reglas de mutación: hashcat -m 1000 -a 0 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule.
  4. Ejecuta un ataque de máscara para contraseñas de 8 caracteres con patrón letra+dígito: hashcat -m 1000 -a 3 hashes.txt '?l?l?l?l?d?d?d?d'.
  5. Prueba un ataque híbrido diccionario más máscara (por ejemplo, palabra + año): hashcat -m 1000 -a 6 hashes.txt rockyou.txt '?d?d?d?d'.
  6. Repite el proceso con John the Ripper, que autodetecta el formato: john --wordlist=rockyou.txt hashes.txt y consulta resultados con john --show hashes.txt.
  7. Verifica los resultados acumulados en Hashcat: hashcat -m 1000 hashes.txt --show.
  8. Compara la velocidad reportada por Hashcat en CPU (-D 1) frente a GPU (-D 2) si tu laboratorio dispone de una GPU dedicada.
  9. Genera un hash bcrypt de práctica con mkpasswd -m bcrypt y compara el tiempo de un solo intento de crackeo frente a un hash NTLM equivalente.
  10. Si dispones de una captura de laboratorio propio, convierte un handshake WPA con hcxpcapngtool al formato Hashcat (-m 22000) y ejecuta un ataque de diccionario sobre él.
  11. Clasifica cada contraseña recuperada según su debilidad (palabra de diccionario simple, patrón año+símbolo, reutilización evidente) y redacta una recomendación de política.

✍️ Ejercicios

  1. Identifica tres tipos de hash distintos (por ejemplo NTLM, MD5 y bcrypt) y anota su modo -m correspondiente en Hashcat.
  2. Compara la tasa de éxito de un ataque de diccionario puro frente a diccionario más regla best64 sobre el mismo conjunto de hashes.
  3. Diseña una máscara Hashcat para contraseñas del patrón Nombre2024! y ejecútala.
  4. Ejecuta un ataque híbrido (-a 6 o -a 7) combinando diccionario y máscara.
  5. Mide aproximadamente la diferencia de velocidad (hashes por segundo) entre CPU y GPU para el mismo modo de hash.
  6. Explica por qué un hash bcrypt con factor de coste 12 cambia radicalmente la estrategia de ataque frente a un NTLM.

📝 Reto verificable

Reto: a partir de un conjunto de hashes de tu laboratorio (mínimo 10, con al menos dos tipos distintos), crackea el máximo número posible y produce un informe de fortaleza de contraseñas.

Criterio de aceptación: el alumno documenta el tipo de hash de cada conjunto, el ataque exacto usado para crackearlo, el porcentaje total recuperado, una clasificación de las contraseñas obtenidas por nivel de debilidad, y una recomendación concreta de política de contraseñas (longitud mínima, uso de MFA, prohibición de patrones comunes).

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Hashcat reporta "No hashes loaded" El modo -m no coincide con el formato real del hash; confirmar con hashcat --identify
Hashcat reporta "Separator unmatched" El archivo mezcla formatos (usuario:hash y hash suelto); limpiar el archivo dejando un formato consistente
Velocidad de cracking muy baja e inesperada El hash usa un KDF lento por diseño (bcrypt/Argon2) o no hay GPU disponible; ajustar expectativas de tiempo
John no detecta el formato automáticamente Especificar el formato manualmente con --format=nt o el que corresponda
rockyou.txt no se encuentra Falta descomprimir /usr/share/wordlists/rockyou.txt.gz con gunzip -k primero
Ataque de máscara tarda demasiado El patrón elegido es demasiado amplio; reducir el espacio con suposiciones más específicas sobre longitud y conjunto de caracteres

❓ Preguntas frecuentes

❓ ¿Debo usar John the Ripper o Hashcat? John destaca en CPU, en la variedad de formatos soportados y en su autodetección cómoda. Hashcat domina en velocidad bruta cuando hay GPU disponible. En la práctica profesional se usan ambos según el hash y el hardware disponible.

❓ ¿Por qué no logro crackear un hash bcrypt o Argon2? Porque están diseñados deliberadamente para ser lentos y usar salt individual; cada intento de contraseña cuesta un cómputo significativo, a diferencia de MD5 o NTLM que permiten miles de millones de intentos por segundo. Esa lentitud es precisamente su mecanismo de defensa.

❓ ¿Realmente ayudan tanto las reglas de mutación? Sí, de forma considerable: la mayoría de contraseñas humanas son una palabra base con una mutación predecible (mayúscula inicial, año al final, símbolo de cierre). Reglas como best64 capturan exactamente esos patrones observados en filtraciones reales.

❓ Qué debo hacer con las contraseñas que logro crackear en un engagement real? Se documentan únicamente para demostrar impacto (por ejemplo, reutilización de credenciales o política débil) en el informe entregado al cliente, y se destruyen de forma segura al cierre del compromiso, conforme a lo pactado en las reglas de engagement.

❓ ¿Por qué la longitud importa más que la complejidad en una política de contraseñas? Porque cada carácter adicional multiplica exponencialmente el espacio de búsqueda, mientras que exigir mayúsculas/símbolos suele producir patrones predecibles (mayúscula inicial, símbolo final) que las reglas de mutación ya anticipan; NIST SP 800-63B refleja este cambio de enfoque.

🔗 Referencias

📥 Material descargable

⬅️ Clase anterior

Clase 079 — Pivoting y reenvío de puertos

➡️ Siguiente clase

Clase 081 — Ataques a credenciales: fuerza bruta y password spraying