viernes, 28 de mayo de 2010

Preview: Pentesting con TMap

TMap (En versión alpha) se trata de una aplicación de pentesting web cuyo principal objetivo es la localización de ficheros de backup y directorios abiertos.

Su funcionamiento es muy simple, lee de un fichero una lista de direcciones web, y de ellas genera una base de datos con las siguientes características:

· Realiza un análisis de cada uno de los directorios que aparezcan en el mapa web, sobre los cuales posteriormente realizará peticiones en búsqueda de directorios abiertos.

Si lee una dirección como la siguiente, ‘http://servidor/contenido/descargas/documentos/archivo.doc’, se realizarán peticiones sobre /contenido/, /contenido/descargas/ y /contenido/descargas/documentos/.

· Busca copias de seguridad comprimidas por cada directorio.

Si lee una dirección como la siguiente, ‘http://servidor/contenido/descargas/documentos/archivo.doc’, se realizarán peticiones sobre /contenido.[zip,rar,tar,tar.gz,gz], /contenido/descargas.[zip,rar,tar,tar.gz,gz], /contenido/descargas/documentos.[zip,rar,tar,tar.gz,gz].

· Realiza mutaciones en los nombres de los archivos, en búsqueda de versiones antiguas.

Las mutaciones realizadas son las siguientes:

o nombre { 1, 2, 3, _1, _2, _3 } . extensión

o nombre . extensión . { old, bak, 1, 2, 3, txt }

o nombre . { old, bak, 1, 2, 3, txt }

Para la generación del archivo de URLs es posible realizarlo mediante la utilización de BurpSuite. Para ello, utilizando BurpSuite como proxy debemos navegar a la web, intentando generar el mayor tráfico posible, puesto que cuantas más URLs obtengamos, mayor será el análisis a realizar por TMap, aunque si somos vagos siempre podemos utilizar la funcionalidad de ‘Spider’:

clip_image001

Una vez tengamos suficiente tráfico generado, podemos copiar la lista de URLs a nuestro portapapeles haciendo clic en ‘copy URLs in this host’.

clip_image002

Este contenido lo volcaremos en un archivo, y se lo pasaremos a TMap para que lo analice J

clip_image003

Al arrancar el programa se realizará un análisis previo del numero de directorios, ficheros, y ficheros ‘mutex’ (Es así como he llamado a los ficheros modificados):

clip_image005

Si tratamos de realizar una búsqueda de directorios abiertos, los resultados positivos se nos mostrarán por pantalla.

clip_image007

Comprobemos que TMap no miente…

clip_image009

En cuanto a la búsqueda de ficheros de backups, se puede realizar un filtrado por códigos de error.

clip_image011

También siento deciros que este artículo se trata de una preview, de momento se trata de una versión alpha privada y no está disponible. Trataré de terminar la aplicación a una versión medianamente aceptable y la publicaré aquí.

¡Un saludo!

viernes, 21 de mayo de 2010

Rompiendo algoritmos XOR. Caso real

Días atrás encontré una web la cual pedía autenticación para acceder a una zona privada (Creo que el software de cifrado se llama 8vsb). Lo curioso de esto es que la autenticación no era enviada por formularios a ninguna parte.

Dicha página contenía la zona privada dentro de sí misma, pero este contenido estaba encriptado, y únicamente podía ser visualizado si se introducía la password.

En la siguiente imagen se ve la página encriptada:

clip_image002[4]

Si continuamos analizando el código JavaScript, veremos unas líneas en donde se realizan varias comprobaciones previas al algoritmo de descrifrado, para verificar que todo es correcto.

He marcado de amarillo las líneas que hay que eliminar, y de azul las líneas que hay que añadir para ‘engañar’ al sistema de comprobación.

clip_image004[4]

Seguimos traceando el codigo JavaScript, y vemos que la operación de des/cifrado consiste en una operación XOR (c=c^44^password[índice]), como se ve en la siguiente captura:

clip_image006[4]

El funcionamiento de un algoritmo XOR es muy simple,

Un algoritmo XOR es tremendamente débil en los casos en los que se conoce parte del contenido cifrado.

Su funcionamiento es muy simple, se realiza una operación XOR byte a byte del contenido a encriptar con el byte correspondiente del password.

La operación lógica XOR vale 0 cuando los dos operandos son iguales (0:0 o 1:1), y vale 1 cuando los dos operandos son diferentes (1:0 o 0:1).

clip_image007[4]

Por lo tanto, si lo aplicamos alreves (Al byte encriptado le aplicamos el password), obtendremos el byte original, ya que se trata de un algoritmo reversible.

clip_image008[4]

Por lo tanto, si supiéramos el contenido de los primeros bytes del contenido cifrado de dicha página, sería muy simple obtener los primeros bytes del password.

Dado que lo más probable es que el contenido cifrado de la página sea contenido HTML, es de suponer que el contenido cifrado empiece por ‘<html>’ (6 bytes).

Si esta suposición fuese correcta, únicamente deberíamos realizar 256 operaciones para la obtención de cada byte del password, lo cual, mediante un ataque de fuerza bruta sería algo trivial. Si tenemos en cuenta que se trata de un password, habría que reducir las 256 posibilidades al mapa de caracteres imprimibles, quedando éste mucho mas reducido.

Para la obtención del primer byte del password sería un algoritmo similar a este:

Charset = “abcdefghijklmnñopqrstuvwxyz0123456789.:,-|@#€¬€¿?”;

For (int i = 0; i < charset.length ; i++)

{

if (cifrado[0] ^ charset[i]) == “<”

Message(“El primer byte del password es “ + charset[i]);

}

Para la obtención del Segundo byte del password, se debería realizar la comprobación con ‘h’ en vez de ‘<’, ya que ‘h’ es el segundo byte de ‘<html>’.

¡Dejémonos de teoría!, vamos a ver si esto realmente funciona.

He modificado el código Javascript, introduciendo unas líneas antes de la operación XOR, la cual nos mostrará en pantalla partes del contenido descenriptado con el password que nosotros introduzcamos.

clip_image009[4]

En este punto, no sabemos el password que debemos introducir, sin embargo suponemos que el contenido del primer byte será ‘<’, por lo que introduciremos por ‘fuerza bruta manual’ distintos valores.

En la siguiente imagen, introduje el carácter ‘A’ , y el primer byte descrifrado que nos devolvió fue ‘o’. Por lo tanto… La password no empieza por ‘A’.

clip_image010[4]

Ahora, introduciremos ‘2’ como password, y vemos que nos devuelve ‘<’ como primer byte. Todo coincide, puede que sea el inicio de ‘<html>’

clip_image011[4]

clip_image012[4]

Solo hay que seguir realizando los mismos pasos, byte a byte hasta conseguir el password.

clip_image014[4]

¡Hasta otra!