lunes, 4 de octubre de 2010

RSMangler Vs John The Ripper

Sin duda alguna, uno de los factores fundamentales en el éxito de un ataque de diccionario contra un hash u otro tipo de cifrado, es la calidad de dicho diccionario.

La semana pasaba publicábamos un post explicando el uso de CeWL para crear diccionarios de palabras específicas del "argot" de una empresa, pero al mismo tiempo nos dábamos cuenta de la necesidad de crear variaciones a partir de cada palabra para enriquecer nuestro diccionario.

Para ello, vamos a partir de una de las palabras que obtuvimos de ese crawling, "Keteke", y vamos a emplear dos conocidas herramientas: RSMangler y John the Ripper.

RSMangler

RSMangler es una herramienta que descubrimos hace poco pero que tiene muy buena pinta. Si miramos el --help podemos observar como incluye una gran variedad de posibles mutaciones.
Un detalle curioso es que para DESACTIVAR los tipos de mutación hay que incluir la opción en la línea de comando, y no al contrario.

Veamos que tipo de mutaciones soporta:
  • Permutaciones (--perms): Combinación entre las diferentes palabras del diccionario. Generará muchíiiisimas combinaciones si le pasamos una lista como la salida de CeWL. Esta opción es solo para un conjunto muy pequeño de palabras:
jose
selvi joseselvi selvijose
  • Duplicado (--double): Duplica cada una de las palabras. Usado a veces por los usuarios si su palabra no llega al mínimo de caracteres exigidos:
jose
josejose
  • Reversa (--reverse): Le da la vuelta a la palabra. Esta no es a priori una opción muy escogida por sus usuarios debido a la dificultad para teclear una palabra del revés:
jose
esoj
  • Estilo Hax0r (--leet): Cambiar vocales por números. Una forma muy utilizada por muchos administradores:
jose
j0s3
  • Primera Mayúscula (--capital): Pone la primera letra mayúscula.
  • Mayúsculas (--upper): Pone todo a mayúsculas.
  • Minúsculas (--lower): Pone todo a minúsculas.
  • Invertir Mayúsculas (--swap): Las mayúsculas se convierten en minúsculas y viceversa. Tampoco es una formula muy usada por los usuarios, en general.
  • Participio (--ed): Añade sufijo -ed al final, para formar el participio en inglés. Si nuestro diccionario es Español, no tiene sentido.
  • Gerundios (--ing): Añade sufigo -ing al final, para formar el gerundio en inglés. Si nuestro diccionario es Español, no tiene sentido.
  • Signos de Puntuación (--punctuation): Añade algunos signos de puntuación al final de la palabra. La lista de signos no es la más acertada:
Jose
Jose!
Jose@
JoseÂ
Jose£
...
  • Años (--years): Añade un año delante y detrás. Puede ser útil, pero de nuevo la elección de los años no es la más acertada:
Jose
1990Jose
Jose1990
1991Jose
Jose1991
...
  • Acrónimos (--acronym): Combina las palabras para crear acrónimos. Tiene los mismos problemas que las permutaciones:
Jose
Selvi
JS
  • Passwords Comunes (--common): Interesante opción para añadir sufijos conocidos:
Jose
pwJose
pwdJose
adminJose
sysJose
Josepw
Josepwd
Joseadmin
Josesys
...
  • Dos cifras al final (--pna): Añade dos cifras al final, aunque se queda en 09:
Jose
Jose01
...
Jose09
  • Dos cifras al inicio (--pnb): Igual que el anterior, pero al inicio.
  • Números al final (--na): Añade un número al final, aunque se queda en 123:
Jose
Jose1
Jose2
...
Jose123
  • Números al principio (--nb): Igual que el anterior, pero al inicio.

Sabiendo que hay combinaciones que en general no nos van a interesar, podemos tomar la opción de cambiar el código de la herramienta para que no tener que poner todos los --loquesea para desactivarlos. Siguiendo la recomendaciones anteriores, vamos a la linea 89 del script rsmangle.rb y editamos las siguientes lineas que establecen el valor por defecto de cada opción a las siguientes:

verbose=false
leet=true
perms=false
double=true
reverse=false
capital=true
upper=true
lower=true
swap=false
ed=false
ing=false
punctuation=true
years=true
acronym=false
common=true
pna=true
pnb=true
na=true
nb=true
force=false
file_handle = nil

