Usar John the Ripper para Descifrar Contraseñas Shadow de Linux

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará el proceso de extracción, preparación y descifrado de hashes de contraseñas de Linux utilizando una potente herramienta llamada John the Ripper. Comprender cómo funciona el descifrado de contraseñas es crucial para implementar medidas de seguridad sólidas. Aprenderá sobre el archivo /etc/shadow, cómo combinarlo con /etc/passwd para crear un archivo descifrable y luego utilizará John the Ripper para encontrar contraseñas débiles. Finalmente, obtendrá información sobre la estructura del archivo shadow y las mejores prácticas para proteger las contraseñas de los usuarios en sistemas Linux.

Extracción del archivo /etc/shadow

En este paso, aprenderá cómo acceder y extraer el contenido del archivo /etc/shadow. El archivo /etc/shadow almacena contraseñas de usuario cifradas y otra información relacionada con la seguridad. Debido a su naturaleza sensible, solo el usuario root tiene acceso de lectura a este archivo. Para este laboratorio, hemos creado archivos ficticios passwd_dummy y shadow_dummy en su directorio ~/project para simular los archivos reales sin requerir privilegios de root para el acceso directo a /etc/shadow.

Primero, veamos el contenido del archivo ficticio passwd_dummy. Este archivo contiene información básica de la cuenta de usuario, pero no los hashes de las contraseñas.

cat ~/project/passwd_dummy

Debería ver una salida similar a esta:

root:x:0:0:root:/root:/bin/bash
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:x:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

A continuación, veamos el contenido del archivo ficticio shadow_dummy. Este archivo contiene los hashes de contraseñas reales.

cat ~/project/shadow_dummy

Debería ver una salida similar a esta, donde el segundo campo es la contraseña hasheada:

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:18000:0:99999:7:::
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:18000:0:99999:7:::
testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

En un escenario del mundo real, normalmente usaría sudo cat /etc/shadow para extraer el archivo shadow, pero para este laboratorio, utilizaremos los archivos ficticios.

Unshadow el archivo de contraseñas

En este paso, utilizará la utilidad unshadow, que forma parte de la suite John the Ripper, para combinar los archivos passwd_dummy y shadow_dummy en un único archivo que John the Ripper pueda procesar. La herramienta unshadow fusiona la información del usuario del archivo de contraseñas con los hashes de contraseñas del archivo shadow, creando un formato unificado adecuado para el descifrado.

Ejecute el siguiente comando para combinar passwd_dummy y shadow_dummy en un nuevo archivo llamado unshadowed.txt en su directorio ~/project:

unshadow ~/project/passwd_dummy ~/project/shadow_dummy > ~/project/unshadowed.txt

Ahora, veamos el contenido del archivo unshadowed.txt recién creado para comprender su formato.

cat ~/project/unshadowed.txt

Debería ver una salida donde cada línea comienza con un nombre de usuario, seguido del hash de la contraseña y luego otra información del usuario. Por ejemplo:

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:0:0:root:/root:/bin/bash
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:$6$rounds=5000$testsalt$testpasswordhash:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

Este archivo unshadowed.txt está ahora listo para ser utilizado por John the Ripper para el descifrado de contraseñas.

Descifrar hashes de shadow con John the Ripper

En este paso, utilizará John the Ripper para descifrar los hashes de contraseñas contenidos en el archivo unshadowed.txt. John the Ripper puede realizar varios tipos de ataques, incluidos ataques de diccionario, que implican probar palabras de una lista predefinida. Ya hemos creado una lista de palabras simple llamada wordlist.txt en su directorio ~/project durante la configuración.

Ejecute el siguiente comando para comenzar a descifrar las contraseñas utilizando el archivo wordlist.txt:

john --wordlist=~/project/wordlist.txt ~/project/unshadowed.txt

John the Ripper intentará descifrar los hashes. Si encuentra una coincidencia, mostrará la contraseña descifrada. En nuestros archivos ficticios, testuser tiene una contraseña débil que está presente en wordlist.txt.

Debería ver una salida similar a esta, indicando una contraseña descifrada:

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts to test (sha512crypt, crypt(3) $6$)
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
testpassword     (testuser)
3g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% (ETA: 00:00:00) 3.000g/s 180.0p/s 180.0c/s 180.0C/s testpassword
Session completed.

Después de descifrar, puede ver las contraseñas descifradas que John the Ripper ha encontrado utilizando la opción --show:

john --show ~/project/unshadowed.txt

Este comando mostrará todas las contraseñas descifradas con éxito de la sesión.

testuser:testpassword

1 password hash cracked, 2 left

Esto demuestra con qué facilidad se pueden descifrar contraseñas débiles utilizando herramientas y listas de palabras fácilmente disponibles.

Comprender el formato del archivo Shadow

En este paso, profundizaremos en la estructura y el significado de los campos dentro del archivo /etc/shadow. Comprender este formato es crucial para entender cómo Linux almacena y administra la información de contraseñas de usuario de forma segura.

El archivo /etc/shadow contiene una línea por usuario, y cada línea consta de nueve campos separados por dos puntos. Volvamos a examinar una línea de nuestro archivo shadow_dummy:

testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

