Comprender los Ataques de Diccionario con John the Ripper

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, obtendrás una comprensión práctica de los ataques de diccionario utilizando John the Ripper, una potente herramienta para descifrar contraseñas. Aprenderás a seleccionar y combinar diccionarios de manera efectiva, comprenderás las limitaciones inherentes de este método de ataque e incluso generarás diccionarios personalizados para mejorar tus capacidades de descifrado. Al final de este laboratorio, podrás analizar las tasas de éxito de los ataques de diccionario y apreciar su papel en la ciberseguridad.

Seleccionar Diccionarios Apropiados

En este paso, aprenderás a seleccionar y utilizar un archivo de diccionario apropiado para un ataque de diccionario con John the Ripper. Un ataque de diccionario intenta descifrar contraseñas probando cada palabra de una lista predefinida (diccionario). La efectividad de este ataque depende en gran medida de la calidad y relevancia del diccionario utilizado.

Primero, verifiquemos que John the Ripper esté instalado y que los archivos de contraseñas simuladas passwords.txt y el archivo de diccionario rockyou.txt estén presentes en tu directorio ~/project.

john --version
ls -l ~/project/passwords.txt ~/project/rockyou.txt

Deberías ver una salida similar a esta, confirmando la presencia de los archivos:

John the Ripper password cracker, version 1.9.0-jumbo-1 ...
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/passwords.txt
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/rockyou.txt

Ahora, realicemos un ataque de diccionario básico utilizando el diccionario rockyou.txt contra nuestro archivo passwords.txt. La opción --wordlist especifica el archivo de diccionario a utilizar.

john --wordlist=/home/labex/project/rockyou.txt /home/labex/project/passwords.txt

John the Ripper intentará descifrar las contraseñas. Si tiene éxito, mostrará las contraseñas descifradas. Podrías ver una salida similar a esta:

Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:30) 100.0% (ETA: 2023-03-15 10:30) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

Para ver las contraseñas descifradas en cualquier momento, puedes usar la opción --show:

john --show /home/labex/project/passwords.txt

Este comando mostrará las contraseñas descifradas y los nombres de usuario correspondientes.

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 0 left

Esto demuestra cómo seleccionar y usar un diccionario para un ataque básico. El archivo rockyou.txt es un ejemplo común de un diccionario que contiene contraseñas de uso frecuente.

Combinar Diccionarios para Ataques Exhaustivos

En este paso, aprenderás a combinar múltiples diccionarios para crear una lista de palabras más completa para John the Ripper. La combinación de diccionarios puede aumentar significativamente las posibilidades de descifrar contraseñas, especialmente si las contraseñas objetivo no se encuentran en un solo diccionario.

Primero, creemos otro archivo de diccionario pequeño llamado common_words.txt en tu directorio ~/project.

echo "welcome" > ~/project/common_words.txt
echo "security" >> ~/project/common_words.txt
echo "network" >> ~/project/common_words.txt

Ahora, combinaremos rockyou.txt y common_words.txt en un nuevo archivo llamado combined_dictionary.txt. Podemos usar el comando cat para concatenar los archivos y luego ordenar y eliminar duplicados.

cat ~/project/rockyou.txt ~/project/common_words.txt | sort | uniq > ~/project/combined_dictionary.txt

Inspeccionemos el contenido del nuevo combined_dictionary.txt para asegurarnos de que contiene palabras de ambos diccionarios originales y no hay duplicados.

cat ~/project/combined_dictionary.txt

Deberías ver una lista ordenada de palabras únicas de rockyou.txt y common_words.txt.

123456
admin
labex
network
password
secret
security
test
welcome

Ahora, usemos este combined_dictionary.txt para un ataque de diccionario. Para esta demostración, primero limpiaremos la sesión de descifrado anterior de John para asegurar un nuevo comienzo.

john --session=clear

Luego, ejecutamos el ataque usando el diccionario combinado:

john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

John the Ripper intentará descifrar las contraseñas utilizando la lista de palabras ampliada. Si se agregaron nuevas contraseñas a passwords.txt que están presentes en common_words.txt, ahora serían descifradas. Dado que nuestro passwords.txt solo contiene contraseñas de rockyou.txt, la salida será similar al paso anterior, pero demuestra el proceso de uso de un diccionario combinado.

Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:35) 100.0% (ETA: 2023-03-15 10:35) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

