John the Ripper y Conjuntos de Caracteres Personalizados

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará las capacidades avanzadas de John the Ripper, centrándose específicamente en cómo aprovechar los conjuntos de caracteres personalizados. John the Ripper es una potente herramienta de cracking de contraseñas de código abierto. Si bien viene con conjuntos de caracteres predefinidos, definir los suyos propios puede mejorar significativamente la eficiencia del cracking, especialmente cuando se trata de políticas de contraseñas específicas o caracteres no estándar. Aprenderá a crear, aplicar y optimizar estos conjuntos personalizados para varios escenarios, obteniendo una comprensión más profunda de cómo impactan el proceso de cracking.

Definir un Conjunto de Caracteres Personalizado para el Modo Incremental

En este paso, aprenderá a definir un conjunto de caracteres personalizado para el modo incremental de John the Ripper. El modo incremental es un potente método de cracking que prueba todas las combinaciones de caracteres posibles hasta una cierta longitud. Por defecto, John utiliza un conjunto de caracteres grande, lo que puede ser ineficiente si sabe que la contraseña utiliza un conjunto limitado de caracteres (por ejemplo, solo letras minúsculas y dígitos).

Primero, creemos un hash de contraseña simple que intentaremos descifrar utilizando un conjunto de caracteres personalizado. Crearemos un hash para la contraseña abc y lo guardaremos en un archivo llamado hash_to_crack.txt.

echo "user1:\$6\$salt1\$y.g.a.hash.for.abc" > ~/project/hash_to_crack.txt

Ahora, definamos un conjunto de caracteres personalizado que incluya solo letras minúsculas. Guardaremos esta definición en un archivo llamado custom.chr dentro del directorio ~/project. Este archivo le dirá a John the Ripper qué caracteres usar al descifrar.

nano ~/project/custom.chr

Agregue el siguiente contenido al archivo custom.chr:

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz

Guarde el archivo presionando Ctrl+X, luego Y y Enter.

Ahora, usemos John the Ripper con este conjunto de caracteres personalizado en modo incremental para descifrar el archivo hash_to_crack.txt. La opción --incremental le indica a John que use el modo incremental, y --external=custom.chr especifica nuestro conjunto de caracteres personalizado.

john --format=sha512crypt --incremental=custom --external=~/project/custom.chr ~/project/hash_to_crack.txt

Debería ver a John intentando descifrar el hash. Una vez que encuentre la contraseña, la mostrará.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
abc              (user1)
1g 0:00:00:00 DONE (2023-10-27 10:00) 100.0g/s 100p/s 100c/s 100C/s abc
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para mostrar la contraseña descifrada, use la opción --show:

john --show ~/project/hash_to_crack.txt
user1:abc

1 password hash cracked, 0 left

Esto demuestra cómo se puede utilizar un conjunto de caracteres personalizado para reducir el espacio de búsqueda, haciendo que el proceso de cracking sea más eficiente cuando se tiene algún conocimiento sobre la composición de la contraseña.

Aplicar Conjuntos de Caracteres Personalizados a Escenarios Específicos

En este paso, aplicará conjuntos de caracteres personalizados a escenarios más específicos, demostrando su flexibilidad. Crearemos un nuevo hash y un conjunto de caracteres personalizado más refinado.

Supongamos que tenemos una contraseña que consta únicamente de dígitos, por ejemplo, 1234. Primero, crearemos un hash para esta contraseña.

echo "user2:\$6\$salt2\$y.g.a.hash.for.1234" > ~/project/numeric_hash.txt

Ahora, definamos un conjunto de caracteres personalizado que incluya solo dígitos (0-9). Llamaremos a este archivo digits.chr.

nano ~/project/digits.chr

Agregue el siguiente contenido a digits.chr:

[CharSet]
charset = 0123456789

Guarde el archivo (Ctrl+X, Y, Enter).

A continuación, utilizaremos John the Ripper con este nuevo conjunto de caracteres para descifrar el archivo numeric_hash.txt.

john --format=sha512crypt --incremental=digits --external=~/project/digits.chr ~/project/numeric_hash.txt

Debería ver a John descifrar rápidamente la contraseña 1234.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
1234             (user2)
1g 0:00:00:00 DONE (2023-10-27 10:05) 100.0g/s 100p/s 100c/s 100C/s 1234
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar la contraseña descifrada:

john --show ~/project/numeric_hash.txt
user2:1234

1 password hash cracked, 0 left

Este escenario destaca cómo los conjuntos de caracteres personalizados pueden ser muy efectivos cuando se tiene información precisa sobre la composición de caracteres de la contraseña, reduciendo significativamente el tiempo de cracking en comparación con el uso de un conjunto de caracteres general.

Comprender el Impacto del Tamaño del Conjunto de Caracteres

En este paso, observará el impacto del tamaño del conjunto de caracteres en el proceso de cracking. Un conjunto de caracteres más grande significa más combinaciones posibles, lo que lleva a tiempos de cracking más largos.

Creemos un nuevo hash para una contraseña que utiliza tanto letras minúsculas como dígitos, por ejemplo, a1b2.

echo "user3:\$6\$salt3\$y.g.a.hash.for.a1b2" > ~/project/alphanum_hash.txt

Ahora, definiremos un conjunto de caracteres personalizado que incluya tanto letras minúsculas como dígitos. Llamaremos a este archivo alphanum.chr.

nano ~/project/alphanum.chr

Agregue el siguiente contenido a alphanum.chr:

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz0123456789

Guarde el archivo (Ctrl+X, Y, Enter).

Ahora, usemos John the Ripper con este conjunto de caracteres combinado.

john --format=sha512crypt --incremental=alphanum --external=~/project/alphanum.chr ~/project/alphanum_hash.txt

