Saltar al contenido
← Volver a proyectos
Cracking de contraseñas: hashing, salado y stretching — imagen de portada
Proyecto personal

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

  1. 1
    Generación de hashes de prueba
    Generé 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.
  2. 2
    Cracking con John the Ripper
    Ejecuté un ataque por diccionario (rockyou.txt, 14,3 millones de entradas) sobre hashes MD5 de prueba.
  3. 3
    Cracking con Hashcat
    Ejecuté 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.
  4. 4
    Resolución de un entorno sin GPU
    Resolví una cadena de fallos OpenCL en una VM sin tarjeta gráfica dedicada: controlador de software ausente, variable de entorno mal ubicada, RAM insuficiente.
  5. 5
    Caso práctico multiusuario
    Sometí 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

Cracking de contraseñas: hashing, salado y stretching — captura de pantalla 1 de 5