Este proceso resalta la importancia de tener un diccionario diverso y completo para un descifrado de contraseñas efectivo.

Comprender las Limitaciones de los Ataques de Diccionario

En este paso, exploraremos las limitaciones de los ataques de diccionario. Si bien son potentes, los ataques de diccionario solo son efectivos contra contraseñas que existen dentro del diccionario. Son ineficaces contra contraseñas complejas, únicas o generadas aleatoriamente que no están presentes en la lista de palabras.

Para demostrar esta limitación, agreguemos un nuevo usuario con una contraseña fuerte y aleatoria a nuestro archivo passwords.txt. Usaremos una contraseña que es muy poco probable que se encuentre en un diccionario estándar. Por ejemplo, P@ssw0rd!23AbC. Generaremos su hash MD5.

echo "user5:$(echo -n 'P@ssw0rd!23AbC' | md5sum | awk '{print $1}')" >> /home/labex/project/passwords.txt

Ahora, limpiemos la sesión anterior de John e intentemos descifrar las contraseñas nuevamente usando nuestro combined_dictionary.txt.

john --session=clear
john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

Observa la salida. John the Ripper probablemente descifrará las primeras cuatro contraseñas (user1, user2, user3, user4) pero no podrá descifrar la contraseña de user5 porque P@ssw0rd!23AbC no está en nuestro diccionario.

Using default input encoding: UTF-8
Loaded 5 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:40) 80.0% (ETA: 2023-03-15 10:40) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

Para confirmar, usa la opción --show:

john --show /home/labex/project/passwords.txt

Verás que la contraseña de user5 permanece sin descifrar.

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 1 left

Esto demuestra que los ataques de diccionario están limitados por el contenido del diccionario. Las contraseñas que no están en el diccionario, especialmente las fuertes y únicas, no serán descifradas por este método. Esto resalta la importancia de usar contraseñas fuertes e impredecibles.

Implementar Generación de Diccionarios Personalizados

En este paso, aprenderás a generar un diccionario personalizado. Si bien los diccionarios grandes prefabricados como rockyou.txt son útiles, a veces necesitas crear un diccionario adaptado a un objetivo o escenario específico. Esto podría implicar el uso de información conocida sobre el objetivo (por ejemplo, nombres de empresas, frases comunes, fechas) para generar posibles contraseñas.

Usaremos la herramienta crunch, que es excelente para generar listas de palabras basadas en conjuntos de caracteres y patrones especificados. crunch no está instalado por defecto, así que instalémoslo primero.

sudo apt install -y crunch

Ahora, generemos un diccionario personalizado simple. Por ejemplo, podemos generar todas las combinaciones posibles de letras minúsculas de una longitud específica. Creemos un diccionario de todas las palabras de 4 caracteres en minúsculas.

crunch 4 4 -o ~/project/custom_4char_dictionary.txt -t @@@@
  • 4 4: Especifica la longitud mínima y máxima de las palabras a generar (aquí, ambas son 4).
  • -o ~/project/custom_4char_dictionary.txt: Especifica el archivo de salida.
  • -t @@@@: Especifica un patrón. @ representa letras minúsculas.

Este comando generará un archivo grande. Para fines de demostración, generemos un diccionario personalizado más pequeño y manejable. Generaremos palabras de longitud 3 a 4, usando solo letras minúsculas y comenzando con 'a'.

crunch 3 4 abcdefghijklmnopqrstuvwxyz -o ~/project/custom_small_dictionary.txt -t a%@
  • 3 4: Longitud mínima 3, longitud máxima 4.
  • abcdefghijklmnopqrstuvwxyz: Especifica el conjunto de caracteres a usar.
  • -o ~/project/custom_small_dictionary.txt: Archivo de salida.
  • -t a%@: Patrón. a es una 'a' literal, % representa números, @ representa letras minúsculas. Corrijamos esto para generar solo letras minúsculas.

Intentemos un ejemplo más relevante para un diccionario personalizado: generar variaciones de una palabra conocida, como "labex", con números añadidos. Usaremos las reglas de lista de palabras integradas de john para esto, que es más práctico para variaciones de contraseñas comunes.

