Ikasten.IO
Learning, Aprendiendo

HackIt! Nivel 2: resumen criptográfico 22 febrero, 2008

Seguimos con la prueba 2 del HackIt!, donde lo dejamos ayer. Algunos lectores me comentan que mejor no dé la solución directamente sino que vaya dando pistas progresivas. Me parece bien.

Lo primero que haremos, en este y otros niveles, será mirar el código fuente de la página en busca de…. bueno, !pistas! 🙂

La página del nivel 2 incluye una función Javascript llamada Login() que tiene el siguiente aspecto:


function Login() {
var user = document.login.username.value;
var pass = document.login.password.value;
if (user=="euskal" && hex_cypher(pass)=="c79cc1714419a4aaf3c4c53360843294") {
location.href = 'level3-' + pass + '.html';
} else {
alert("ACCESS DENIED!");
};
}

Es decir, está claro que el nombre de usuario es ‘euskal’, pero del password sólo sabemos que al pasarlo por una función llamada hex_cypher devuelve como resultado la cadena “c79cc1714419a4aaf3c4c53360843294”. Podemos hacer dos cosas, analizar la función hex_cypher(),
que según el código fuente de esa misma página :

< script type="text/javascript" src="cypher.js" > </script>

se encuentra en el fichero cypher.js o bien usar “pensamiento lateral” 🙂 La primera opción siempre es viable dado el código fuente, por ingeniería inversa, pero nos llevará mucho (MUCHO) tiempo. La segunda opción, es más interesante. Pensemos que estamos en la segunda fase, la solución por tanto no debe de ser muy difícil… el algoritmo usado debe de ser conocido, y el resultado de aplicar ese algoritmo a una cadena de texto devuelve otra cadena de 32 caracteres de longitud… no hay muchas funciones de uso común en seguridad informática con esas características… Dada esa pista, tal vez se os ocurra qué función implementa hex_cypher(). Cuando la conozcáis, habrá que pensar en cómo romperla, es decir, ¿es posible a partir de la cadena resultado (32 caracteres) obtener el passwordoriginal sabiendo la función que se aplicó? (o dicho de otra forma, si la función es f, existe la inversa de f?

UPDATE: bueno, pues ya tenemos respuestas al reto 🙂 Efectivamente, se trata de la función md5, que según la Wikipedia:

“En criptografía, MD5 (Message-Digest algorithm 5) es una función criptográfica de dispersión, ampliamente utilizada e insegura [1] [2] , que dado un texto, devuelve un valor hash de 128 bits (32 caracteres). MD5 es un estándar de Internet, documentado en el RFC 1321, y ha sido utilizado en una gran variedad de aplicaciones de seguridad, así como para comprobar la integridad de archivos. Un hash MD5 se expresa típicamente como una cadena de 32 números hexadecimales.”

Una función hash, o función de dispersión como MD5, NO TIENE INVERSA. Es decir existe f(x) pero no f-1 (x). Sin embargo, se puede atacar el problema por fuerza bruta… de hecho, existen en Internet diversas webs con enormes bases de datos precalculadas (“al password x, le corresponde el hash y”). Por ejemplo, plain-text.info, una web que añade además la posibilidad de unirse a una red distribuída de obtención de hash md5 (nuestro ordenador puede participar, generando miles y miles de hashes cada día y añadiéndolos a la enorme base de datos de esa web… por cierto, no sólo de md5, sino también lm o ntlm, algoritmos usados en el cifrado de claves en Windows.

Si pasamos el hash c79cc1714419a4aaf3c4c53360843294 por esa web, nos da la clave de acceso al siguiente nivel : 3m3d35.

Nota: existe un método más elaborado que permite conocer todas (hasta cierto tamaño de clave ) las posibles combinaciones de x (y sus hash) sin tener que guardar explícitamente cada una de ellas (estoy hablando de las Rainbow Tables).

  • Roi dice:

    La verdad es que no soy ningun experto… pero la cadena esta encriptada en md5 no??…por lo tanto…
    euskal
    c79cc1714419a4aaf3c4c53360843294=3m3d35
    y se obtiene el Nivel 3. No??
    Por lo menos a mi me da la Enhorabuena al entrar…

  • Googleando encontré como hacer la inversa de MD5 pero también es cierto que he encontrado muchos sitios donde dice que no se puede. Está claro que con este ejemplo he visto que se puede, pero donde lo he hecho es una página donde parece que es un diccionario de MD5, es decir, por lo que entiendo tiene almacenados muchos MD5 y te da la inversa. Luego sigo teniendo dudas. ¿Se puede calcular el inverso?

  • jong dice:

    En http://www.milw0rm.com/cracker/ tambien hay un cracker online que lo hace bastante rapido. Saludos 🙂

  • TakeDown dice:

    Si Roi, es asi. ese hash es el resultado de la codificación (o resumen) del string 3m3d35.

    Está demostrado que existen colisiones MD5 (algunos ya recomiendan usar SHA1), pero no es tan fácil encontrarlos.

    Buscar en san google md5 collision.

    Ejemplo: http://www.cits.rub.de/MD5Collisions/

  • foxcrack dice:

    Saludos

    Amigos es posible encryptar por MD5 una aplicacion hechar en Visual Fox Pro?. Hemos podido descompilar la aplicacion por ingenieria inversa pero las classes parecen encrytadas por MD5 de que manera o que herramienta me puede descompilar las librerias de una aplicacion compilada en VFP?

  • admin dice:

    foxcrack: md5 **NO** es un algoritmo para encriptar.

    md5 sirve para obtener resúmenes criptográficos:

    md5(un_texto_de_1_millón_caracteres) = 32 caracteres
    md5(un_texto_de_1_billón_caracteres) = 32 caracteres

    obviamente NO hay forma de obtener el texto original a partir del resumen criptográfico. Lo que sí se puede conseguir es una colisión. Por ejemplo, para el caso anterior, podría ser que existieran 2 textos tales que:

    md5(un_texto_de_1_millón_caracteres) = 32 caracteres = X
    md5(un_texto_de_16_caracteres) = 32 caracteres = X

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *