Identificar Hashes Generados por KDFs
En este paso, aprenderá a identificar el formato de los hashes generados por diferentes KDFs. Si bien la salida bruta de una KDF puede ser una cadena binaria, cuando se almacenan en sistemas, a menudo se codifican (por ejemplo, Base64 o hexadecimal) y se prefijan con identificadores que indican la KDF utilizada, la sal y, a veces, el número de iteraciones o el factor de coste. Este formato estandarizado permite que herramientas como John the Ripper las reconozcan y procesen correctamente.
Veamos los formatos de hash comunes para PBKDF2, bcrypt y scrypt.
PBKDF2:
Los hashes PBKDF2 a menudo aparecen en un formato que incluye el algoritmo, las iteraciones, la sal y la clave derivada. Por ejemplo, en los archivos /etc/shadow en Linux, los hashes PBKDF2 (específicamente SHA512) pueden verse así:
$6$rounds=5000$<salt>$<hash>
Aquí, $6$ indica SHA-512, rounds= especifica las iteraciones, seguido de la sal y el hash real.
bcrypt:
Los hashes bcrypt son fácilmente reconocibles por su prefijo $2a$, $2b$ o $2y$, seguido del factor de coste (por ejemplo, 10), la sal y el hash.
Ejemplo: $2a$10$<salt><hash>
scrypt:
Los hashes scrypt suelen comenzar con $7$ o $scrypt$, seguidos de parámetros como ln, r, p (coste logarítmico, tamaño del bloque y factor de paralelización), la sal y el hash.
Ejemplo: $7$<ln>$<r>$<p>$<salt><hash>
Para demostrarlo, crearemos un archivo que contenga algunos hashes de KDF de ejemplo. Utilizaremos una herramienta llamada mkpasswd (que forma parte del paquete whois) para generar un hash bcrypt y luego construiremos manualmente un hash PBKDF2 para demostración.
Primero, instale el paquete whois para obtener mkpasswd:
sudo apt install -y whois
Ahora, generemos un hash bcrypt para la contraseña "password123" con un factor de coste de 10.
mkpasswd -m bcrypt -S $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16) -s 10 password123
Este comando genera un hash bcrypt. La opción -S proporciona una sal aleatoria y -s 10 establece el factor de coste en 10. La salida será una cadena de hash bcrypt.
$2a$10$<random_salt_string><hash_string>
Ahora, creemos un archivo llamado kdf_hashes.txt que John the Ripper pueda leer. Incluiremos un hash bcrypt y un hash PBKDF2 creado manualmente.
nano kdf_hashes.txt
Agregue el siguiente contenido al archivo. Reemplace <YOUR_GENERATED_BCRYPT_HASH> con el hash bcrypt real que generó en el paso anterior.
user1:$2a$10$<YOUR_GENERATED_BCRYPT_HASH>
user2:$pbkdf2-sha256$100000$c0ffee$a1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef
Nota: El hash PBKDF2 para user2 es un marcador de posición para fines de demostración. No es un hash real de una contraseña conocida, pero sigue el formato que John the Ripper espera para PBKDF2-SHA256. El formato es $pbkdf2-sha256$<iterations>$<salt_hex>$<hash_hex>.
Guarde el archivo presionando Ctrl+X, luego Y, luego Enter.
Ahora, usemos John the Ripper para identificar los tipos de hash en kdf_hashes.txt:
john --format=raw-md5 --show kdf_hashes.txt
Nota: Usamos --format=raw-md5 como un formato ficticio porque John requiere que se especifique un formato para --show, incluso si solo está identificando. John detectará automáticamente los formatos de KDF reales.
La salida mostrará a John identificando los tipos de hash:
0 password hashes cracked, 2 left
John identifica correctamente que hay dos hashes, y reconocerá sus tipos de KDF cuando intente descifrarlos. Este paso se centra principalmente en reconocer los formatos de hash.