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
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.
Al finalizar, el alumno podrá:
-m) y John (--format).| # | 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 |
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.
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.
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.
-m (por ejemplo, 1000 para NTLM); en John, al parámetro --format.best64, porque anticipan exactamente ese patrón; la longitud importa más que la complejidad forzada.?u?l?l?l?l?d?d?d?d (mayúscula, cuatro minúsculas, cuatro dígitos). Característica clave: reduce drásticamente el espacio de búsqueda frente a una fuerza bruta sin restricciones.| 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 |
sudo apt install john; ofrece autodetección de formato y es especialmente cómodo en CPU.sudo apt install hashcat; domina en velocidad cuando hay GPU disponible. Verifica los dispositivos con hashcat -I.gunzip -k /usr/share/wordlists/rockyou.txt.gz.best64.rule incluida por defecto en /usr/share/hashcat/rules/; también existen conjuntos más agresivos como rockyou-30000.rule.hashcat --identify: para determinar el tipo de hash antes de lanzar cualquier ataque.secretsdump.py de una VM propia, o hashes generados manualmente para práctica con openssl passwd o mkpasswd).-D 1) aunque más lento.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.
hashcat --identify hashes.txt o hashid '$1$xyz$abc...'.1000): hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt.hashcat -m 1000 -a 0 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule.hashcat -m 1000 -a 3 hashes.txt '?l?l?l?l?d?d?d?d'.hashcat -m 1000 -a 6 hashes.txt rockyou.txt '?d?d?d?d'.john --wordlist=rockyou.txt hashes.txt y consulta resultados con john --show hashes.txt.hashcat -m 1000 hashes.txt --show.-D 1) frente a GPU (-D 2) si tu laboratorio dispone de una GPU dedicada.mkpasswd -m bcrypt y compara el tiempo de un solo intento de crackeo frente a un hash NTLM equivalente.hcxpcapngtool al formato Hashcat (-m 22000) y ejecuta un ataque de diccionario sobre él.-m correspondiente en Hashcat.best64 sobre el mismo conjunto de hashes.Nombre2024! y ejecútala.-a 6 o -a 7) combinando diccionario y máscara.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).
| 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 |
❓ ¿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.
Clase 079 — Pivoting y reenvío de puertos
Clase 081 — Ataques a credenciales: fuerza bruta y password spraying