Solucionar problemas comunes de John the Ripper

Kali LinuxBeginner
Practicar Ahora

Introducción

John the Ripper (JtR) es una potente y ampliamente utilizada herramienta de cracking de contraseñas de código abierto. Si bien es increíblemente efectiva, los usuarios, especialmente los principiantes, pueden encontrarse con problemas comunes que detienen su progreso. Estos problemas pueden variar desde mensajes de error crípticos hasta ralentizaciones en el rendimiento.

En este laboratorio, aprenderá a solucionar algunos de los problemas más frecuentes que se encuentran al usar John the Ripper. Cubriremos errores como "No hashes loaded" (No se cargaron hashes), trataremos formatos de hash inválidos, abordaremos cuellos de botella en el rendimiento, manejaremos archivos de sesión corruptos y aprenderemos dónde encontrar ayuda cuando se quede atascado. Al final de este laboratorio, estará mejor equipado para diagnosticar y resolver problemas de JtR de manera eficiente.

Resolver el error "No hashes loaded"

En este paso, investigaremos uno de los errores más comunes en John the Ripper: No password hashes loaded (No se cargaron hashes de contraseña). Este error ocurre típicamente por dos razones principales: John ya ha descifrado todos los hashes en el archivo proporcionado, o el archivo no está en un formato que John pueda entender.

Primero, ejecutemos John en un archivo de hash válido. El script de configuración ya ha creado un archivo llamado shadow.txt en su directorio actual (~/project) que contiene el hash de contraseña de un usuario en un formato que John reconoce.

Intentemos descifrarlo usando una lista de palabras simple.

john --wordlist=pass.list shadow.txt

