Inicio > Cracking > Uso practico de John The Ripper

Uso practico de John The Ripper


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 los modos soportados en John y sus diferentes características, también se ha descrito el uso del fichero de configuración que utiliza John para recuperar opciones de configuración 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 lineas a ver, como 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 de linea de comandos que John soporta se detallaran a continuación y como ya se ha dicho, los conceptos teóricos tomaran sentido practico 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 MODO indica la etiqueta declarada en el fichero de configuración de John, de esta forma MODO tiene el mismo significado que el que tiene opcion –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 estatus 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 un 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 llevara 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 sobre-escribe 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 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 a John que no invierta memoria en nombres de login, solamente soportada cuando e 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

MAILER

Se trata de un script que enviá de todos los usuarios que tienen claves débiles, se puede editar el mensaje incluido en el script antes de usarlo

mailer PASS_FILE

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.

unshadow /etc/passwd /etc/shadow > hashes

Con el comando anterior los hashes se almacenaran en un fichero llamado 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 comando anterior, John puede utilizar el fichero de hashes para intentar crackearlo, la forma mas simple seria con:

./john hashes Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64]) marina (adastra) admin (root)

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 diccionario utilizado cuando para utilizarse 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:

./john –show hash root:admin:0:0:root:/root:/bin/bash adastra:marina:1000:1000:adastra,,,:/home/adastra:/bin/bash 2 password hashes cracked, 0 left

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=-/etc/bin hash Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64]) peraspera (adastra) splenderanno (root) guesses: 2 time: 0:00:00:08 100% (2) c/s: 205 trying: peraspera – marina
./john –shells=/etc/bin hash No password hashes loaded
./john –shells=/etc/bin hash ,ksh,-/bin/shNo password hashes loaded

En el primer comando se ha excluido aquellas cuentas que tengan 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 si se realiza un chequeo si existen grupos privilegiados.

./john -users=0 hash Loaded 1 password hash (generic crypt(3) [?/64]) guesses: 0 time: 0:00:00:02 80% (1) c/s: 205 trying: RootD – Root61 admin (root)
./john -users=root hash Loaded 1 password hash (generic crypt(3) [?/64]) admin (root)
./john –groups=0,1 hash Loaded 1 password hash (generic crypt(3) [?/64]) admin (root)

El uso de las opciones –status, –session y –restore se encargan de definir y consultar el estado de las sessiones 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 es estado de ejecución se utiliza –status

Se inicia la sesión IncrementalSession y posteriormente se aborta.

./john –incremental=Alpha –session=IncrementalSession hash Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64]) guesses: 0 time: 0:00:00:05 c/s: 203 trying: mooky – stoche Session aborted

Se inicia la sesión BackGround y se establece el proceso en background, posteriormente se consulta su progreso

./john –incremental=Alpha –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, aparte 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 util.

Especificando modos de ejecución

Por medio de opciones de linea de comandos es posible indicar a la ejecución de John que modos nos 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 al john que utilice el modo Single se especifica la opción –single o -si (forma abreviada)

./john –single hash./john –si hash hash2

Con la ejecución anterior John intentara 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 personal contenida en los hashes empleados.

Para habilitar solamente 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.

./john –wordlist=dictionary.lst –rules hash Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64]) adastra (adastra) admin (root)

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

./john –w=password.lst –ru hash Loaded 2 password hashes with 2 different salts (generic crypt(3) [?/64]) peraspera (adastra) admin (root)

Por otro lado, también es aconsejable suministrar 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:

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

Con el comando anterior, se generar un nuevo diccionario de palabras con solamente aquellas palabras que no se encuentran duplicadas en el diccionario dictionary.lst

Sin embargo, con el uso de la opción –stdout se puede generar un diccionario un poco mas compacto y por preciso, suponiendo que se sabe que la contraseña que emplea una o varias cuentas en el hash utiliza un numero X de caracteres, se puede establecer, que las palabras incluidas en el 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 hash./john –incremental hash./john –i=Alpha hash./john –incremental=Alpha hash

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 hash

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 adicionar o crear en un nuevo charset en base a los caracteres almacenados en el fichero john.pot, esto es util para posteriores ejecuciones de John utilizando el modo incremental.

Adicionando caracteres al juego de caracteres incluido en John llamado all.chr

./john –make-charset=all.chr Loaded 2 plaintexts Generating charsets… 1 2 3 4 5 6 7 8 DONE Generating cracking order… DONE Successfully written charset file: all.chr (9 characters)

Creando un nuevo juego de caracteres en función de contraseñas almacenadas en el fichero john.pot

./john –make-charset=custom.chr Loaded 2 plaintexts Generating charsets… 1 2 3 4 5 6 7 8 DONE Generating cracking order… DONE Successfully written charset file: custom.chr (9 characters)

Utilidad Mailer

Esta utilidad debe de ser editada con el fin de adicionar campos personalizados, tales como el descripción del mensaje o inclusive adicionar lógica adicional, se trata de un script muy corto y sencillo que incluye lo siguiente:

#!/bin/sh## This file is part of John the Ripper password cracker,# Copyright (c) 1996-98 by Solar Designer#if [ $# -ne 1 ]; then

echo “Usage: $0 PASSWORD-FILE”

exit 0

fi

# There’s no need to mail users with these shells

SHELLS=-,/bin/false,/dev/null,/bin/sync

# Look for John in the same directory with this script

DIR=”`echo “$0″ | sed ‘s,/[^/]*$,,’`”

# Let’s start

$DIR/john -show “$1″ -shells:$SHELLS | sed -n ‘s/:.*//p’ |

(

SENT=0

while read LOGIN; do

echo Sending mail to “$LOGIN”…

# You’ll probably want to edit the message below

mail -s ‘Bad password’ “$LOGIN” << EOF

Hello!

Your password for account “$LOGIN” is insecure. Please change it as soon

as possible.

Yours,

Password Checking Robot.

EOF

SENT=$(($SENT+1))

done

echo $SENT messages sent

)

En el listado del programa, se incluyen sentencias muy sencillas, solamente se obtiene el listado de hashes, se itera sobre cada uno de los usuarios y posteriormente se enviá un mensaje a cada uno de ellos. Sin embargo se utiliza el comando “mail”, este comando hace parte de las utilidades de incluidas en el paquete mailutils en distribuciones Debian/Ubuntu, por este motivo es necesario tenerlo instalado para que este script funcione adecuadamente, simplemente ejecutando el comando:

apt-get install mailutils

con esto sera suficiente, ahora es posible utilizar esta utilidad.

./mailer hash Sending mail to root… Sending mail to adastra… 2 messages sent
  1. Andres Baena
    mayo 9, 2013 en 6:53 pm | #1

    Muy interesante la manera en que utilizar JTR para romper las Hashes, pero otro uso practico es como generador de diccionario para romper WPA/WPA2, aca dejo un tutorial de como hacerlo.

    http://zonaunix.blogspot.com/2013/05/crackear-wpawpa2-con-john-ripper.html

    Espero que lo visiten para que conozcan otra manera del uso de esta potente herramienta.

  1. No trackbacks yet.
Disculpa, debes iniciar sesión para escribir un comentario.
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 777 seguidores

%d personas les gusta esto: