¡Google Summer of Code™ 2008 está (casi) preparado! Sí, el año pasado Google patrocinó a 900 estudiantes en más de 90 países, produciendo millones de líneas de código. Y este año ¡van a repetir! Por mi parte, si algún alumno de la Facultad de Informática de Donostia quiere animarse, estoy dispuesto a ayudarle (el año pasado no nos fue nada mal 😉 Así que si te interesa, vete preparando la documentación, porque a partir de Marzo, el SoC’08 comenzará a aceptar proyectos. No te olvides de leer el FAQ para más información. O de pasarte por el canal #gsoc en Freenode o de leer la lista de distribución. A Google le encantará contar contigo, nuevo colaborador del mundo OpenSource, y a mí me encantará ver cómo nuestros alumnos se interesan por el software libre (aunque sea a base de motivación vía Google 🙂
Huevo de pascua en Acrobat Reader 8.1.2
Pues sí, Acrobat Reader 8.1.2 para Linux tiene un huevo de pascua que permite ver la cara del equipo de desarrollo de esta aplicación (gran equipo, y por lo que parece, en India controlan de programación para Unix mucho…). Para obtener la foto que acompaña a este post: elige en la ayuda «About Acrobat Reader» y cuando te salga la pantalla (splash) teclea unixreaderrocks . ¡Curioso!
¿Tendrá Evince algún huevo de pascua? (hay desarrolladores que odian este tipo de añadidos «no productivos», y hay otros a los que les gusta…)
Google incluye (por fin :-) un resumen de DiarioLinux
Siempre he querido ver el resumen de DiarioLinux en los resultados de búsqueda de Google. Es decir, lo que marco en rojo en la imagen. No sé quién lo hace (si se hace a mano, o si Google tiene bots que lo hacen automáticamente), pero el caso es que las webs más conocidas lo tienen, y que DL no lo tuviera era una espinita que tenía clavada. Ahora ya estoy contento… Me voy a tomar un café con pastel de chocolate para celebrarlo 😉 (qué poca cosa hace falta para sentirse bien …)
Crear un pdf a partir de un fichero de texto
Fácil, pero lo dejo documentado aquí para que no se me olvide de nuevo…
Genero el fichero prueba.txt y lo convierto a PostScript con la utilidad enscript:
$ cat prueba.txt | enscript --no-header -o - > prueba.ps
Ahora, convierto el .ps a PDF con la utilidad ps2pdf:
$ ps2pdf prueba.ps
HackIt! Nivel 2: resumen criptográfico
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).