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

📖 Definiciones y características

🧰 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