También os animo a que hagáis otras modificaciones sobre la herramienta, por ejemplo cambiar los signos de puntuación utilizados (linea 262):

for i in ("!@$%^&*.,".scan(/./))

Una vez hecho esto, solo tenemos que lanzar la herramienta sobre nuestro diccionario original, para obtener un diccionario enriquecido:

# wc -l test.txt
4 test.txt

# ./rsmangler.rb --file test.txt > wordlist.txt

# wc -l wordlist.txt
1312 wordlist.txt

Como podemos ver, el factor de crecimiento del diccionario es considerablemente alto, así que si nuestro diccionario origen es ya de por si grande habrá que tener mucho cuidado en seleccionar que palabras nos interesa mutar, que tipos de mutación, etc.


John the Ripper

John the Ripper es un clásico en esto de las mutaciones. Dispone de un lenguaje de reglas, llamadas rules, mediante el cual se puede definir con una gran flexibilidad que tipo de mutaciones queremos realizar, configurándose en el fichero john.conf.

Esta aproximación, sin duda, es mucho más flexible que utilizar RSMangle, pero por contra, definir estas reglas no resulta algo trivial. No entramos a saco a como se definen las reglas para JTR porque esto requeriría un post en si mismo.


Conclusiones

John the Ripper nos proporciona una flexibilidad que no nos permite RSMangle sin modificar su código (aunque haciendo modificaciones leves podemos obtener resultados satisfactorios), pero por contra exige una dedicación mucho mayor para configurar las reglas, mientras que RSMangle viene con un buen conjunto de posibles mutaciones que pueden ser suficiente en la mayoría de los casos.

Nuestra recomendación... ten ambas a mano :)

8 comentarios :

Ruben dijo...

Muy buen post, seria interesante uno sobre john the ripper

Saludos!!!

Jose Selvi dijo...

Gracias @Ruben, la idea era hacerlo, pero cuando vi lo largo que resultaba un post sobre RSMangler, a pesar de ser mucho más sencillo que John the Ripper... pensé que quizá JTR se merecía una serie de 2 o 3 posts para él solo.

De momento tenemos ya un par de posts preparados para las próximas semanas, pero me lo apunto como sugerencia para hablar sobre él.

Gracias por tu comentario!

Jimmy dijo...

amigo, te la rifaste!, es un muy buen aporte, gracias por compartirlo =D
Saludos desde México =D

Felipe Molina (@felmoltor) dijo...

Sé que es un poco antigua la entrada del blog pero os dejo una pequeña mejora en el módulo de conversión Leet:

http://pastebin.com/rEdBA0p3

En la versión normal convierte todas las letras del tirón a números. Con esta versión realiza todas las posibles conversiones leet a las letras que contiene la palabra original.

Es decir, si tienes la palabra "pepe", rsmangler en su versión original la transformará a "p3p3".
Con esta versión se generarán las palabras "p3pe", "pep3" y "p3p3".

Espero que os sea útil :-)

Jose Selvi dijo...

@ Felipe: Muchas gracias por tu aportación, me parece muy muy interesante :)

¿Es tuya la modificación? Si es así te animo a que contactes con Robin a ver si le interesa incorporarlo a la funcionalidad por defecto.

Felipe Molina (@felmoltor) dijo...

Si. Es mía la modificación.

Realmente me parecía muy estrecho de miras que sustituyera todos los caracteres del tirón.

Cualquiera que haga un test de intrusión imagina que no todos los usuarios juankers cambiarán tooodas sus letras por números ¿no?

Me pondré en contacto con él a ver que le parece mi aportación :-)

Jose Selvi dijo...

@Felipe: Tiene la contrapartida de que el diccionario crecerá bastante en número de palabras.

Yo lo que haría sería mantener la opción --leet y añadir alguna opción --full-leet o algo así, que implementara tu funcionalidad, así el Pentester es capaz de decidir si quieres un diccionario más grande y exhaustivo, o no.

Felipe Molina (@felmoltor) dijo...

Dicho y hecho.

He aquí el flag "--full-leet" "-T" para evitar que se genere el diccionario completo con todas las posiblidades:

http://pastebin.com/apwDjNsY