Cracking de hashes con hashcat y John the Ripper: modos, reglas, máscaras y ficheros protegidos
Identificar un hash, elegir el modo de hashcat (NTLM, NetNTLMv2, bcrypt, Kerberos), usar reglas y máscaras y crackear zip, KeePass o claves SSH con *2john.
Más de 100 máquinas del catálogo tienen un paso de cracking de hashes: un hash de una base de datos, de /etc/shadow, de Kerberos o un zip con contraseña. Casi nunca hace falta una GPU potente; hace falta elegir bien el modo y el diccionario. Tienes un identificador de hashes en el navegador en identificar hash.
1. Identificar el hash
nth --text '$2y$10$abc...' # name-that-hash
hashid -m '5f4dcc3b5aa765d61d8327deb882cf99'
hashcat --identify hash.txt # hashcat 6.2.6 o posterior
Por el formato se reconocen casi todos:
| Aspecto | Qué es | hashcat -m |
|---|---|---|
| 32 hex | MD5 (o NTLM, según de dónde venga) | 0 / 1000 |
| 40 hex | SHA1 | 100 |
| 64 hex | SHA256 | 1400 |
$1$... |
md5crypt (Linux antiguo) | 500 |
$5$... |
sha256crypt | 7400 |
$6$... |
sha512crypt (Linux) | 1800 |
$y$... |
yescrypt (Debian 11+, Ubuntu 22.04+) | No: usa John |
$2a$, $2b$, $2y$ |
bcrypt | 3200 |
usuario::DOMINIO:... |
NetNTLMv2 (Responder) | 5600 |
$krb5asrep$23$ |
AS-REP | 18200 |
$krb5tgs$23$ |
Kerberoast (RC4) | 13100 |
eyJ... (3 partes) |
JWT HS256 | 16500 |
pbkdf2_sha256$... |
Django | 10000 |
Truco
Un hash de 32 caracteres que sale de secretsdump o de un SAM es NTLM (-m 1000), no MD5. Y si viene de una aplicación web, mira el código: puede llevar sal (md5($sal.$pass) es -m 20, md5($pass.$sal) es -m 10).
2. Ataque de diccionario
hashcat -m 1000 hashes.txt /usr/share/wordlists/rockyou.txt
hashcat -m 1000 hashes.txt rockyou.txt --show # lo ya crackeado
john --wordlist=rockyou.txt hashes.txt
john --show hashes.txt
Con /etc/shadow, John necesita juntarlo con /etc/passwd:
unshadow passwd shadow > unshadowed.txt
john --wordlist=rockyou.txt unshadowed.txt
john --format=crypt --wordlist=rockyou.txt unshadowed.txt # para yescrypt
3. Reglas: cuando rockyou no basta
Las reglas transforman cada palabra (mayúsculas, números al final, leet). Multiplican los intentos pero aciertan mucho más con contraseñas "corporativas":
hashcat -m 1000 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 1000 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/OneRuleToRuleThemAll.rule
john --wordlist=rockyou.txt --rules=Jumbo hashes.txt
Diccionario a medida: el nombre de la empresa, de la máquina, de los usuarios, la estación y el año.
cewl http://objetivo.htb -d 2 -m 5 -w palabras.txt # palabras de la propia web
hashcat --stdout palabras.txt -r best64.rule > lista.txt
4. Máscaras: cuando sabes el patrón
Si la política exige "mayúscula, minúsculas y cuatro números" o has visto que las contraseñas son Empresa2024!:
# ?u mayúscula ?l minúscula ?d número ?s símbolo ?a cualquiera
hashcat -m 1000 -a 3 hashes.txt '?u?l?l?l?l?l?d?d?d?d'
hashcat -m 1000 -a 3 hashes.txt 'Empresa?d?d?d?d?s'
# Diccionario + máscara (palabra seguida de 4 cifras)
hashcat -m 1000 -a 6 hashes.txt palabras.txt '?d?d?d?d'
5. Ficheros protegidos: las herramientas *2john
John trae un conversor para casi cualquier fichero con contraseña. Convierte y crackea:
zip2john copia.zip > zip.hash
rar2john copia.rar > rar.hash
keepass2john Base.kdbx > kp.hash
ssh2john id_rsa > ssh.hash
pdf2john informe.pdf > pdf.hash
office2john documento.docx > office.hash
7z2john backup.7z > 7z.hash # necesita el módulo de Perl Compress::Raw::Lzma
john --wordlist=rockyou.txt zip.hash
Para hashcat, quita el nombre del fichero del principio de la línea y busca el modo con hashcat --example-hashes | grep -i keepass. Ejemplos: en Access, un zip con la contraseña dentro de una base de datos; en Active, un ticket de Kerberoast (guía de Kerberoasting).
6. Rendimiento
- Hashes rápidos (MD5, NTLM, SHA1): millones o miles de millones por segundo. Prueba diccionario con reglas grandes y máscaras.
- Hashes lentos (bcrypt, sha512crypt, KeePass, Kerberos AES): miles por segundo. Solo diccionario corto y bien elegido. Si rockyou entero va a tardar días, en un CTF casi seguro que la vía no es esa.
- Sin GPU (por ejemplo, en una máquina virtual), John suele ir más rápido que hashcat en CPU para hashes lentos.
hashcat -b -m 3200 # cuánto va a tardar en tu equipo
hashcat ... -O -w 3 # kernels optimizados y más carga de trabajo
Errores típicos
Token length exception: el formato del fichero no es el que espera ese modo (espacios, el nombre de usuario delante, o el modo equivocado). Usa--usernamesi las líneas sonusuario:hash.No hashes loadeden John: indícale el formato con--format=(john --list=formats).- Crackea en John pero no en hashcat (o al revés): algunos formatos tienen variantes; mira
--example-hashesy compara con el tuyo carácter a carácter.
Y después
Una contraseña crackeada vale para más que una cuenta: pruébala en todos los usuarios y servicios (reutilización de contraseñas). En un dominio, un spray con ella puede abrir varias cuentas a la vez (enumeración de AD y password spraying).