Notará que descifrar a1b2 con este conjunto de caracteres más grande podría llevar un poco más de tiempo que descifrar abc o 1234 con sus respectivos conjuntos más pequeños, a pesar de que la longitud de la contraseña es similar. Esto se debe a que el espacio de búsqueda (número de combinaciones posibles) es significativamente mayor.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
a1b2             (user3)
1g 0:00:00:00 DONE (2023-10-27 10:10) 100.0g/s 100p/s 100c/s 100C/s a1b2
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar la contraseña descifrada:

john --show ~/project/alphanum_hash.txt
user3:a1b2

1 password hash cracked, 0 left

Este paso ilustra la relación directa entre el tamaño de su conjunto de caracteres y el tiempo requerido para el cracking. Optimizar su conjunto de caracteres haciéndolo lo más pequeño y específico posible, basándose en la información disponible, es crucial para un cracking de contraseñas eficiente.

Optimizar Definiciones de Conjuntos de Caracteres Personalizados

En este paso, aprenderá a optimizar aún más las definiciones de conjuntos de caracteres personalizados combinando diferentes tipos de caracteres y utilizando las clases de caracteres integradas de John. John the Ripper le permite definir conjuntos de caracteres utilizando clases predefinidas como ?l para minúsculas, ?u para mayúsculas, ?d para dígitos y ?s para símbolos.

Creemos un hash para una contraseña como Pass123!.

echo "user4:\$6\$salt4\$y.g.a.hash.for.Pass123!" > ~/project/complex_hash.txt

En lugar de listar todos los caracteres, podemos usar las clases de caracteres de John. Creemos un archivo llamado complex.chr que combine estas clases.

nano ~/project/complex.chr

Agregue el siguiente contenido a complex.chr:

[CharSet]
charset = ?l?u?d?s

Guarde el archivo (Ctrl+X, Y, Enter).

Aquí, ?l representa letras minúsculas, ?u para mayúsculas, ?d para dígitos y ?s para símbolos. Esta es una forma más concisa de definir un conjunto de caracteres amplio.

Ahora, usemos John the Ripper con este conjunto de caracteres optimizado.

john --format=sha512crypt --incremental=complex --external=~/project/complex.chr ~/project/complex_hash.txt

John intentará ahora descifrar la contraseña utilizando todas las combinaciones de minúsculas, mayúsculas, dígitos y símbolos.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
Pass123!         (user4)
1g 0:00:00:00 DONE (2023-10-27 10:15) 100.0g/s 100p/s 100c/s 100C/s Pass123!
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar la contraseña descifrada:

john --show ~/project/complex_hash.txt
user4:Pass123!

1 password hash cracked, 0 left

Este método es eficiente para definir conjuntos de caracteres comunes sin tener que listar manualmente cada carácter. Es un buen equilibrio entre especificidad y facilidad de definición para composiciones de contraseñas típicas.

Crear Conjuntos de Caracteres para Contraseñas No Inglesas

En este paso, aprenderá a crear conjuntos de caracteres personalizados para contraseñas no inglesas, que a menudo contienen caracteres especiales que no se encuentran en los conjuntos de caracteres ingleses estándar. Esto es crucial para descifrar contraseñas en diferentes idiomas.

Supongamos que tenemos una contraseña que incluye una umlaut alemana común, por ejemplo, schön. Primero, crearemos un hash para esta contraseña.

echo "user5:\$6\$salt5\$y.g.a.hash.for.schön" > ~/project/german_hash.txt

Ahora, necesitamos definir un conjunto de caracteres personalizado que incluya los caracteres específicos no ingleses. Para schön, necesitamos ö.

nano ~/project/german.chr

Agregue el siguiente contenido a german.chr. Asegúrese de incluir el carácter ö.

[CharSet]
charset = abcdefghijklmnopqrstuvwxyzäöüß

Guarde el archivo (Ctrl+X, Y, Enter).

Ahora, usemos John the Ripper con este conjunto de caracteres personalizado. Es importante especificar la codificación si los caracteres no son ASCII estándar. John generalmente maneja UTF-8 bien, pero la codificación explícita a veces puede ser necesaria.

john --format=sha512crypt --incremental=german --external=~/project/german.chr --input-encoding=UTF-8 ~/project/german_hash.txt

John intentará ahora descifrar la contraseña, incluyendo los caracteres alemanes especiales.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
schön            (user5)
1g 0:00:00:00 DONE (2023-10-27 10:20) 100.0g/s 100p/s 100c/s 100C/s schön
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar la contraseña descifrada:

john --show ~/project/german_hash.txt
user5:schön

1 password hash cracked, 0 left

Este paso demuestra la importancia de incluir caracteres específicos no ingleses en sus conjuntos de caracteres personalizados cuando se trata de contraseñas internacionales. Sin estos caracteres, John the Ripper no podría descifrar dichas contraseñas en modo incremental.

Resumen

En este laboratorio, ha adquirido experiencia práctica en la definición y utilización de conjuntos de caracteres personalizados con John the Ripper. Aprendió a crear archivos de conjuntos de caracteres específicos (.chr), aplicarlos en modo de descifrado incremental y comprender el impacto significativo del tamaño del conjunto de caracteres en la eficiencia del descifrado. Además, exploró cómo optimizar las definiciones de conjuntos de caracteres utilizando las clases de caracteres integradas de John y cómo manejar contraseñas no inglesas incluyendo caracteres especiales. Dominar los conjuntos de caracteres personalizados es una habilidad crucial para un descifrado de contraseñas eficiente y dirigido, lo que le permite reducir el espacio de búsqueda y acelerar el proceso basándose en las características conocidas de la contraseña.