Ataques a hashes y almacenamiento seguro de credenciales en Linux

Tipo: Nota técnica (práctica de especialización en ciberseguridad) Tema: Fuerza bruta · diccionario · rainbow tables · mecanismo shadow password (SHA-512) Enfoque: teoría + práctica verificable, sin datos reales.

Aviso legal: el contenido es puramente técnico-educativo, orientado a entender por qué el almacenamiento seguro de credenciales es una responsabilidad del desarrollador y del administrador. Los ejemplos usan contraseñas de laboratorio.


1. Ataques a hashes sin sal (ej. SHA-256 plano)

Cuando una aplicación almacena contraseñas con un hash criptográfico sin aplicar sal, todos los ataques clásicos son viables con el hardware moderno:

1.1 Fuerza bruta

Prueba sistemática de todas las combinaciones posibles hasta dar con la credencial original. - Viable en SHA-256 sin sal: sí, con una GPU moderna se pueden probar miles de millones de combinaciones por segundo. - Ejemplo de la práctica: un hash SHA-256 se puede descifrar en cuestión de días con una GPU de alta gama.

1.2 Ataque de diccionario

Es un caso especial de fuerza bruta que usa listas precompiladas de contraseñas comunes (ej. rockyou.txt con ~14M de entradas). - Contraseña típica (mypassword, 123456, etc.) → presente en el diccionario → descifrado en segundos. - Menos costoso computacionalmente, pero dependiente del "mundo real" de las contraseñas de las personas.

1.3 Lookup tables (tablas precomputadas / rainbow tables)

Se precomputa una tabla que asocia hashes con sus contraseñas; luego, un hash robado se "busca" en la tabla en vez de recomputar. - Una vez generada la tabla (1 sola vez), el ataque es búsqueda instantánea. - Ejemplo de la práctica: un hash robado coincide con la entrada preexistente de una contraseña común en segundos.

¿Son todos viables en caso de robo del almacenamiento?

Sí, en SHA-256 sin sal. Sin un valor aleatorio único por usuario, un solo hash compromise expone contraseñas comunes de forma inmediata y las no-comunes en horas/días, dependiendo del hardware. La única mitigación real son las sales únicas (RFC 8018) — lo que justifica el siguiente apartado.


2. Mecanismo shadow password en Linux

Linux separa la identidad de la credencial para que la contraseña NO sea legible por cualquiera:

Archivo Contenido Permisos Público
/etc/passwd Nombres de usuario, UID, GID, shell -rw-r--r-- Sí (cosas básicas de identidad)
/etc/shadow Hases de contraseña + metadatos -rw-r----- No (solo root y grupo shadow)

Técnicas de protección del hashing

Técnica Función
Sal (salt) Valor aleatorio único por contraseña → hashes idénticos producen valores distintos; invalida rainbow tables
Algoritmo robusto SHA-512 ($6$) en vez de DES obsoleto; algoritmos lentos encarecen el brute force
Permisos /etc/shadow con 640, solo root/grupo shadow
Caducidad last_change, max_age, warning controlan vigencia y avisos

2.1 Ejemplo verificable (usuario uocstudent)

sudo useradd -m uocstudent
echo "uocstudent:mypassword" | sudo chpasswd --crypt-method SHA512

Estructura de la entrada en /etc/shadow:

uocstudent:$6$d1e8f3a2$...:19909:0:90:7:::
Campo Significado
$6$ Algoritmo SHA-512
d1e8f3a2 Sal (única por usuario)
19909 Días desde 1970 del último cambio
0 Mínimo de días entre cambios
90 Máxima vigencia (caduca)
7 Días de aviso previo

2.2 Justificación de diseño


Lecciones para el portfolio

  1. Hash ≠ cifrado seguro: un hash sin sal es una "tabla de hash" andante. Sal única + algoritmo lento (bcrypt/argon2/SHA-512) + rotación.
  2. Linux lo hace bien desde el diseño: permisos estrictos sobre /etc/shadow y sal por usuario son el estándar a replicar en cualquier app.
  3. La viabilidad del ataque depende del hardware y del formato: a la hora de auditar, pedir el ALGORITMO + SAL + ITERACIONES, no "¿está hasheado?".
  4. Para un auditor: nombres de usuario legibles + hashes (/etc/passwd vs /etc/shadow) es la primera señal de posture de seguridad.

Nota técnica de laboratorio; contraseñas de ejemplo, sin datos reales.