Introducción
En este laboratorio, explorará varias técnicas para optimizar el rendimiento de John the Ripper, una potente herramienta de cracking de contraseñas. El cracking de contraseñas eficiente a menudo requiere aprovechar al máximo los recursos de hardware disponibles. Aprenderá a configurar John the Ripper para utilizar múltiples núcleos de CPU, comprenderá sus capacidades de cracking con GPU, ajustará la configuración de benchmarking para una medición precisa del rendimiento, comparará su rendimiento con GPU con Hashcat y supervisará los recursos del sistema durante las operaciones de cracking. Estas habilidades son cruciales para cualquier persona involucrada en ciberseguridad, pruebas de penetración o administración de sistemas, permitiéndoles maximizar la eficiencia de sus tareas de auditoría de contraseñas.
Utilizar Múltiples Núcleos de CPU
En este paso, aprenderá a configurar John the Ripper para utilizar múltiples núcleos de CPU, lo que puede acelerar significativamente el proceso de cracking en sistemas con procesadores multinúcleo. Por defecto, John the Ripper podría no utilizar todos los núcleos disponibles. Puede especificar el número de núcleos de CPU a utilizar con la opción --fork.
Primero, ejecutemos un benchmark simple sin especificar el número de núcleos para ver el rendimiento por defecto.
john --test=0
Verá una salida similar a esta, mostrando el rendimiento para varios tipos de hash:
Benchmarking: Traditional DES [32/32 BS SSE2-i]... DONE
Many calculations will be done, please be patient.
Raw: 100000 c/s real, 100000 c/s virtual
Benchmarking: BSDI DES [32/32 BS SSE2-i]... DONE
Raw: 100000 c/s real, 100000 c/s virtual
...
Ahora, ejecutemos el benchmark nuevamente, indicando explícitamente a John the Ripper que utilice múltiples núcleos de CPU. Para saber el número de núcleos de CPU disponibles en su sistema, puede usar el comando nproc.
nproc
Este comando mostrará el número de unidades de procesamiento disponibles. Por ejemplo, si muestra 2, tiene 2 núcleos de CPU.
Ahora, use la opción --fork con el número de núcleos que desea utilizar. Reemplace $(nproc) con el número real de núcleos si lo prefiere, pero $(nproc) es dinámico.
john --test=0 --fork=$(nproc)
Compare los números de rendimiento "Raw" de los dos benchmarks. Debería observar un aumento en la velocidad de cracking al usar múltiples núcleos, especialmente para tipos de hash intensivos en CPU. La opción --fork crea procesos separados, cada uno trabajando en una porción de la tarea de cracking, aprovechando así el procesamiento paralelo.
Finalmente, intentemos crackear un archivo de contraseñas utilizando múltiples núcleos. Tenemos un archivo passwords.txt en su directorio ~/project.
john --wordlist=~/project/wordlist.txt --fork=$(nproc) ~/project/passwords.txt
Una vez completado el cracking, puede ver las contraseñas crackeadas:
john --show ~/project/passwords.txt
Este comando mostrará cualquier contraseña que John the Ripper haya crackeado con éxito.
Configurar John the Ripper para Cracking con GPU (si aplica)
En este paso, discutiremos la configuración de John the Ripper para el cracking con GPU. Si bien el entorno LabEx típicamente no proporciona recursos de GPU dedicados para laboratorios generales, comprender este concepto es crucial para optimizar John the Ripper en sistemas con GPUs compatibles. John the Ripper soporta el cracking con GPU a través de sus implementaciones OpenCL y CUDA, que pueden ofrecer mejoras significativas de velocidad sobre el cracking con CPU para ciertos tipos de hash.
Para verificar si su compilación de John the Ripper soporta OpenCL o CUDA, puede ejecutar el siguiente comando:
john --list=opencl-devices
Si se detectan dispositivos OpenCL, verá una salida similar a esta (aunque probablemente vacía en este entorno):
No OpenCL devices found.
Si estuviera en un sistema con una GPU compatible y los drivers de OpenCL instalados, vería una lista de los dispositivos de GPU disponibles. Por ejemplo:
Device #0: NVIDIA GeForce RTX 3080, 10240MB, 1710MHz, 68CU
Para utilizar un dispositivo de GPU específico para el cracking, normalmente usaría la opción --format con un formato habilitado para OpenCL (por ejemplo, raw-md5-opencl) y potencialmente la opción --device para seleccionar una GPU específica si hay varias presentes.
Por ejemplo, en un sistema con una GPU, podría ejecutar:
john --format=raw-md5-opencl --wordlist=~/project/wordlist.txt ~/project/passwords.txt
Nota: Dado que este entorno LabEx no tiene una GPU, el comando anterior probablemente fallará o se ejecutará con la opción de respaldo de CPU si está disponible. El propósito de este paso es ilustrar el comando y el concepto, no realizar un cracking real con GPU en este entorno específico.
Para verificar que John the Ripper está configurado para intentar el cracking con GPU, buscaría mensajes que indiquen la inicialización de OpenCL o CUDA al ejecutar un comando de cracking con un formato habilitado para GPU.
Ajustar la Configuración de Benchmarking de John the Ripper
En este paso, aprenderá a ajustar la configuración de benchmarking de John the Ripper para obtener métricas de rendimiento más precisas y relevantes. El benchmark por defecto (john --test=0) ejecuta una prueba rápida en varios tipos de hash. Sin embargo, puede especificar un tipo de hash particular o una duración específica para el benchmark. Esto es útil cuando desea medir el rendimiento para un escenario de cracking específico.
Primero, listemos todos los formatos de hash disponibles que John the Ripper soporta. Esto puede ayudarle a identificar el formato específico que desea evaluar.
john --list=formats
Este comando generará una larga lista de formatos de hash soportados, por ejemplo:
raw-md5
raw-sha1
raw-sha256
...
Ahora, evaluemos un formato de hash específico, por ejemplo, raw-md5. Puede especificar el formato usando la opción --format.
john --test=0 --format=raw-md5
Verá los resultados del benchmark específicamente para el formato raw-md5.
Para obtener un benchmark más estable y preciso, especialmente para comparaciones de rendimiento, puede aumentar la duración de la prueba usando la opción --max-run-time. Esta opción especifica el tiempo máximo en segundos para que se ejecute el benchmark.
Ejecutemos un benchmark de raw-md5 durante 10 segundos:
john --test=0 --format=raw-md5 --max-run-time=10
Observe cómo los números de rendimiento "Raw" pueden estabilizarse o proporcionar un promedio más consistente durante un tiempo de ejecución más prolongado. Esto es particularmente útil al comparar diferentes configuraciones de hardware o compilaciones de John the Ripper.
También puede combinar esto con la opción --fork del Paso 1 para evaluar el rendimiento multinúcleo para un tipo de hash específico durante un período determinado.
john --test=0 --format=raw-md5 --fork=$(nproc) --max-run-time=10
Al ajustar estas configuraciones de benchmarking, puede obtener datos de rendimiento más precisos y relevantes para sus necesidades específicas de cracking, ayudándole a tomar decisiones informadas sobre actualizaciones de hardware o cambios de configuración.
Comprender Hashcat vs. John the Ripper para GPU
En este paso, discutiremos las diferencias entre Hashcat y John the Ripper, particularmente en lo que respecta a sus capacidades de cracking con GPU. Si bien ambos son potentes herramientas de cracking de contraseñas, tienen diferentes fortalezas y debilidades, especialmente cuando se trata de aprovechar las GPUs.
John the Ripper (JtR):
- Fortalezas: Excelente para cracking basado en CPU, muy versátil con muchos formatos integrados, bueno para sistemas de un solo usuario y tiene un fuerte enfoque en ataques de diccionario y fuerza bruta. Su soporte para GPU (OpenCL/CUDA) está integrado pero históricamente menos optimizado que Hashcat para la potencia bruta de la GPU.
- Debilidades: El rendimiento de la GPU, aunque presente, puede que no siempre iguale la velocidad bruta de Hashcat para ciertos tipos de hash. La configuración para GPU a veces puede ser menos directa.
Hashcat:
- Fortalezas: Ampliamente considerado como el cracker de contraseñas basado en GPU más rápido y eficiente. Está altamente optimizado para el procesamiento paralelo en GPUs (tanto NVIDIA CUDA como AMD OpenCL). Soporta una gran variedad de tipos de hash y modos de ataque.
- Debilidades: Principalmente enfocado en GPU, por lo que el rendimiento de la CPU no es su principal fortaleza. Puede ser más complejo de aprender para principiantes debido a sus extensas opciones y modos de ataque.
Diferencias Clave para Cracking con GPU:
- Optimización: Hashcat está diseñado específicamente para la aceleración por GPU y a menudo logra tasas de hashes por segundo (H/s) más altas en GPUs en comparación con John the Ripper para el mismo tipo de hash.
- Facilidad de Uso: Las opciones de GPU de John the Ripper están integradas en su interfaz de línea de comandos existente. Hashcat tiene su propia sintaxis y opciones distintas, que pueden ser más granulares para el control de la GPU.
- Enfoque de la Comunidad: El desarrollo y la comunidad de Hashcat se centran en gran medida en maximizar el rendimiento del cracking con GPU.
Cuándo usar cada uno:
- Use John the Ripper para cracking general de CPU, cuando necesite una herramienta versátil con muchas funciones integradas, o cuando esté trabajando en sistemas sin GPUs potentes.
- Use Hashcat cuando tenga acceso a GPUs potentes y necesite las velocidades de cracking más rápidas para una amplia gama de tipos de hash, especialmente en escenarios profesionales de pruebas de penetración o auditoría.
Para ilustrar, si tuviera Hashcat instalado (lo cual no es por defecto en este entorno), un comando típico para crackear hashes MD5 usando una GPU se vería así:
## This command is for illustration only and will not work without Hashcat installed
## hashcat -m 0 -a 0 ~/project/passwords.txt ~/project/wordlist.txt
Donde -m 0 especifica el tipo de hash MD5 y -a 0 especifica un ataque de diccionario.
Comprender estas diferencias le ayuda a elegir la herramienta adecuada para el trabajo, maximizando su eficiencia en tareas de auditoría de contraseñas en función del hardware disponible.
Monitorizar Recursos del Sistema Durante el Cracking
En este paso, aprenderá a monitorizar los recursos del sistema mientras John the Ripper realiza operaciones de cracking. Monitorizar el uso de CPU, el uso de memoria y la E/S de disco puede ayudarle a identificar cuellos de botella y asegurar que su sistema se está utilizando de manera eficiente. Esto es crucial para optimizar el rendimiento y solucionar problemas.
Primero, iniciemos un proceso de cracking de John the Ripper en segundo plano. Utilizaremos un simple ataque de diccionario en nuestro archivo passwords.txt.
john --wordlist=~/project/wordlist.txt ~/project/passwords.txt &
El & al final envía el proceso a segundo plano, permitiéndole continuar usando la terminal. Anote el ID del proceso (PID) que se muestra, por ejemplo: [1] 12345.
Ahora, monitoricemos el uso de CPU y memoria del sistema usando el comando top. top proporciona una vista dinámica en tiempo real de un sistema en ejecución.
top
En la salida de top, busque el proceso john. Verá su uso de CPU (%CPU) y uso de memoria (%MEM). Cuando John the Ripper está realizando cracking activamente, debería ver su valor de %CPU alto, especialmente si está utilizando múltiples núcleos (podría superar el 100% para procesos multinúcleo). Presione q para salir de top.
Otro comando útil para monitorizar procesos es htop. Si htop no está instalado, puede instalarlo:
sudo apt install -y htop
Una vez instalado, ejecute htop:
htop
htop proporciona una vista más amigable e interactiva que top, mostrando el uso de CPU por núcleo, el uso de memoria y los árboles de procesos. Puede ordenar fácilmente los procesos por uso de CPU o memoria. Busque el proceso john y observe su consumo de recursos. Presione F10 o q para salir de htop.
Para monitorizar la E/S de disco, puede usar el comando iotop. Esto es particularmente útil si sus listas de palabras o archivos de hash son muy grandes, ya que el acceso al disco puede convertirse en un cuello de botella. Si iotop no está instalado, instálelo:
sudo apt install -y iotop
Luego ejecute iotop:
sudo iotop
iotop muestra la actividad de E/S de disco en tiempo real. Busque john o procesos relacionados para ver si están leyendo o escribiendo intensamente en el disco. Presione q para salir de iotop.
Finalmente, traigamos el proceso john en segundo plano al primer plano y detengámoslo, o simplemente mátelo si todavía se está ejecutando.
fg
## Presione Ctrl+C para detener el proceso
Si fg no funciona o desea matarlo por PID:
killall john
Al monitorizar regularmente los recursos del sistema, puede identificar si John the Ripper está utilizando completamente su hardware o si hay otros procesos consumiendo recursos que podrían asignarse al cracking. Esto ayuda a ajustar su configuración de cracking para un rendimiento óptimo.
Resumen
En este laboratorio, ha adquirido experiencia práctica en la optimización del rendimiento de John the Ripper. Aprendió a aprovechar múltiples núcleos de CPU utilizando la opción --fork para acelerar el cracking. Discutimos los principios del cracking con GPU con John the Ripper, incluso en entornos sin GPUs dedicadas, enfatizando la importancia del soporte OpenCL/CUDA. También dominó el ajuste de la configuración de benchmarking para obtener métricas de rendimiento precisas para tipos de hash y duraciones específicas. Además, comprendió las diferencias clave entre John the Ripper y Hashcat para el cracking acelerado por GPU, lo que le permite elegir la herramienta más adecuada para varios escenarios. Finalmente, aprendió a monitorizar los recursos del sistema como CPU, memoria y E/S de disco durante las operaciones de cracking, lo cual es vital para identificar cuellos de botella y asegurar una utilización eficiente del hardware. Estas habilidades son fundamentales para cualquiera que busque maximizar la eficiencia de la auditoría de contraseñas y las pruebas de seguridad.


