
Cracking de contraseñas: hashing, salado y stretching
De la teoría criptográfica a la demostración medida, en un laboratorio aislado
Contexto
Este proyecto complementa el laboratorio de honeypot con el ángulo de la 'contraseña comprometida': cómo se almacena realmente una contraseña, por qué no puede 'desencriptarse', y cómo las herramientas estándar del sector (John the Ripper, Hashcat) automatizan la prueba de miles de candidatos por segundo.
Todo se ejecutó en la máquina atacante del laboratorio (Kali Linux), sin red ni objetivo externo: solo hashes generados localmente para la demostración.
Objetivos
- Comprender y demostrar las propiedades de una función de hash criptográfica (determinismo, efecto avalancha, irreversibilidad).
- Comparar de forma concreta la velocidad de cracking entre un algoritmo rápido (MD5) y uno deliberadamente lento (bcrypt).
- Implementar las cuatro grandes familias de ataque: diccionario, diccionario + reglas de mutación, máscara, fuerza bruta pura.
- Ejecutar un caso práctico multiusuario realista (tipo archivo /etc/shadow) con contraseñas de robustez variable.
Metodología
- 1Generación de hashes de pruebaGeneré hashes MD5 / SHA1 / SHA256 sin salar, luego uno SHA-512 salado vía mkpasswd, verificando personalmente el efecto avalancha y el papel de la sal.
- 2Cracking con John the RipperEjecuté un ataque por diccionario (rockyou.txt, 14,3 millones de entradas) sobre hashes MD5 de prueba.
- 3Cracking con HashcatEjecuté un benchmark MD5 vs bcrypt, y luego ataques por diccionario, por reglas de mutación (best64) y por máscara/fuerza bruta con cálculo del espacio de búsqueda.
- 4Resolución de un entorno sin GPUResolví una cadena de fallos OpenCL en una VM sin tarjeta gráfica dedicada: controlador de software ausente, variable de entorno mal ubicada, RAM insuficiente.
- 5Caso práctico multiusuarioSometí tres cuentas de robustez creciente (palabra de diccionario, palabra complejizada, passphrase de cinco palabras) al mismo ataque combinado.
Resultados medidos
- MD5 vs bcrypt (benchmark)
- 3.087.100 H/s frente a 119 H/s
- Factor de ralentización de bcrypt
- unas 25.900 veces
- Contraseña débil (diccionario)
- descifrada
- Passphrase de 5 palabras
- no descifrada (diccionario + reglas agotados)
Resolución técnica
Hashcat necesita un backend OpenCL funcional incluso para uso exclusivo de CPU, ausente por defecto en esta VM sin GPU. Resolverlo me llevó varios pasos: el paquete esperado (pocl-opencl-icd) no existía en los repositorios de Kali, así que instalé la alternativa mesa-opencl-icd (renderizado por software llvmpipe).
La plataforma OpenCL seguía siendo invisible para Hashcat (0 dispositivos expuestos) hasta que la activé explícitamente mediante la variable de entorno RUSTICL_ENABLE. Mi primer intento de hacerla persistente falló porque la había colocado en ~/.bashrc, mientras que el shell por defecto de Kali es Zsh, que no lee ese archivo.
Una vez detectado el dispositivo, el benchmark seguía fallando con un error de asignación de memoria, que resolví aumentando la RAM asignada a la VM de ~2 GB a 8 GB en la configuración de VMware.
Stack y herramientas
- Kali Linux sobre VMware Workstation Pro 17
- John the Ripper (ataque por diccionario, formatos MD5 y SHA-512crypt)
- Hashcat (diccionario, reglas best64, máscara, fuerza bruta, benchmark GPU/CPU)
- mkpasswd / OpenSSL (generación de hashes de prueba)
- Mesa OpenCL (renderizado por software llvmpipe, entorno sin GPU dedicada)
Capturas de pantalla