Primero, creemos una lista de palabras base solo con "labex".

echo "labex" > ~/project/base_word.txt

Ahora, usaremos la opción --rules de John con un conjunto de reglas común (como Wordlist) para generar variaciones. Esto se usa a menudo con una lista de palabras base.

john --wordlist=/home/labex/project/base_word.txt --rules=Wordlist --stdout > ~/project/labex_variations.txt
  • --wordlist: La lista de palabras base.
  • --rules=Wordlist: Aplica las reglas de lista de palabras predeterminadas (por ejemplo, añadir números, cambiar mayúsculas/minúsculas, etc.).
  • --stdout: Imprime las palabras generadas en la salida estándar.
  • > ~/project/labex_variations.txt: Redirige la salida a un archivo.

Inspeccionemos las variaciones generadas:

head -n 10 ~/project/labex_variations.txt

Verás variaciones como labex1, Labex, labex!, etc.

labex
Labex
LABEX
labex1
labex2
labex3
labex4
labex5
labex6
labex7

Esto demuestra cómo generar diccionarios personalizados o variaciones de palabras, lo que puede ser crucial para ataques dirigidos donde hay información específica o conocida sobre el objetivo disponible.

Analizar las Tasas de Éxito de los Ataques de Diccionario

En este paso, analizarás las tasas de éxito de los ataques de diccionario en función de los diccionarios utilizados y la complejidad de las contraseñas objetivo. Comprender las tasas de éxito ayuda a evaluar la efectividad de tus esfuerzos de cracking y la postura de seguridad de los sistemas.

Ya hemos visto que las palabras de diccionario simples se descifran fácilmente, mientras que las contraseñas complejas no. Cuantifiquemos esto observando el número de contraseñas descifradas frente al número total de hashes.

Primero, asegúrate de que la sesión de John esté limpia.

john --session=clear

Ahora, ejecutemos el ataque nuevamente con nuestro combined_dictionary.txt contra passwords.txt (que ahora incluye user5 con una contraseña fuerte).

john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

Una vez que el ataque se complete, usa la opción --show para ver los resultados.

john --show /home/labex/project/passwords.txt

La salida mostrará las contraseñas descifradas y el número de hashes descifrados frente al total.

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 1 left

A partir de esta salida, podemos calcular la tasa de éxito: (Número de hashes descifrados / Número total de hashes) _ 100%.
En este caso, (4 / 5) _ 100% = 80%.

Esta tasa de éxito del 80% indica que, si bien muchas contraseñas comunes fueron descifradas, la contraseña fuerte de user5 permaneció segura contra este ataque de diccionario. Esto resalta que los ataques de diccionario son muy efectivos contra contraseñas débiles, comunes o basadas en diccionarios, pero fallan contra contraseñas fuertes y únicas.

Para analizar más a fondo, podrías experimentar con diferentes diccionarios (por ejemplo, un diccionario muy pequeño y específico frente a uno muy grande y general) y observar cómo cambia la tasa de éxito. Cuanto más grande y relevante sea el diccionario, mayor será la tasa de éxito potencial contra contraseñas comunes. Sin embargo, para contraseñas verdaderamente aleatorias y complejas, los ataques de diccionario siempre tendrán una baja tasa de éxito, lo que enfatiza la necesidad de otras técnicas de cracking (como la fuerza bruta) o, lo que es más importante, políticas de contraseñas robustas.

Este análisis refuerza la importancia de usar contraseñas fuertes y únicas que no sean fáciles de adivinar o encontrar en diccionarios comunes para protegerse contra tales ataques.

Resumen

En este laboratorio, adquiriste experiencia práctica con John the Ripper y los ataques de diccionario. Aprendiste a seleccionar y combinar diccionarios para mejorar los esfuerzos de cracking. También comprendiste las limitaciones inherentes de los ataques de diccionario, particularmente contra contraseñas fuertes y únicas. Además, exploraste métodos para generar diccionarios personalizados y analizaste las tasas de éxito de estos ataques. Este laboratorio te ha proporcionado información práctica sobre una técnica fundamental de cracking de contraseñas y ha reforzado la importancia de prácticas sólidas de seguridad de contraseñas.