Saltar la navegación

Crear nuevas reglas

Vamos a ver en este punto cómo crear reglas para ser usadas con los modos single crack y wordlist. Son muchas las posibilidades que da JtR, por lo que se verá lo fundamental para adquirir una idea que nos permita avanzar por nosotros mismos. Se aconseja que posteriormente, se consulte la documentación para ampliar conocimientos.

La versión Jumbo de JtR posee más comandos que la versión libre. En esta documentación no se explican todos los comandos y algunos solo funcionarán con la versión Jumbo, aunque este aspecto no se aclara, por lo que algunos ejemplos no funcionarían con la versión libre.

Una regla ocupa una línea y tiene dos partes:

  1. Opcionalmente puede comenzar por una condición para rechazar el uso de la regla.
  2. Uno o más comandos simples que transforman la palabra original.

Todo lo anterior puede, opcionalmente, separarse por espacios.

Algunas de las condiciones que rechazan la aplicación de la regla son las siguientes:

-:   No rechaza la regla. Es lo que se asume por defecto.
-c Rechaza la regla a menos que el algoritmo de cifrado usado diferencie entre mayúsculas y minúsculas.   
-8 Rechaza la regla a menos que el algoritmo de cifrado usado trabaje con caracteres de 8 bits.

Algunos comandos simples son:

:     No hace nada con la palabra. Es la regla que se aplica cuando no se especifica la opción --rules en el modo wordlist. Hola > Hola   
u Convierte la palabra a mayúsculas. Hola > HOLA

En el siguiente ejemplo:

# cat lista.lst 
usuario
coche azul
root
# cat john.conf
.....
[List.Rules:Pruebas]
:
u
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
usuario
coche azul
root
USUARIO
COCHE AZUL
ROOT

aplicamos las reglas de la sección Pruebas sobre las palabras del fichero lista.lst. En primer lugar actúa la regla : dejando todas las palabras tal cual están, y posteriormente, la segunda regla, constituida por el comando u, pasa todas las palabras a mayúsculas.

Otros comandos simples son:

l    Convierte a minúsculas. Hola > hola
c Convierte el primer carácter a mayúscula y el resto a minúsculas. HOLA > Hola
C Convierte el primer carácter a minúscula y el resto a mayúsculas. hola > hOLA
t Convierte la mayúsculas a minúsculas y a la inversa. Hola > hOLA
TN    Invierte entre mayúscula y minúscula el carácter de la posición N. T2 > Hola > HoLa   
r Invierte el texto. Hola > aloH
d Duplica el texto. Hola > HolaHola
f Duplica el texto pero la segunda parte invertida. Hola > HolaaloH
{ Rota el texto a la izquierda. Hola > olaH
} Rota el texto a la derecha. Hola > aHol
$X Añade el carácter X al final del texto. $8 > Hola > Hola8
^X Añade el carácter X al inicio del texto. ^8 > Hola > 8Hola
# cat john.conf
.....
[List.Rules:Pruebas]
r $8 ^8
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
8oirausu8
8luza ehcoc8
8toor8

Hay algunos comandos que llevan asociado una posición de un carácter dentro del texto, por ejemplo el comando TN, donde N es la posición del carácter que se convertirá en mayúscula o minúscula según corresponda. Esta posición del texto, comienza siempre por 0 y existen una serie de caracteres que podemos utilizar:

0 - 9 Indican desde la posición 0 hasta la posición 9.
A - Z     Indican desde la posición 10 hasta la posición 35.
l Longitud del texto inicial o del texto en el momento de ejecutar el comando v.
m Posición del último carácter del texto inicial, o del texto guardado en memoria con el comando M.     
z Posición más allá del final del texto. Se utiliza para añadir al final del texto.
p Posición del último carácter encontrado con el comando / o %.
* max-length. Longitud máxima de la contraseña que es capaz de manipula el algoritmo de cifrado.
- max-length - 1
+ max-length + 1

Se pueden añadir cadenas con el comando AN"STR", donde N indica la posición a partir de la cual se insertará el texto STR. Este comando tiene en cuenta lo siguiente:

  • Para añadir al final del texto debe usarse la posición z.
  • El texto STR a insertar puede estar delimitado por cualquier carácter que no esté dentro de STR.
# cat john.conf
.....
[List.Rules:Pruebas]
A1"-" A3"-" A5"-" A7"-"
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
u-s-u-a-rio
c-o-c-h-e azul
r-o-o-t-

Cuando se hace referencia a un carácter, este puede escribirse también con su código ASCII en hexadecimal, utilizando para ello la siguiente sintaxis: \xhh. Esto nos va a permitir utilizar también los caracteres de control, es decir, los caracteres por debajo del 32. Por ejemplo, el siguiente ejemplo es equivalente al anterior:

# cat john.conf
.....
[List.Rules:Pruebas]
A1"\x2d" A3"\x2d" A5"\x2d" A7"\x2d"
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
u-s-u-a-rio
c-o-c-h-e azul
r-o-o-t-

Los siguientes comandos se utilizan para controlar la longitud de las palabras (texto):

<N     Rechaza el texto a menos que tenga una longitud menor que N.
>N Rechaza el texto a menos que tenga una longitud mayor que N.
_N Rechaza el texto a menos que tenga una longitud de N caracteres.    
'N Trunca el texto a N caracteres.
# cat john.conf
.....
[List.Rules:Pruebas]
_4 A1"-" A3"-" A5"-"
>4 A1"-" A3"-" A5"-" A7"-"
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
r-o-o-t
u-s-u-a-rio
c-o-c-h-e azul

Comandos relacionados con la gramática ingles:

p Añade un s minúscula al final del texto. Hola > Holas
P     Añade ed en minúscula al final del texto. Hola > Holaed    
I Añade ing en minúscula al final del texto. Hola < Holaing
# cat john.conf
.....
[List.Rules:Pruebas]
p
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
usuarios
coche azuls
roots

Comandos que inserta y borran un carácter:

[ Borra el primer carácter del texto. Hola > ola
] Borra el último carácter del texto. Hola > Hol
DN Borra el carácter que ocupa la posición N en el texto. D1 > Hola > Hla
xNM     Elimina todo el texto menos la subcadena que empieza en la posición N y tiene M caracteres de longitud. Es decir, extrae una subcadena de longitud M a partir de la posición N. x12 > Hola > ol   
iNX Inserta el carácter X en la posición N. i1- > Hola > H-ola
oNX Sustituye el carácter de la posición N por el carácter X. o1- > Hola > H-la

Los caracteres [ y ] tienen un significado especial para el preprocesador, por lo que si queremos que como comandos no den problemas, lo mejor es protegerlos con la contrabarra (backslash, \ ).

# cat john.conf
.....
[List.Rules:Pruebas]
\[ \]
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
suari
oche azu
oo

Los siguientes comandos convierten caracteres:

S   Invierte los caracteres con su correspondiente en la tecla que le corresponde. Hola9 > hOLA)
V Pasa las vocales a minúscula y las consonantes a mayúscula. HolA9 > HoLa9
R Desplaza cada carácter una posición a la derecha usando como referencia el teclado. Los caracteres que están en el extremo derecho del teclado no sufren cambios. Hola > Jp;s  
L Desplaza cada carácter una posición a la izquierda usando como referencia el teclado. Los caracteres que están en el extremo izquierdo del teclado no sufren cambios. Hola > Gika
# cat john.conf
.....
[List.Rules:Pruebas]
L
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
yayaeui
xixgw azyk
eiir

JtR trabaja con un buffer interno donde se puede guardar el texto con el que se está trabando. Para actuar sobre este buffer están los siguientes comandos:

M Guarda el texto tal como se encuentre en el momento de ejecutar este comando. Actualiza la posición m. Inicialmente, antes de aplicar una regla, siempre se ejecuta el comando M, es decir, por defecto, todas las reglas lleva el comando M al inicio, y por lo tanto, al inicio el buffer contiene el texto a transformar. Lo normal por parte del usuario es usar la M en medio de una regla después de haber hecho alguna transformación.
Q Rechaza el texto a menos que este sea distinto al contenido del buffer, es decir, si la transformación ha provocado cambios con respecto a lo que está guardado.
XNMI    Extrae, del buffer, la subcadena de M caracteres que comienza en la posición N, y la inserta en el texto en la posición I.
# cat john.conf
.....
[List.Rules:Pruebas]
l Q
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
#
# cat john.conf
.....
[List.Rules:Pruebas]
r X0zz
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
oirausuusuario
luza ehcoccoche azul
toorroot

JtR usa también variables numéricas que pueden ser empleadas para indicar posiciones, longitudes, etc., en los comandos que hemos visto. Los nombres de estas variables van desde la a hasta la k, y para asignarles valor hay que usar el comando vVNM, el cual actualiza en primer lugar l, y luego resta M a N dejando el resultado en la variable V.

# cat john.conf
.....
[List.Rules:Pruebas]
vil2 iix
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
usuarxio
coche azxul
roxot

Otro concepto que nos encontramos en JtR es el de clase de caracteres, que no es más que un conjunto de caracteres, y sobre estos pueden trabajar algunos comandos. Las clases de caracteres son las siguientes:

