reversinglabs summer challenge

La web de reversinglabs publicó un pequeño reto la semana pasado, que dado un archivo .zip había que encontrar la clave.

Era jueves por la noche cuando lo vi. Estaba cenando y me dije, vamos a intentarlo. El reto terminaba el domingo y la solución la harían pública el lunes.O sea, tenía un par de ratos el fin de semana.

Ya hacía mucho tiempo que no participaba en ningún reto de este tipo. Además regalaban una camiseta a aquellos que lo consiguieran. A por la camiseta.

Lo primero obviamente que hice fue descargarme el archivo. Después de descomprimirlo, lo que tenías era otro archivo llamado r.zip. Si descomprimías éste, te aparecía otra vez lo mismo. Bueno, esa era la primera prueba.

De lo primero que me di cuenta fue que el tamaño del archivo original era mayor que el que salía de éste.

El original tenía un tamaño de 30514 bytes y el otro de 440 bytes. Debería ser al contrario ¿no?

Vamos a echar un vistazo al zip con un editor hexadecimal.

Los primeros 440 bytes, es decir el tamaño del fichero que nos sale después de descomprimir, son iguales y justo detrás vemos unos caracteres sospechosos 7z. mmmm, un archivo 7zip.

Grabamos desde esa posición hasta el final y creamos un fichero nuevo. Yo lo llamé p.7z. Vamos a descomprimir a ver que pasa. Cool! Nos aparece un fichero llamado puzzle.cab.

 cabextract -l puzzle.cab
puzzle.cab: WARNING; possible 250 extra bytes at end of file.
Viewing cabinet: puzzle.cab
File size | Date       Time     | Name
-----------+---------------------+-------------
29596 | 14.07.2010 00:54:28 | ReversingLabs.png

All done, no errors.

Un par de cosas aquí. El cab contiene un PNG, pero además nos avisa que dicho fichero tiene 250 bytes extra.

Bueno extraemos el cab y efectivamente nos suelta un PNG. Pero, ¿Qué son esos 250 bytes?

A ver que nos dice strings:

strings puzzle.cab

MSCF
ReversingLabs.png
sUmFyIRoHAM6Zc4AADQAAAAAAAAA8MSAOyRZcWCVhcEFcUfpP4JdbtU2derwgjSYp+BpxVYkWJPDt
Q/TITifo4qO7qyYz+yLpd9+6nkwwxmomWHbHK0Bt6UPHOwL/pEKm6IGXo/5dioeP66Fq5brTldgi
Z7do5bbFjykQIsx6PMCBre4iUJ7jcwrwD2MDs69XwuuHL+fMKy9hDUJQPDEgDskWXFjp6jPWFXoW
VSNb4H1zjQpW[
$,\K
DZFn
u [JWuipwusd
...

Ese trozo de letras ahí, tiene pinta de ser algo codificado en Base64.

Bueno lo dejamos ahí y vamos a echar un vistazo a la imagen. Suena a que hay más esteganografía de por medio. Vamos a analizar dicha imagen.

Vemos un trozo de datos, desconocido y cuyo nombre huele a ¿password?

El contenido del mismo (538B327278BBAB654747288999FBCDA1) tiene pinta de una ¿hash MD5? Después de haber mandado dicho hash a varias web con Rainbow Tables online, perece que nadie encuentra dicho hash. Pues parece que no es un hash, no creo que los del reto te pongan ahí un hash para que no busquemos por fuerza bruta, nadie conseguiría el reto a tiempo.

En esta situación me encontraba el viernes por la noche. Un poco cansado me fui a dormir. Después de todo tengo el sábado. Pues no, el sábado por la mañana, mientras desayunaba, encendí el portátil y vi en la web de reversinglabs que ya habían cerrado el reto. What the heck! A tomar por saco la camiseta.Me dije, bueno le echo un rato más y si me da mucha tela, esperamos al lunes a ver la solución. Lo primero que hice fue ver si esos datos que vimos ocultos en el cab estaban o no en Base64. Creé un fichero de texto nuevo llamado chunk.txt y copié los datos.

base64 -d chunk.txt > salida
base64: invalid input

Pues parece que no. O a lo mejor, hay algún carácter que me sobra. Vamos a probar sin el último ([). Lo mismo.

El domingo por la noche publicaron la solución oficial. Iba bien encaminado y mis suposiciones eran las correctas. Además del último carácter, me sobraba el primero, quedando los datos así:

UmFyIRoHAM6Zc4AADQAAAAAAAAA8MSAOyRZcWCVhcEFcUfpP4JdbtU2derwgjSYp+ BpxVYkWJPDtQ/TITifo4qO7qyYz+yLpd9+6nkwwxmomWHbHK0Bt6UPHOwLpEKm6IG Xo5dioeP66Fq5brTldgiZ7do5bbFjykQIsx6PMCBre4iUJ7jcwrwD2MDs69XwuuHL+fMKy9h DUJQPDEgDskWXFjp6jPWFXoWVSNb4H1zjQpW
Ahora cuando decodifico el mi chunk.txt, éste funciona perfectamente y me genera un fichero llamado salida.
file salida
salida: RAR archive data, v20,
¡Un fichero rar!
unrar e salida

UNRAR 3.90 beta 2 freeware      Copyright (c) 1993-2009 Alexander Roshal

Enter password (will not be echoed) for salida:

¿Un password? Vamos a probar con el password que sacamos del PNG, ese que creíamos que era un hash. ¡Bingo!

Este nos suelta un fichero llamado file, cuyo contenido es:

Password is: 9ec4c12949a4f31474f299058ce2b22a

Pues parece que esa es la clave que buscaban.

Nota: el password del rar debe ir en minúsculas.

Al final me quedé sin la camiseta, pero me entretuve el fin de semana.