Hash Cracking
Las aplicaciones no guardan las contraseñas en claro, sino su hash: el resultado de una función unidireccional (no se puede invertir). Cuando conseguimos esos hashes (de una base de datos, de /etc/shadow, de un volcado de memoria), no podemos "descifrarlos", pero sí adivinar la contraseña de origen probando candidatos: hasheamos cada candidato y comparamos. A eso se le llama crackear.
Lo primero es identificar el algoritmo, porque determina la velocidad y el formato del ataque. Pistas habituales:
- 32 hex sin prefijo: suele ser MD5. Muy rápido de probar (miles de millones por segundo en GPU), por eso un MD5 sin sal de una contraseña de diccionario cae casi al instante.
- Prefijo
$2a$/$2y$/$2b$: bcrypt. Lento por diseño (factor de coste), pensado para resistir fuerza bruta; aun así, una contraseña débil cae. - Prefijo
$6$(SHA-512 crypt),$1$(MD5 crypt),$y$(yescrypt): formatos de/etc/shadow. - Prefijo
$P$: phpass, el formato de WordPress y otros CMS en PHP. - Prefijos
$krb5tgs$y$krb5asrep$: tickets de Kerberos obtenidos por Kerberoasting o AS-REP Roasting.
El prefijo es la pista fiable; cuando no lo hay (un hexadecimal pelado puede ser MD5, NTLM o SHA-1 truncado), se contrasta por longitud y contexto, o se le pregunta a una herramienta:
hashid '$P$BSNPjhY.6vQMhxsFxrbFdRAeDsAe.a0' # propone los formatos candidatos
john --list=formats | tr ',' '\n' | grep -i phpass # nombre exacto para --format=
hashcat --help | grep -i phpass # numero exacto para -mLas dos herramientas estándar son john (John the Ripper) y hashcat. Modo principal: por diccionario, probando una lista de contraseñas conocidas (la clásica es rockyou.txt):
john --wordlist=rockyou.txt --format=Raw-MD5 hashes.txt
john --show hashes.txt # vuelve a mostrar lo ya crackeado (queda en ~/.john/john.pot)
hashcat -m 0 -a 0 hashes.txt rockyou.txtEl parámetro de formato (--format= en john, -m en hashcat) debe coincidir con el algoritmo, y no es un detalle cosmético: con el formato equivocado la herramienta hashea los candidatos con otra función y no encuentra nada aunque la contraseña esté en el diccionario. john suele adivinarlo solo, pero cuando un mismo formato de fichero admite varias variantes (por ejemplo un AS-REP en RC4 o en AES) hay que decírselo a mano. Si el diccionario no basta, se aplican reglas (mutaciones: añadir números, mayúsculas, símbolos, con --rules / -r) o un ataque por máscara (-a 3, fuerza bruta sobre un patrón concreto), aunque el coste sube mucho con cada carácter.
Cuando lo que tenemos es un fichero, no un hash. Una clave privada id_rsa con passphrase, un certificado .pfx, una base de KeePass .kdbx, un PDF protegido o un ZIP cifrado no contienen un hash en un formato que john entienda, pero sí llevan dentro el material que verifica la contraseña. La familia de conversores *2john lo extrae y lo escribe en la sintaxis de john, que ya se puede crackear igual que cualquier otro hash:
ssh2john id_rsa > hash.txt # -> $sshng$...
pfx2john cert.pfx > hash.txt # -> $pfxng$...
keepass2john base.kdbx > hash.txt # -> $keepass$...
pdf2john doc.pdf > hash.txt # -> $pdf$...
zip2john secreto.zip > hash.txt # -> $zip2$...
john --wordlist=rockyou.txt hash.txtEse es el motivo de que el paso aparezca siempre en dos tiempos: primero convertir el fichero a un hash, luego crackearlo. Nada del proceso toca la máquina víctima.
Matiz. El éxito depende de la calidad de la contraseña y del algoritmo: ni un bcrypt con buen coste se rompe si la contraseña es fuerte, ni un MD5 protege una contraseña débil. La sal (un valor único por hash) no impide crackear un hash concreto, pero evita los ataques precalculados (rainbow tables) y obliga a atacar cada hash por separado.
Cómo detectarlo. El crackeo en sí es offline y en la máquina del atacante: no toca la víctima y por tanto no genera telemetría propia. La detección honesta se sitúa a los lados. Antes: el robo de los hashes que alimenta al cracker es lo que sí deja rastro (un DCSync 4662, un volcado de LSASS, una lectura de /etc/shadow, una SQLi que exfiltra una tabla de credenciales). Después: la reutilización de la contraseña recuperada, un login válido (4624) de una cuenta desde un host o a una hora inusuales. Frenar el crackeo pasa por detectar esas dos fases, no el crackeo.
Defensa. Usar algoritmos lentos y con sal pensados para contraseñas (bcrypt, scrypt, argon2); imponer contraseñas largas y únicas; y proteger los almacenes de hashes. Suele encadenarse con la reutilización de credenciales una vez recuperada la contraseña.
Máquinas donde se aplica
- AccessProving Grounds Practice
- ActiveHackTheBox
- AdministratorHackTheBox
- AlertHackTheBox
- ApexProving Grounds Practice
- BlackMarket 1VulnHub
- BuscaloveDockerLabs
- ChemistryHackTheBox
- CompiledHackTheBox
- ExtplorerProving Grounds Practice
- ForestHackTheBox
- GreenHornHackTheBox
- HealHackTheBox
- HeistHackTheBox
- HokkaidoProving Grounds Practice
- Infovore 1VulnHub
- MailingHackTheBox
- MantisProving Grounds Practice
- MonitorsThreeHackTheBox
- MyExpense 1VulnHub
- NagoyaProving Grounds Practice
- PotatoProving Grounds Play
- QuackerJackProving Grounds Practice
- SaunaHackTheBox
- ScrutinyProving Grounds Practice
- SeaHackTheBox
- ShoppyHackTheBox
- SPXProving Grounds Practice
- Symfonos 1 & 2VulnHub
- TeacherHackTheBox
- TricksterHackTheBox
- UnderPassHackTheBox
- VaultProving Grounds Practice
- Vulnerable Lab (1 · 4 · 5)VulnHub
- WallpaperHubProving Grounds Practice
- WorkaholicProving Grounds Practice
- ZabProving Grounds Practice