CONCEPTOS BASICOS -JOHN THE RIPPER

John the Ripper es una utilidad que permite crackear diferentes tipos de hashes para obtener passwords en base a distintos mecanismos de creckeo incluyendo ataques por fuerza bruta mediante diccionario. Se encuentra soportado en distribuciones basadas en Unix y Windows y tiene un buen nivel de eficacia y eficiencia en la obtención de claves almacenadas en hashes LM de windows y otros formatos.

Del mismo modo que algunas herramientas orientadas a tareas “pre-penetracion” esta utilidad se ejecuta desde linea de comandos, desde donde se indican una serie de opciones que determinan el comportamiento del programa.

INSTALACIÓN:

John puede instalarse desde los repositorios de Debian/Ubuntu con un simple comando APT-GET, sin embargo en muchas ocasiones no viene con la ultima versión disponible, por lo tanto se recomienda descargar el código fuente desde el sitio oficial (http://www.openwall.com/) y proceder con la instalación manual que consta de los siguientes pasos:
1. Descarga la ultima versión de John y descomprimir el fichero tar.gz en un directorio.

2. Navegar hasta el directorio src/ donde se encuentran los ficheros fuente y ejecutar uno de los dos siguientes comandos:

  • make clean generic: Para ejecutar una instalación genérica.
  • make clean <SISTEMA>: Para ejecutar una instalación especifica para un sistema determinado, esta opción es útil cuando se quiere distribuir el programa en una plataforma especifica (como por ejemplo DOS de windows):
    make clean dos-djgpp-x86-any
    make clean win32-cygwin-x86-any
    make clean linux-x86-64
    Los posibles valores pueden ser consultados con ejecutar simplemente el comando make sin ningún parámetro, de esta forma john listará los posibles valores que admitirá el campo <SISTEMA> Esta opción es recomendable en instalaciones que se mueven a una maquina distinta, por cuestiones de rendimiento, ya que cuando se ejecuta con la opción generic en tiempo de compilación se instancian características que mejoran el rendimiento de john en el sistema donde se esta creando la instalación, sin embargo si esta misma instalación se mueve a un sistema operativo con una arquitectura distinta el resultado puede ser distinto al esperado.

3. Una vez ejecutado el comando make correspondiente a la plataforma (o generic) navegar hasta el directorio run/ desde allí ejecutar el comando:

./john –test

MODOS CON JOHN THE RIPPER

Los modos son los mecanismo empleado por John para efectuar el proceso de crackeo sobre un fichero de hashes, los modos definidos permiten establecer de que manera se va a realizar el intento de obtención de las credenciales encriptadas, cada modo tiene sus ventajas, sin embargo, dependiendo del escenario de ejecución, algunos pueden ser mucho mas eficientes y eficaces que otros.

Modo Diccionario

Se trata del modo más común en ataques de fuerza bruta, consiste en la declaración de un diccionario de claves para “atacar” el objetivo con una serie de ensayos que consisten en “prueba y error” dado que este proceso puede llevar horas en ejecutarse (inclusive días o semanas dependiendo del objetivo), en ocasiones tiende a ser costoso en consumo de recursos, sin embargo puede llegar a ser muy efectivo en el caso de que se cuente con un diccionario lo suficientemente completo y la(s) clave(s) almacenada(s) en el hash sean lo suficientemente débiles o comunes.

El formato del diccionario es simple, cada linea del fichero debe contener solamente una entrada que corresponde a un password para probar

Modo Single

En este modo John intentará utilizar un amplio número de reglas de crackeo definidas. En este modo John utiliza la información de nombres de inicio de sesión y combinaciones de nombres, apellidos e información personal de cada usuario, este modo como podrá imaginarse es solamente valido cuando se cuenta con suficiente información sobre un objetivo y/o cuando un sistema se ha comprometido y el atacante solamente tiene una cuenta con privilegios limitados e intenta acceder a la cuenta de root o administrador.

Es mucho mas rápido que el modo diccionario, sin embargo la probabilidad de éxito es directamente proporcional a la fortaleza de la contraseña del sistema objetivo, en algunos casos las contraseñas no están relacionadas en lo absoluto con la información recolectada por un atacante, en estos casos la probabilidad de fracaso es muy elevada.

Modo Incremental

Se trata del modo más completo y potente que se puede utilizar en John, consiste en la combinación de todos los caracteres para resolver passwords, dado que las posibilidades son realmente grandes, este tipo de modo nunca finalizará, siendo desde luego el mas complejo, sin embargo para limitar un poco el juego de caracteres y las posibles combinaciones es posible establecer un juego de caracteres que se utilizaran para construir cada password y una longitud máxima de clave

Modo Externo

Consiste en el uso de un programa externo que debe estar escrito en lenguaje C y define un conjunto de funciones que son compiladas y utilizadas por John. Las funciones descritas serán las que John utilice para generar los passwords candidatos a ser probados en el proceso de crackeo. Se trata del modo mas complejo (lo que no significa que sea el más eficiente) sin embargo permite a un programador experimentado añadir código que es necesario para escenarios complejos que lo requieran.

CONFIGURACION PERSONALIZADA EN JOHN

En John es posible tener un fichero de configuración que determine las características generales del programa, estas características corresponden a la definición de diccionarios de passwords, Modos de ejecución, reglas para el orden de los diccionarios, rutas de ejecución entre otras cosas.
El fichero se nombra john.conf en sistemas basados en Unix y john.ini en sistemas basados en Windows, este fichero es buscando en directorio desde donde se ejecuta John.

Este fichero de configuración consta de una serie de secciones que inician con corchetes “[“ “]” dentro de las cuales se definen las propiedades y los valores de la sección “variable = valor”.

Este fichero se encuentra localizado en la ruta de ejecución del programa con los valores de algunas de las propiedades establecidas a un valor por defecto, es posible editar este fichero y cambiar los valores de las secciones que resulten de interés.

Algunas de las opciones generales de configuración de John son:

Sección de Opciones

En esta sección se definen valores generales de ejecución, representando la sección mas sencilla del fichero de configuración, los valores de esta sección en el fichero de configuración por defecto de john son:

[Options]# Wordlist file name, to be used in batch modeWordlist = $JOHN/password.lst# Use idle cycles only

Idle = Y

# Crash recovery file saving delay in seconds

Save = 600

# Beep when a password is found (who needs this anyway?)

Beep = N

Worlist: Indica simplemente la ruta del diccionario de passwords a utilizar el proceso de crackeo, esta opción es util cuando se utiliza el modo diccionario (ver el apartado anterior sobre Modos de ejecución de John), por defecto John tiene un diccionario de passwords débiles, sin embargo es un diccionario pequeño, por lo que se aconseja utilizar uno mas extenso en el caso de realizar un ataque de fuerza bruta.

Idle: Esta alternativa, si esta definida con “Y” indica que el programa solamente utilizara ciclos ociosos del procesador, reduciendo el impacto en el desempeño de otros procesos en ejecución del sistema.

Save: Se trata del intervalo de tiempo en segundos entre recuperación de caídas y actualización de ficheros. Cuando John es interrumpido por alguna razón, se generá un fichero con nombre john.rec, que incluirá la información de la sesión interrumpida, de este modo es posible volver a recuperar dicha sesión en el ultimo punto de guardado, es aquí donde esta opción define cada cuanto tiempo se generan puntos de guardado.

Beep: Si esta establecido con “Y” indica a John que debe generar un sonido “Beep” cuando se logre descifrar una contraseña valida.

Sección de Modo Diccionario y Single:

La sección de modo diccionario es declarada con: [List:Rules:Wordlist] y la sección de modo single es declarada con en esta sección [List:Rules:Single] con esto se definen algunas reglas estándar para el proceso de crackeo, algunas de ellas son complejas y determinan características tales como clases de caracteres, constantes numéricas y variables, comandos de cadenas, comandos de control de longitud, comandos de conversión de juegos de caracteres, etc.

Sección de Modo Incremental:

La sección de modo incremental se declara con: [Incremental:MODO] donde MODO es implemente un nombre predefinido que permite separar modos incrementales para cada juego de caracteres, en esta sección es posible declarar las siguientes instrucciones:

File: Se trata del fichero donde se encuentra el juego de caracteres a utilizar.

MinLen: Indica el numero de caracteres mínimo para la longitud de password, por defecto es 0

MaxLen: Indica el numero de caracteres máximo para la longitud de password, por defecto es 8

CharCount: Permite limitar el numero de caracteres que serán utilizados, de este modo John nunca intentará utilizar caracteres raros y utilizarlos para las combinaciones, esto es en la mayoría de los casos indeseable. Otro uso de esta opción, es simplemente para definir el numero de caracteres que tendrá el charset y si no corresponden con el numero total de los contenidos por el juego de datos, John lanzará un mensaje de advertencia.

Extra: Define un listado de caracteres extra que no se incluyen en el juego de caracteres especificado, el listado indicado simplemente será adicionado al juego de caracteres para realizar el proceso de crackeo

Sobre esto, en el fichero de configuración por defecto se definen las siguientes secciones incrementales:

# Incremental modes[Incremental:All]File = $JOHN/all.chrMinLen = 0

MaxLen = 8

CharCount = 95

[Incremental:Alpha]

File = $JOHN/alpha.chr

MinLen = 1

MaxLen = 8

CharCount = 26

[Incremental:Digits]

File = $JOHN/digits.chr

MinLen = 1

MaxLen = 8

CharCount = 10

[Incremental:Alnum]

File = $JOHN/alnum.chr

MinLen = 1

MaxLen = 8

CharCount = 36

[Incremental:LanMan]

File = $JOHN/lanman.chr

MinLen = 0

MaxLen = 7

CharCount = 69

DEFINICION DE MODO EXTERNO EN JOHN

Como ha indicado en párrafos anteriores, un Modo externo le permite a un programador incluir rutinas escritas en un subconjunto de lenguaje C, que John intentara compilar y ejecutar, lo que le permite a un programador definir características personalizadas que mejoren u optimicen el proceso de crackeo con John.

La sección definida para dicho fin es: [List:External:MODO] en este punto MODO es cualquier texto identificativo que se decida, al igual que en el caso de la definición de modo incremental

Las funciones externas que se pueden definir son:

init(): Se invoca en el inicio del programa, se encarga de inicializar variables globales.

filter(): Se invoca para cada palabra tratada, de esta forma se pueden filtrar algunas. Se recomienda no utilizar este método cuando se utiliza con el propio generate(). Es mejor modificar generate() para generar palabras que podrían ser filtradas.

generate(): Se invoca para generar la siguiente palabra a tratar.

restore(): Se invoca cuando se restablece una sesión interrumpida.

Todas las funciones tienen como tipo de retorno void y sin parámetros y todas las funciones tienen acceso a la variable global “word” y “int word[]” donde “word” contiene la palabra candidata a ser probada.

Otra característica interesante de este Modo, es que es compatible con todos los modos anteriormente explicados simplemente utilizando la opción –make-charset

Restricciones de Modo Externo

Como se ha indicado anteriormente, las funciones definidas en el modo externo de John constituyen solamente un subconjunto de las instrucciones y la potencia de C, lo que en algunos casos no es aceptable para el programador, solamente se espera que en próximas versiones de John, estas características se amplíen para extender la potencia de este modo de crackeo.

Las únicas instrucciones soportadas por John son: if, else, continue, break, return, int, void y while por lo tanto, como puede verse, para realizar un ciclo, no se dispone de la instrucción for, solamente se cuenta con la instrucción while.

Por otro lado, las características definidas a continuación no son soportadas por el compilador de John:

  • Invocaciones a funciones, desde una de las funciones definidas anteriormente, no se puede llamar a una función externa, ya sea desde una librería escrita en C, llamada a sistema u otra.
  • Solamente void e int son tipos de datos soportados
  • solamente arrays uni-dimensionales son validos, no se admiten matrices.
  • Structs, uniones y punteros no son soportados por el compilador de John.

En el fichero de configuración por defecto de John se encuentran algunos de los ejemplos del uso de este modo, por ejemplo:

# A simple cracker for LM hashes[List.External:LanMan]int length; // Current lengthvoid init()

{

word[0] = ‘A’ – 1; // Start with «A»

word[length = 1] = 0;

}

void generate()

{

int i;

i = length – 1; // Start from the last character

while (++word[i] > ‘Z’) // Try to increase it

if (i) // Overflow here, any more positions?

word[i–] = ‘A’; // Yes, move to the left, and repeat

else // No

if (length < 7) {

word[i = ++length] = 0; // Switch to the next length

while (i–)

word[i] = ‘A’;

return;

} else {

word = 0; return; // We’re done

}

}

void restore()

{

length = 0; // Calculate the length

while (word[length]) length++;

}

Como puede apreciarse anteriormente, se ha omitido el uso de la función filter y en lugar de ello se ha utilizado la función generate para el filtro y generación de palabras en lugar de usar la función filter por cuestiones de rendimiento.