ACTUALIZADO A DÍA 01/02/2021

USANDO JOHN THE RIPPER PARA ROMPER HASHES

En la primera parte, se ha explicado el funcionamiento de John para la obtención de claves por medio de diferentes técnicas de crackeo, lo que en John se conoce como «Modos». Posteriormente se ha explicado cada uno de ellos y sus características, también se ha descrito el uso del fichero de configuración que utiliza John para establecer opciones globales, finalmente se ha indicado como un programador puede utilizar sus conocimientos en C para escribir funciones que utilizara John en el proceso de creackeo (ver entrada anterior aquí)

Ahora, se dedicaran unas cuantas líneas a ver cómo los conocimientos adquiridos en la etapa teórica anteriormente mencionada son aplicables al comando john, por este motivo existen diferentes opciones con sus respectivos parámetros que John utiliza cuando es invocado, las opciones por línea de comandos que John soporta se detallaran a continuación y como ya se ha dicho, los conceptos teóricos tomaran sentido práctico en esta sección.

Opciones de linea de comandos John

–single «single crack» mode

Indica que John utilizará el modo de crackeo Single explicado anteriormente usando las reglas definidas en el fichero de configuración de John correspondientes a la sección [List:Rules:Single]

–wordlist=FILE –stdin wordlist mode, read words from FILE or stdin

Ambas opciones indican que John utilizará el modo de crackeo Diccionario explicado anteriormente.

–rules enable word mangling rules for wordlist mode

Con esta opción se habilitan las reglas para el modo Diccionario ubicadas en el fichero de configuración de John en la sección [List:Rules:Worldlist]

–incremental[=MODE] «incremental» mode [using section MODE]

Indica a John que se debe utilizar el modo incremental para el proceso de crackeo, la opción MODE indica que se debe tomar la definición declarada en el fichero de configuración de John, tal como se ha indicado anteriormente, se pueden declarar varias secciones de modos incrementales en dicho fichero de configuración con una etiqueta que identifica dicha sección, en esta opción, se indica dicha etiqueta para asumir los valores de configuración definidos en ella.

–external=MODE external mode or word filter

Indica a John que se debe utilizar el modo externo, donde MODE indica la etiqueta declarada en el fichero de configuración de John, de esta forma MODE tiene el mismo significado que el que tiene opción –incremental

–stdout[=LENGTH] just output candidate passwords [cut at LENGTH]

Indica a John que debe sacar en la salida estándar los password candidatos que se generan en lugar de intentar utilizarlos en el hash de passwords objetivo, junto con esta opción no se puede especificar la opción –wordlist y no se puede utilizar en conjunto con el modo de crackeo simple (Single). Si se especifica un valor para la longitud, John solamente producirá aquellos passwords que tengan dicha longitud.

–restore[=NAME] restore an interrupted session [called NAME]

Indica a John que debe restablecer una sesión anteriormente interrumpida, si no se especifica un nombre de sesión, John asumirá que la sesión esta en el fichero john.rec, si se establece el nombre de la sesión, debe ser NOMBRE_SESION.rec

–session=NAME give a new session the NAME

Indica a John que la sesión tendrá un nombre definido, solamente es valida cuando se trata de una nueva sesión y no se puede especificar cuando se restablece una sesión interrumpida, de esta forma, si esta sesión se interrumpe por algún motivo, John intentara crear un fichero con extensión .rec con el nombre de la sesión indicado.

–status[=NAME] print status of a session [called NAME]

Indica el estado de una sesión interrumpida o en ejecución para conocer su progreso.

–make-charset=FILE make a charset, FILE will be overwritten

Genera un fichero de juego de caracteres basado en las frecuencias definidas en el fichero john.pot.

–show show cracked passwords

Cuando se ha conseguido una password desde el hash objetivo se muestra por consola.

–test[=TIME] run tests and benchmarks for TIME seconds each

Indica a John que debe probar todos algoritmos de Hash compilados para verificar su correcto funcionamiento, en el caso de que solamente se desee probar algunos de algoritmos soportados se debe emplear la opción –format

–users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only

Permite seleccionar un listado de usuarios contenidos en el fichero de hash, de este modo no se intentara crackear todas las cuentas y contraseñas, sino que solamente se intentaran aquellas que se encuentren listadas en esta opción, pero obviamente, se debe conocer de antemano que una cuenta de usuario determinada existe en el fichero de hash que John intentará romper. Si se especifica el símbolo (-) se realizara la acción contraria, es decir, las cuentas de usuario listadas en esta opción se omitirán.

–groups=[-]GID[,..] load users [not] of this (these) group(s) only

Permite seleccionar un listado de grupos de usuarios contenidos en el fichero de hash, funciona de la misma forma que la opción –users con la diferencia que se definen grupos de usuarios en lugar de cuentas únicas de usuarios.

–shells=[-]SHELL[,..] load users with[out] this (these) shell(s) only

Esta opción es sumamente útil para cargar solamente aquellas cuentas de usuario que tienen un tipo de consola valida, o no cargar una serie de cuentas con un tipo de consola invalida para el atacante, en esta opción los argumentos pueden ser la ruta completa de la consola o simplemente el nombre de la consola, de este modo si se especifica –shells=sh existirá una coincidencia en la consola /bin/sh y /usr/bin/shell si se especifica la ruta completa, por ejemplo –shells=/bin/sh solamente existirá una única coincidencia. Como se ha dicho anteriormente se pueden indicar varias consolas, por ejemplo:
–shells=/bin/sh,csh,-/bin/ksh,bash

–salts=[-]COUNT load salts with[out] at least COUNT passwords only

Permite especificar los saltos que tendrá John en el proceso de crackeo, lo que en algunos casos llevará a un mejor desempeño de la ejecución del programa.

–format=NAME force hash type NAME: DES/BSDI/MD5/BF/AFS/LM/crypt

Permite definir el tipo de hash que utilizara John para romper un hash determinado, esta opción sobreescribe la característica que tiene John por defecto de auto detectar el tipo de hash utilizado en un determinado objetivo. John en ningún caso puede utilizar mas de un hash en una única ejecución, por este motivo, si un sistema tiene mas de un mecanismo de hash determinado es necesario ejecutarse una vez por cada uno de los mecanismos definidos.

–save-memory=LEVEL enable memory saving, at LEVEL 1..3

Esta opción permite que John no utilice mucha memoria y no afecte demasiado a otros procesos que se encuentren en ejecución en el sistema. Existen 3 niveles diferentes para determinar el uso de memoria de John, en el nivel 1 se le indica que no invierta memoria en nombres de login, solamente soportada cuando el modo de crackeo es simple (“Single”), el único impacto que tendrá esta opción es que no se podrán ver los nombres de login mientras se ejecuta el proceso de crackeo, los niveles 2 y 3 son niveles altos y probablemente no deberían ser empleados a menos que el uso de memoria de la maquina sea critico y john no funcione de forma adecuada en dichas condiciones.

Utilidades Adicionales incluidas en John

El paquete completo de John incluye algunas utilidades adicionales que apoyan las actividades de crackeo llevadas a cabo por John, estas utilidades son independientes al comando John y son las siguientes:

UNSHADOW

Esta utilidad combina el fichero de passwords de usuarios y el fichero de shadow típico en sistemas basados en GNU/Linux, para que posteriormente la salida de este comando pueda ser utilizada por John, su sintaxis es muy simple:

unshadow PASS-FILE SHADOW-FILE

UNAFS

Extrae los hashes de una base de datos binaria AFS y produce una salida útil para John, la salida debe de ser enviada a un fichero

unafs DATABASE-FILE NOMBRE-CELL

UNIQUE

Elimina palabras duplicadas de un diccionario sin cambiar el orden de las entradas

unique FICHERO_SALIDA

Ejemplos Prácticos usando John

Uso básico