??       Coincide con la ?.
?v Conjunto de las vocales. "aeiouAEIOU"
?c Conjunto de las consonantes. "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"     
?w Coincide con espacios en blanco y tabulaciones.
?p Conjunto de los caracteres de puntuación: .,:;'?`!"
?s Conjunto formado por los siguientes símbolos: $%^&*()-_+=|\<>[]{}#@/~
?l Conjunto de todas las letras en minúscula. [a-z]
?u Conjunto de todas las letras en mayúscula. [A-Z]
?d Conjunto de los dígitos. [0-9]
?a Conjunto de las letras mayúsculas y minúsculas. [a-zA-Z]
?x Conjunto de las letras mayúsculas, minúsculas y los dígitos. [a-zA-Z0-9]
?o Conjunto de los caracteres de control de la tabla ASCII (códigos inferiores al 32).
?y Conjunto de los caracteres de código ASCII 32 o superior.
?z Todos los caracteres.

Para referirnos al conjunto complementario de alguno de los conjuntos anteriores, hay que nombrarlo con la letra en mayúscula, así por ejemplo, ?D es el conjunto de todos los caracteres menos los dígitos.

sXY      Reemplaza todos los caracteres X del texto por el carácter Y. saA > Campana > CAmpAnA
s?CY Reemplaza todos los caracteres de la clase C del texto por el carácter Y. s?v- > Hola > H-l-    
@X Elimina todos los caracteres X del texto. @a > Campana > Cmpn
@?C Elimina todos los caracteres del texto de la clase C. @?v > Hola > Hl
!X Rechaza el texto si contiene el carácter X.
!?C Rechaza el texto si contiene algún carácter de la clase C.
/X Rechaza el texto a menos que contenga el carácter X.
/?C Rechaza el texto a menos que contenga algún carácter de la clase C.
=NX Rechaza el texto a menos que el carácter de la posición N sea igual al carácter X.
=N?C Rechaza el texto a menos que el carácter de la posición N pertenezca a la clase C.
(X Rechaza el texto a menos que el primer carácter sea el carácter X.
(?C Rechaza el texto a menos que el primer carácter pertenezca a la clase C.
)X Rechaza el texto a menos que el último carácter coincida con el carácter X
)?C Rechaza el texto a menos que el último carácter pertenezca a la clase C.
%NX Rechaza el texto a menos que contenga N coincidencias del carácter X.
%N?C      Rechaza el texto a menos que contenga N coincidencias de caracteres de la clase C.

Por último vamos a ver los comandos del preprocesador, cuyo objetivo es generar varias reglas a partir una sola. Muchas veces las reglas son casi idénticas, y gracias al preprocesador pueden agruparse reglas similares en una única regla. Por ejemplo, si queremos añadir un dígito a cada una de las palabras del diccionario, tendríamos que escribir diez reglas muy parecidas, donde una añadiría el 1, otra el 2, etc. Es posible, en estos casos, crear una única regla y luego el preprocesador la transformará en diez reglas.

El preprocesador interpreta rangos de caracteres y referencias a los rangos. Un rango se define dentro de corchetes, por ejemplo, [aeiou], [0-9], [aeiou0-9], etc. El preprocesador creará una regla para cada uno de los caracteres del rango. Se pueden emplear más de un rango en la misma regla y se evalúan de derecha a izquierda, en cambio los elementos del rango se evalúan de izquierda a derecha. También, a veces queremos utilizar el carácter instanciado del rango en varias partes de la regla, y para ello podemos utilizar las siguientes expresiones: \1, \2, ... y \9, donde \1 se refiere al carácter instanciado del primer rango, el más a la izquierda, \2 al segundo, etc. \0 se refiere al carácter instanciado del rango inmediatamente anterior.

Veamos todo esto con un ejemplo. Supongamos que queremos flanquear las palabras del diccionario con un dígito, eso implicaría hacer diez reglas así:

^0 $0
^1 $1
...
^9 $9

Podemos simplificar esto usando el preprocesador con un rango y una referencia al valor concreto del rango:

# cat john.conf
.....
[List.Rules:Pruebas]
^[0-9] $\1
......
# john --wordlist=lista.lst --rules=Pruebas --stdout
0usuario0
0coche azul0
0root0
1usuario1
1coche azul1
1root1
...
9usuario9
9coche azul9
9root9

También hubiese valido:

^[0-9] $\0

Es importante tener en cuenta que la sintaxis del preprocesador permite que los rangos puedan ir dentro de la cadena del comando AN"STR".

A3"x[aeiou]y"