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!

1 comentario:

  1. Muy buen post!!! Eres un genio.

    Ah, y gracias por responder en el lado del mal.

    ResponderEliminar