En primer lugar, para utilizar John como crackeador de sistemas de archivos, es posible utilizar la utilidad unshadow mencionada anteriormente, en un sistema GNU/Linux encontraremos los ficheros /etc/passwd y /etc/shadow, con estos dos ficheros se puede extraer la información correspondiente a los hashes de las cuentas del sistema operativo y posteriormente utilizar John con la información que nos facilite el comando unshadow.

Con el comando anterior los hashes se almacenaran en un fichero llamado /tmp/hashes que después puede ser utilizado por John. Por otro lado, si se intenta crackear passwords en Kerberos o una base de datos binaria se debe utilizar la utilidad unafs.

Tomando como base el fichero generado por comando anterior, John puede intentar crackearlo. la forma mas simple sería la siguiente con:

Con este comando, John intentara ejecutarse en primera instancia en modo Single, posteriormente en modo diccionario y finalmente en modo incremental. Por defecto, el fichero de configuración de John tiene definido un fichero de contraseñas que se utilizará en modo diccionario, se trata de uno pequeño, por lo tanto se aconseja utilizar uno mas extenso que permita aumentar las probabilidades de éxito.

Con la opción –show se enseñan en pantalla los passwords crackeados del fichero de hashes, esta información es almacenada automáticamente por john en el fichero john.pot, donde se encuentran los hashes crackeados, por esta razón, si se vuelve a ejecutar el comando anterior, con la opción –show la salida sera la siguiente:

Por otro lado también se puede declarar la opción –shells con el fin de cargar solamente aquellos hashes que tengan una consola (o que no tengan con el símbolo “-”)

./john –shells=-/bin/bash 
./john –shells=/etc/bin
./john –shells=/etc/bin,ksh,-/bin/sh

En el primer comando se han excluido aquellas cuentas que no tengan la consola /etc/bin, existen dos coincidencias, dado que las dos cuentas validas que existen en el fichero de hashes cuentan con la consola /bin/bash por lo tanto para el primer comando se cargan ambos hashes, mientras que en el segundo solamente se intentan incluir las cuentas que tenga una consola en /etc/bin dado que no hay ninguna que cumpla con dicho filtro, no se carga ningún hash, en el tercer comando, se incluyen cuentas que tengan la consola /etc/bin, la consola ksh (que se puede localizar en cualquier ruta) y se excluye la consola /bin/sh, no se cargan hashes dado que no hay cuentas que cumplan con dicho filtro.

Por otra parte, los siguientes comandos intentan determinar si el fichero de hashes se encuentra la cuenta del usuario root con UID = 0 o con username=root y también se realiza un chequeo si existen grupos privilegiados.

El uso de las opciones –status, –session y –restore se encargan de definir y consultar el estado de las sesiones que se inician en John, el concepto de sesión, no es otro que el contexto de una ejecución del comando, es decir, cuando se ejecuta el comando John, automáticamente se crea una sesión que puede ser abortada, restablecida y consultada, para definir el nombre una sesión personalizada se puede utilizar la opción –session=Nombre_Session, si esta es abortada se puede restablecer con la opción –restore, si se desea consultar el estado de ejecución se utiliza –status

Se inicia la sesión «IncrementalSession» y posteriormente se aborta.Se inicia la sesión BackGround y se establece el proceso en background, posteriormente se consulta su progreso

./john –incremental=ascii –session=BackGround hash &
./john –status=BackGround guesses: 0 time: 0:00:00:01 c/s: 0.00

En el caso de que no se haya establecido un nombre para la sesión por medio del uso de la opción –session para consultar el estado de la ejecución de la sesión ejecutada en Background no hace falta especificar ningún parámetro a la opción –status.

Para reestablecer la sesion BackGround anteriormente abortada:

./john –restore=BackGround
Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64])

El mecanismo que utiliza John para almacenar las sesiones que se inician en cada ejecución, consiste simplemente en la creación de un fichero cuyo nombre sera el que se ha especificado en la opción –session y la extensión será .rec, en el caso de que no se indique un nombre de sesión, el nombre del fichero sera john.rec. Por otro lado, además del fichero .rec también se genera otro fichero con extensión .log y con el nombre de la sesión (john.log si no se ha establecido un nombre a la sesión) de esta forma es posible ver las operaciones que se han llevado a cabo por John, lo que en algunos casos puede resultar muy útil.

