Extraer y Descifrar Hashes de un Archivo Shadow de Linux

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá el proceso fundamental de auditoría de seguridad de contraseñas en Linux. Explorará cómo Linux almacena la información de contraseñas de los usuarios, extraerá esta información y luego intentará descifrar las contraseñas utilizando un ataque de diccionario. Este proceso es esencial para los pentesters (probadores de penetración) y administradores de sistemas para identificar y remediar contraseñas débiles dentro de un sistema.

Trabajará con dos archivos críticos: /etc/passwd, que almacena la información de las cuentas de usuario, y /etc/shadow, que almacena de forma segura las contraseñas hasheadas. Utilizará herramientas estándar de línea de comandos de Linux y software especializado como unshadow (del conjunto de herramientas John the Ripper) y Hashcat para realizar el proceso de descifrado.

Al final de este laboratorio, tendrá experiencia práctica en:

  • Comprender el formato del archivo /etc/shadow.
  • Combinar datos de usuario y contraseña en un formato descifrable.
  • Identificar tipos de hash de contraseñas.
  • Utilizar Hashcat para realizar un ataque de diccionario.

Comprender el formato del archivo /etc/shadow

En este paso, examinará el archivo /etc/shadow. Este archivo almacena los hashes de contraseñas reales de los usuarios en un sistema Linux y solo es legible por el usuario root por motivos de seguridad. Comprender su estructura es el primer paso para extraer los hashes.

Primero, use sudo para obtener los privilegios necesarios para ver el contenido del archivo /etc/shadow.

sudo cat /etc/shadow

Verá una salida que contiene varias líneas, cada una correspondiente a una cuenta de usuario. Veamos la entrada para el testuser que creamos. Se verá similar a esto (la sal y el hash serán diferentes):

root:*:19327:0:99999:7:::
daemon:*:19327:0:99999:7:::
...
testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:19422:0:99999:7:::

Cada línea es una serie de campos separados por dos puntos (:). Para este laboratorio, nos interesan los dos primeros:

  1. Nombre de usuario: testuser
  2. Contraseña hasheada: $6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1

Los signos de dólar ($) en el campo del hash son significativos. El número entre los dos primeros caracteres $ indica el algoritmo de hashing. En este caso, $6$ significa que la contraseña fue hasheada utilizando el algoritmo sha512crypt.

Usar la herramienta unshadow para combinar los archivos passwd y shadow

En este paso, utilizará la utilidad unshadow para crear un único archivo que sea adecuado para herramientas de descifrado de contraseñas como Hashcat. Las herramientas de descifrado necesitan tanto el nombre de usuario de /etc/passwd como el hash de /etc/shadow en un formato específico. La herramienta unshadow, que forma parte del conjunto de herramientas John the Ripper, automatiza este proceso de combinación.

Ahora ejecutará unshadow, proporcionando /etc/passwd y /etc/shadow como entrada, y redirigirá la salida a un nuevo archivo llamado hashes.txt dentro de su directorio ~/project.

Ejecute el siguiente comando en su terminal:

sudo unshadow /etc/passwd /etc/shadow > ~/project/hashes.txt

Este comando lee ambos archivos del sistema y fusiona la información relevante, guardándola en ~/project/hashes.txt.

Ahora, veamos el contenido del archivo recién creado para ver el resultado.

cat ~/project/hashes.txt

La salida mostrará una lista de usuarios y sus hashes correspondientes en el formato que esperan las herramientas de descifrado. La línea para testuser se verá así:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:1001:1001::/home/testuser:/bin/bash

Este archivo está ahora listo para ser utilizado con Hashcat.

Identificar el tipo de hash (por ejemplo, sha512crypt)

En este paso, confirmará el tipo de hash utilizado para las contraseñas de los usuarios. Este es un paso crucial porque debe indicar a Hashcat exactamente qué algoritmo de hashing utilizar para el intento de descifrado. Un algoritmo incorrecto siempre fallará.

Como observamos en el Paso 1, el formato de la cadena de hash en sí mismo revela el algoritmo. Examinemos nuevamente el archivo hashes.txt.

cat ~/project/hashes.txt

Concéntrese en la cadena de hash para testuser:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:...

El hash comienza con $6$. Este es un identificador estándar para un tipo específico de hash. Aquí hay una referencia rápida para identificadores comunes de hash de Linux:

  • $1$ = md5crypt (MD5)
  • $2a$ o $2y$ = bcrypt (Blowfish)
  • $5$ = sha256crypt (SHA-256)
  • $6$ = sha512crypt (SHA-512)

Basándonos en el prefijo $6$, podemos identificar con confianza el tipo de hash como sha512crypt. Esta es la información que necesitaremos para el siguiente paso.

Seleccionar el modo de Hashcat correspondiente

En este paso, encontrará el número de modo correcto que Hashcat utiliza para identificar el algoritmo sha512crypt. Hashcat soporta cientos de tipos de hash diferentes, y a cada uno se le asigna un número de modo único.

Para encontrar el modo para sha512crypt, puede buscar en la información de ayuda de Hashcat usando grep. Esta es una forma eficiente de encontrar el modo específico que necesita sin leer todo el menú de ayuda.

Ejecute el siguiente comando para buscar sha512crypt:

hashcat --help | grep -i sha512crypt

La opción -i en grep hace que la búsqueda no distinga entre mayúsculas y minúsculas, lo cual es una buena práctica. La salida le mostrará la línea coincidente del menú de ayuda:

...
1800 | sha512crypt, SHA512(Unix)                  | Operating System
...

De esta salida, puede ver que el número de modo para sha512crypt es 1800. Utilizará este número de modo en el paso final para indicarle a Hashcat cómo interpretar los hashes en su archivo hashes.txt.

Lanzar un ataque de diccionario sobre los hashes de Linux

En este paso final, lanzará un ataque de diccionario contra los hashes capturados utilizando Hashcat. Un ataque de diccionario funciona tomando una lista de contraseñas potenciales (un "diccionario" o "lista de palabras"), hasheando cada una utilizando el mismo algoritmo que el hash objetivo y comparando los resultados. Si se encuentra una coincidencia, la contraseña ha sido descifrada.

Utilizará la lista de palabras rockyou.txt que se descargó en su directorio ~/project durante la configuración del laboratorio. Esta es una lista de palabras muy común utilizada para la auditoría de contraseñas.

Ahora, construya el comando completo de Hashcat con toda la información que ha recopilado:

  • Modo (-m): 1800 para sha512crypt.
  • Archivo de Hash: ~/project/hashes.txt.
  • Lista de Palabras: ~/project/rockyou.txt.
  • Opción (--force): Se añade para prevenir posibles errores al ejecutar Hashcat en un entorno virtualizado o con ciertos drivers.

Ejecute el comando para iniciar el ataque:

hashcat -m 1800 --force ~/project/hashes.txt ~/project/rockyou.txt

Hashcat se inicializará y comenzará la sesión de descifrado. Dado que la contraseña password123 se encuentra en la lista rockyou.txt, el proceso debería ser muy rápido.

...
Session..........: hashcat
Status...........: Running
Hash.Name........: sha512crypt, SHA512(Unix)
Hash.Target......: testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn...
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

Una vez que Hashcat muestre el estado como Cracked (Descifrado) o Exhausted (Agotado), el ataque habrá finalizado. Para ver la contraseña descifrada, puede utilizar la opción --show con el mismo comando.

hashcat -m 1800 --force ~/project/hashes.txt --show

La salida mostrará claramente el hash descifrado junto con su contraseña en texto plano correspondiente.

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:password123

¡Ha descifrado con éxito la contraseña de testuser!

Resumen

¡Felicitaciones por completar este laboratorio! Ha realizado con éxito un flujo de trabajo clásico de auditoría de contraseñas en un sistema Linux.

En este laboratorio, aprendió a:

  • Leer y comprender la estructura del archivo /etc/shadow, que almacena los hashes de las contraseñas de los usuarios.
  • Utilizar la herramienta unshadow para combinar datos de usuario y hash de /etc/passwd y /etc/shadow en un único archivo.
  • Identificar el algoritmo de hash de contraseñas (sha512crypt) inspeccionando el formato del hash.
  • Encontrar el modo correspondiente (1800) en Hashcat para el tipo de hash identificado.
  • Lanzar un ataque de diccionario utilizando Hashcat, una potente lista de palabras y los hashes extraídos.
  • Ver la contraseña descifrada con éxito.

Este ejercicio demuestra la importancia de utilizar contraseñas fuertes, complejas y únicas que no se encuentren en listas de palabras comunes. Los administradores de sistemas pueden utilizar estas mismas técnicas para encontrar y corregir de forma proactiva contraseñas débiles en sus entornos.