Debería ver una salida que indica que John ha cargado un hash y está intentando descifrarlo. Debería encontrar la contraseña rápidamente.

Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Cost 1 (algorithm [1:descrypt]...
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (dummyuser)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100.0g/s 100.0p/s 100.0c/s 100.0C/s password123
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Ahora que la contraseña ha sido descifrada, John la almacena en un archivo llamado john.pot. Intentemos ejecutar el mismo comando exacto de nuevo.

john --wordlist=pass.list shadow.txt

Esta vez, verá el error.

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

Esto se debe a que John verifica el archivo john.pot antes de comenzar e ignora cualquier hash que ya haya sido descifrado. Puede ver el contenido del archivo john.pot para confirmarlo.

cat ~/.john/john.pot

La salida mostrará el hash y la contraseña descifrada.

$1$notarealhash$b5gQ1P2kPiyP2t.OqI0kS1:password123

Otra razón para este error es un formato de archivo inválido. Creemos un archivo que no contenga ningún hash.

echo "this is just a text file" > plain.txt

Ahora, intente ejecutar John en él.

john plain.txt

Verá el mismo error "No password hashes loaded" porque John no pudo encontrar ningún dato en el archivo que pareciera un hash de contraseña. Asegúrese siempre de que su archivo de destino contenga hashes en un formato compatible.

Depurar el error "Invalid hash type"

En este paso, abordaremos los problemas relacionados con los tipos de hash. A veces, John no puede detectar automáticamente el tipo de hash, o un usuario podría especificar el incorrecto usando la bandera --format, lo que lleva a errores o intentos de cracking fallidos.

Primero, veamos qué sucede cuando John encuentra un archivo con una cadena de hash malformada. Tenemos un archivo llamado invalid_hashes.txt para este propósito.

john invalid_hashes.txt

John analizará el archivo e informará que no pudo cargar ningún hash válido, similar al error del paso anterior.

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

Ahora, usemos un archivo con un hash válido pero especifiquemos el formato incorrecto. Nuestro archivo hashes_md5.txt contiene un hash raw-MD5 estándar, pero le diremos a John que es un hash NT.

john --wordlist=pass.list --format=nt hashes_md5.txt

John producirá una advertencia o un error porque los datos del hash no coinciden con el formato especificado.

Warning: invalid ciphertext ignored: user1:5d41402abc4b2a76b9719d911017c592
No password hashes loaded (see FAQ)

Para solucionar esto, debe proporcionar el formato de hash correcto. Si conoce el formato como raw-MD5, puede especificarlo directamente. Esto suele ser más rápido que dejar que John lo detecte automáticamente.

Ejecutemos el comando con el formato correcto.

john --wordlist=pass.list --format=raw-md5 hashes_md5.txt

Esta vez, el comando tiene éxito y descifra la contraseña.

Using default input encoding: UTF-8
Loaded 1 password hash (raw-MD5 [MD5 128/128 SSE2-16])
Cost 1 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (user1)
1g 0:00:00:00 DONE (2023-10-27 10:35) 100.0g/s 1234Kp/s 1234Kc/s 1234KC/s 123..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Si no está seguro del tipo de hash, puede omitir la bandera --format y dejar que John intente detectarlo automáticamente. Sin embargo, para hashes ambiguos o no estándar, especificar el formato es la mejor manera de garantizar el éxito.

Abordar cuellos de botella de rendimiento

En este paso, exploraremos cómo identificar y abordar problemas de rendimiento. El cracking de contraseñas puede ser una tarea que consume muchos recursos, y un rendimiento lento puede hacerlo poco práctico.

Una métrica clave para el rendimiento en John the Ripper es "candidatos por segundo" (c/s). Puede ejecutar una prueba de rendimiento (benchmark) para ver qué tan bien funciona su sistema con diferentes algoritmos de hashing.

john --test

Este comando ejecutará una serie de pruebas de rendimiento. Observe la salida para ver las tasas de c/s para varios algoritmos.

Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE
Many salts:	1234K c/s real, 1234K c/s virtual
Only one salt:	1111K c/s real, 1111K c/s virtual

... (muchos otros algoritmos) ...

Benchmarking: raw-MD5 [MD5 128/128 SSE2-16]... DONE
Raw:	45678K c/s real, 45678K c/s virtual

Una de las formas más efectivas de mejorar el rendimiento en un sistema multinúcleo es utilizar el procesamiento paralelo. John puede hacer esto con la opción --fork=N, donde N es el número de procesos a generar.

Antes de probar esto, limpiemos el archivo john.pot para poder volver a descifrar el hash del Paso 1.

rm ~/.john/john.pot

Ahora, ejecutemos una sesión de cracking de un solo núcleo en shadow.txt. Mientras se ejecuta, presione cualquier tecla (como Enter) para ver el estado. Anote la tasa de c/s.

john --wordlist=pass.list shadow.txt

Después de un momento, presione Enter. Verá una línea de estado. Luego presione Ctrl+C para detenerlo.

Ahora, intentemos de nuevo con dos procesos paralelos.

john --fork=2 --wordlist=pass.list shadow.txt

Esta vez, John utilizará dos núcleos de CPU para trabajar en la tarea. Si verifica el estado, la tasa general de c/s debería ser significativamente mayor, casi el doble de la tasa de un solo núcleo. Esto puede reducir drásticamente el tiempo requerido para una sesión de cracking.

Otros consejos de rendimiento incluyen:

  • Usar listas de palabras dirigidas: Una lista de palabras más pequeña y relevante es más rápida que una masiva y genérica.
  • Especificar el formato: Como se vio en el Paso 2, usar --format evita la sobrecarga de la detección automática.

Manejar archivos de sesión corruptos

En este paso, aprenderemos cómo manejar un archivo de sesión corrupto. John the Ripper guarda automáticamente su progreso en un archivo de sesión (con una extensión .rec) ubicado en el directorio ~/.john/. Esto le permite pausar y reanudar sesiones de cracking de larga duración. Sin embargo, si este archivo se corrompe, no podrá restaurar su sesión.

Comencemos una nueva sesión. La llamaremos my_session.

john --session=my_session --wordlist=pass.list corrupt_me.txt

Deje que el comando se ejecute durante unos segundos, luego presione Ctrl+C para detenerlo de forma segura. John guardará su progreso.

Session aborted

Puede ver el archivo de sesión que se creó.

ls ~/.john/
john.log  john.pot  my_session.rec

Ahora, simulemos un archivo corrupto agregándole algunos datos basura.

echo "THIS IS CORRUPTED DATA" >> ~/.john/my_session.rec

Con el archivo de sesión corrupto, intentemos reanudar nuestro trabajo.

john --restore=my_session

John no podrá analizar el archivo de recuperación y probablemente saldrá con un mensaje de error. El error exacto puede variar, pero indicará un problema con el archivo .rec.

Error in recovery file: ~/.john/my_session.rec

Cuando esto sucede, la única solución es eliminar el archivo de sesión corrupto. Esto significa que perderá el progreso de esa sesión específica y tendrá que comenzarla de nuevo. Sin embargo, cualquier contraseña que ya se haya descifrado con éxito está segura en el archivo john.pot.

Eliminemos el archivo defectuoso.

rm ~/.john/my_session.rec

Ahora puede iniciar la sesión nuevamente desde el principio. Este es un paso crucial de solución de problemas para recuperarse de bloqueos inesperados o apagados del sistema durante un intento de cracking.

Buscar ayuda en la comunidad de John the Ripper

En este paso, cubriremos qué hacer cuando lo haya intentado todo y aún esté atascado. La comunidad de John the Ripper es un recurso excelente, pero para obtener ayuda efectiva, necesita proporcionar la información correcta.

El lugar principal para el soporte de la comunidad es la lista de correo john-users. Antes de publicar, es una buena práctica buscar en los archivos para ver si su pregunta ya ha sido respondida.

Cuando necesite pedir ayuda, proporcionar información clara y completa es clave. Aquí está lo que siempre debe incluir en su solicitud:

  1. Versión de John the Ripper: Las diferentes versiones tienen diferentes características y errores.
  2. El Comando Exacto: El comando completo que utilizó para ejecutar John.
  3. La Salida Completa: Toda la salida del comando, incluidos los mensajes de error.
  4. Sistema Operativo: El sistema operativo que está utilizando (por ejemplo, Ubuntu 22.04, Windows 10).
  5. Muestra del Hash: Un ejemplo del hash que está intentando descifrar (si no es sensible).

Puede obtener su versión de John the Ripper con la opción --version. Ejecutémosla ahora.

john --version

La salida se verá algo así:

John the Ripper 1.9.0-jumbo-1 [linux-gnu 64-bit x86_64 AVX2 AC]

Saber cómo recopilar esta información hará que sea mucho más fácil para los miembros de la comunidad comprender su problema y proporcionar una solución útil. Recuerde ser educado y paciente al pedir ayuda a las comunidades de código abierto.

Resumen

En este laboratorio, adquirió experiencia práctica en la solución de algunos de los problemas más comunes con John the Ripper.

Aprendió a:

  • Diagnosticar el error No hashes loaded comprobando el archivo john.pot en busca de contraseñas ya descifradas y verificando el formato del archivo de entrada.
  • Resolver problemas de tipo de hash utilizando la opción --format para especificar el algoritmo correcto.
  • Abordar cuellos de botella en el rendimiento ejecutando benchmarks y utilizando la opción --fork para el procesamiento paralelo.
  • Recuperarse de un intento de cracking fallido eliminando un archivo de sesión corrupto (.rec).
  • Recopilar la información necesaria, como la versión de JtR y la salida del comando, para buscar ayuda de manera efectiva en la comunidad.

Con estas habilidades, ahora está mejor preparado para utilizar John the Ripper de manera más efectiva y resolver problemas a medida que surjan.