Especificando modos de ejecución

Por medio de opciones por línea de comandos es posible indicar a la ejecución de John qué modos interesa que ejecute, de este modo se elimina la ejecución por defecto que indica que la precedencia es: Single, Wordlist e Incremental.

Para indicar a john que utilice el modo Single se especifica la opción –single o -si (forma abreviada)

john –single hashes
./john –si hash hashes

Con la ejecución anterior John intentará solamente ejecutar el modo Single, que como ya se ha indicado, no utiliza ningún diccionario, sino que se basa simplemente en la información contenida en los hashes empleados.

Para habilitar el modo Wordlist, es necesario indicar la opción –wordlist especificando como parámetro el diccionario, por otro lado también se aconseja habilitar las reglas para manejo de palabras.

Como en el caso del modo Simple, también se pueden emplear las opciones abreviadas:

./john –w=password.lst –ru hashes

Por otro lado, también es aconsejable enviar un diccionario sin palabras repetidas, por este motivo es recomendable utilizar la utilidad unique que permite filtrar un diccionario de palabras y eliminar las repetidas, un ejemplo de su uso podría ser:

Con el comando anterior, se generar un nuevo diccionario de palabras con solamente aquellas palabras que no se encuentran duplicadas en el diccionario. Sin embargo, con el uso de la opción –stdout se generará un diccionario un poco mas compacto y preciso. Suponiendo que se sabe que una o varias contraseñas utilizan un numero fijo de caracteres, se puede indicar que las palabras del nuevo diccionario solamente tengan una longitud máxima de X caracteres:

john –wordlist=dictionary .lst –rules –stdout=5 | ./unique uniques.lst

En el ejemplo anterior, en el diccionario de palabras, cada entrada contendrá una longitud máxima de 5 caracteres

También se puede utilizar el modo incremental especificando la opción –incremental o -i que es la forma abreviada de la opción, simplemente especificando esta opción causará que John utilice las opciones incrementales por defecto definidas en el fichero de configuración de John, en concreto en la sección [Incremental:All]. Dado que para definir el modo incremental se pueden establecer secciones personalizadas, la opción –incremental también recibe como parámetro el nombre de dicha sección.

john -i hashes
john –incremental hashes
john –i=Alpha hashes
john –incremental=Alpha hashes

Finalmente, solo resta indicar el modo external, que se especifica con el uso de la opción –external cuyo parámetro es la sección donde se encuentra definida la función programada, por ejemplo en el fichero de configuración por defecto de John, se definen algunas rutinas predefinidas para cada uno de los métodos aceptados por John:

./john –external=LanMan hashes

De esta forma se tomaran las funciones definidas en la sección [List.External:LanMan]

Charsets

Una vez se ha conseguido una o varias contraseñas, estas son almacenadas en el fichero john.pot, almacenando de esta forma los juegos de caracteres que las contraseñas contienen, algunas veces, algunas contraseñas consisten de caracteres especiales o palabras en diferentes lenguajes que no se incluyen en los charsets por defecto que vienen incluidos en John, por esta razon existe la opcion –make-charset que permite añadir o crear un nuevo charset en base a los caracteres almacenados en el fichero john.pot, esto es útil para posteriores ejecuciones de John utilizando el modo incremental.
Creando un nuevo juego de caracteres en función de contraseñas almacenadas en el fichero john.pot

 

John The Ripper o JTR, es una herramienta de conocimiento y uso casi obligatorio por parte de cualquier persona que se dedique al pentesting, por ese motivo este post ha sido lo más detallado posible con el objetivo de aportar una referencia en castellano que sirva como guia para aprender a usarlo. Se invita al lector que explore por su cuenta las diferentes opciones que contiene esta genial herramienta.

Un saludo y Happy Hack!
Adastra.