Aquí hay un desglose de cada campo:

  1. Nombre de usuario: testuser - El nombre de inicio de sesión del usuario.
  2. Contraseña cifrada: $6$rounds=5000$testsalt$testpasswordhash - Este es el campo más crítico. Contiene la contraseña hasheada.
    • $6 indica el algoritmo de hashing utilizado (SHA-512 en este caso). Otros tipos comunes incluyen $1 (MD5), $2a (Blowfish), $5 (SHA-256).
    • rounds=5000 especifica el número de rondas de hashing, lo que aumenta el costo computacional del descifrado.
    • testsalt es la sal (salt), una cadena aleatoria que se añade a la contraseña antes de hashearla para prevenir ataques de tablas arcoíris (rainbow table attacks).
    • testpasswordhash es la contraseña hasheada real.
  3. Último cambio de contraseña: 18000 - El número de días desde el 1 de enero de 1970 en que se cambió la contraseña por última vez.
  4. Edad mínima de la contraseña: 0 - El número mínimo de días requeridos entre cambios de contraseña. Un valor de 0 significa que el usuario puede cambiar su contraseña en cualquier momento.
  5. Edad máxima de la contraseña: 99999 - El número máximo de días que la contraseña es válida. Después de este período, se obligará al usuario a cambiar su contraseña. 99999 típicamente significa que la contraseña nunca expira.
  6. Período de advertencia de contraseña: 7 - El número de días antes de que la contraseña deba expirar en los que se advertirá al usuario.
  7. Período de inactividad de la contraseña: (vacío) - El número de días después de que expire la contraseña en que la cuenta se deshabilitará. Si está vacío, la cuenta nunca se deshabilita debido a la inactividad de la contraseña.
  8. Fecha de expiración de la cuenta: (vacío) - La fecha (en días desde el 1 de enero de 1970) en que la cuenta se deshabilitará. Si está vacío, la cuenta nunca expira.
  9. Campo reservado: (vacío) - Este campo está reservado para uso futuro.

Comprender estos campos ayuda a configurar políticas de contraseñas y mejorar la seguridad del sistema.

Implementar mejores prácticas para la seguridad del archivo Shadow

En este paso, aprenderá y comprenderá las mejores prácticas para proteger el archivo /etc/shadow y las contraseñas de usuario en sistemas Linux. Dada la naturaleza sensible del archivo shadow, protegerlo es primordial para la seguridad del sistema.

Aquí hay algunas mejores prácticas clave:

  1. Políticas de contraseñas seguras:

    • Complejidad: Aplique requisitos de complejidad de contraseñas seguras (por ejemplo, longitud mínima, combinación de mayúsculas, minúsculas, números y caracteres especiales).
    • Unicidad: Evite que los usuarios reutilicen contraseñas antiguas.
    • Cambios regulares: Implemente políticas para cambios regulares de contraseña, aunque los consejos de seguridad modernos a veces favorecen contraseñas largas, seguras y únicas sobre cambios frecuentes para cuentas no privilegiadas.
    • Frases de contraseña (Passphrases): Fomente el uso de frases de contraseña largas en lugar de contraseñas cortas y complejas, ya que a menudo son más fáciles de recordar y más difíciles de descifrar.
  2. Permisos de archivo:

    • El archivo /etc/shadow debe tener permisos muy estrictos: 0640 (-rw-r-----). Esto significa que solo root puede leerlo y escribir en él, y los miembros del grupo shadow pueden leerlo. Ningún otro usuario debería tener acceso.
    • Verifique los permisos usando ls -l /etc/shadow (en un sistema real, no en nuestro archivo ficticio).
  3. Algoritmos de Hashing:

    • Utilice siempre algoritmos de hashing modernos y seguros como SHA-512 ($6) o Blowfish ($2a, $2b, $2y). Evite algoritmos más antiguos y débiles como MD5 ($1) o DES.
    • Asegúrese de que la configuración PAM (Pluggable Authentication Modules) de su sistema esté configurada para usar algoritmos de hashing seguros.
  4. Salting (Salado):

    • Utilice siempre sales únicas para cada contraseña. Esto se maneja automáticamente con los algoritmos de hashing modernos y previene los ataques de tablas arcoíris (rainbow table attacks).
  5. Políticas de bloqueo de cuentas:

    • Implemente políticas de bloqueo de cuentas para prevenir ataques de fuerza bruta. Después de un cierto número de intentos de inicio de sesión fallidos, la cuenta debe bloquearse temporalmente.
  6. Monitorear actividad sospechosa:

    • Supervise regularmente los registros del sistema en busca de intentos de inicio de sesión inusuales o modificaciones en el archivo /etc/shadow. Herramientas como AIDE o Tripwire pueden detectar cambios en la integridad de los archivos.
  7. Educar a los usuarios:

    • Eduque a los usuarios sobre la importancia de contraseñas seguras y únicas y los riesgos de phishing e ingeniería social.

Al implementar estas mejores prácticas, puede mejorar significativamente la seguridad de las cuentas de usuario y proteger la información sensible de contraseñas en sus sistemas Linux.

Resumen

En este laboratorio, ha adquirido experiencia práctica con el proceso de descifrado de contraseñas en sistemas Linux utilizando John the Ripper. Aprendió a extraer y combinar los archivos /etc/passwd y /etc/shadow utilizando unshadow, y luego usó John the Ripper con una lista de palabras (wordlist) para descifrar hashes de contraseñas débiles. Además, exploró el formato detallado del archivo /etc/shadow, comprendiendo la importancia de cada campo, especialmente el algoritmo de hashing y la sal (salt). Finalmente, revisó las mejores prácticas esenciales para asegurar las contraseñas de usuario y el archivo shadow, incluyendo políticas de contraseñas seguras, permisos de archivo adecuados y el uso de algoritmos de hashing robustos. Este conocimiento es crucial tanto para la seguridad ofensiva (comprender cómo se pueden comprometer los sistemas) como para la seguridad defensiva (implementar medidas para protegerse contra tales ataques).