Merry Xmas
My master and I want to wish you a merry christmas ;)

Soluciones Geek Puzzle II: reto 0×07
Llegamos con este a lo que será el último post por mi parte explicando cómo solucionar los retos de Geek Puzzle II, ya que el resto de retos que no comento pertenecen a alguno de mis otros compañeros del Geek Puzzle Team. Falta por comentar el cómo solucionar el primer reto de Geek Puzzle II, que fue diseñado por Víctor Arambulo, nuestro ganador de la anterior edición del concurso.
Y sin más historias, pasamos a ver en qué consistía este último reto de la 2ª edición, al que bauticé con el título de “Barcode Privacy“.
En el enunciado del reto se referencia a una imagen JPEG. El nombre del fichero (128B.jpg) tiene su importancia, ya que cuando visualizamos la imagen vemos que es un código de barras, y que precisamente 128B es uno de los muchos tipos de códigos de barras que existen, así que mediante esta pista se nos está indicando qué tipo de código de barras es, de tal forma que el siguiente paso lógico es decodificar el código de barras para ver qué información podemos obtener de aquí.
La decodificación del código de barras puede llevarse a cabo de muchas formas. Podemos decodificarlo a mano, lo cual no es nada dificil dada la sencillez del código, podemos usar algún software en nuestra PDA con cámara para directamente decodificarlo desde la pantalla, podemos utilizar algún software de decodificación de códigos como zebra - no confundir con este otro zebra ;) – o incluso podemos decodificarlo online.
De una forma u otra, al final se obtendrá la cadena de texto que está codificada en el código de barras. Esta cadena de texto es: 0af28acb958b5eed09d6376c3bfbe3
Con este dato, a priori, parece que no avanzamos en exceso. Quizás sea buena idea seguir analizando la imagen por si hay algo más de información escondida, no únicamente el código de barras que se ve a simple vista.
Efectivamente, si se analizan los metadatos de la cabecera de la imagen, nos encontramos con una cabecera EXIF que nos proporciona un par de datos interesantes:
- Hay un campo de comentario o descripción que contiene la siguiente frase: Usa el valor correcto de “Fi” y podrás desvelar la información oculta
- Hay etiquetas de geolocalización GPS, con las coordenadas 64 2 2.69 para la latitud y 12 28 27.06 para la longitud. Se puede utilizar cualquier herramienta de conversión, para pasar de grados/minutos/segundos a coordenadas decimales, de tal forma que se obtienen latitud 64.03408 y longitud 12.474183. Introducciendo estas coordenadas en Google Maps, nos posicionamos en un lago noruego, de nombre Fjellskjaekra. Interesante, nos quedaremos con este nombre para más adelante ;)
Además, el JPEG cuenta con un thumbnail que es diferente a la imagen mostrada, en concreto, al extrae el thumbnail vemos que la imagen contiene dos definiciones matemáticas:
- La definción de la sucesión de Fibonacci
- La defincion del número áureo Fi en relación con Fibonacci.
Interesante… hay que recordar que en el campo de comentario de la cabecera EXIF del JPEG había una frase a modo de pista que indicaba que el valor correcto de Fi desvelará la información oculta.
Siempre que tenemos una imagen y sospechamos que hay “información oculta” ;) hay que pensar en esteganografía. Tenemos varias piezas de información interesantes: una cadena de texto alfanumérica, el dato que nos indica que el valor correcto de Fi nos desvelará información oculta, las coordenadas que nos posicionan en un lago noruego de nombre bastante exótico… ahora bien, todo esto parece que no nos conduce a nada.
Quizás sea interesante ver si hay algo más de información en la imagen… pensemos en esteganografia… probemos con algún programa como stegdetect o steghide… ¡Bingo! el steghide parece que quiere extraer algo de la imagen, aunque solicita un password. Quizás haya que proporcionar “el valor correcto de Fi” y así poder desvelar la información oculta en la imagen ;) tiene sentido… ahora bien, ¿cuál es el valor correcto de Fi? El número áureo, Fi, tiene un valor de 1.6180339887… probando digito a digito, es decir, 1.6, 1.61, 1.618, 1.6180, 1.61803 llegamos a poder extraer la información. Obteniendo un fichero ZIP.
Al intentar descomprimir el ZIP, de nuevo nos encontramos con que está protegido por password… rebuscando en nuestro “inventario” ;) nos encontramos con ese nombre tan curioso de lago noruego… y efectivametne es el password para descomprimir el ZIP.
La descompresión del ZIP nos proporciona un shell script.
##!/bin/bash
URL="http://www.techclot.es/geekpuzzle/geekpuzzle0205-barcode_privacy/"
if [ -z "$1" -o `echo -e "$1\c" | wc -c` -ne 30 ]; then
echo "Si no me das el parametro correcto no hacemos nada... :("
exit 1
fi
/usr/bin/wget -q ${URL}${1}.asc
PASS=`echo -e "$UID\c" | /usr/bin/md5sum | awk '{print $1}'`
/usr/bin/openssl rsautl -decrypt -inkey ${1}.asc -in leeme.enc -passin pass:$PASS
Este script hace lo siguiente:
- Se descarga un fichero, tomando como nombre el fichero el parámetro que indiquemos.
- Obtiene el hash MD5 del UID del usuario, y eso lo usará posteriormente como password.
- Intenta descifrar el contenido de un fichero leeme.enc, que aparentemente está cifrado con RSA, usando el fichero descargado como clave privada, la cual también se encuentra cifrada con DES, y el password para descifrar la clave privada y asi poder descifrar el mensaje es el password generado previamente con el hash MD5 del UID.
Pasando como parámetro al script la cadena alfanumérica que obtuvimos al princpio del reto, al decodificar el código de barras, obtenemos el fichero de la clave privada.
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,0B23E941CCC7D128
jy9H1GjHBOy6G32oAi0lGg4eGfR7Suwp0g+BuBXVicflI4PYfmlBExwQjLPno0kb
YyOdBadRPvrXn9iUhScEILZVLuYRUPLwFQSgAgsJQGbh1X1pIpyeisLwv0hRUxyr
RxGs3Lh+bHBb51EHTSDoNx6re8w7WfPgyfjroIkiF8bt/TFy5c/XPI0RD/LqVFzQ
1QKQAyqxSqxObLtcUJ09H0I6VZqM5DFgGAaCzsHgLckNBXA7IbpIIbogF+4VeECF
qhRL+0vRPWAkpZazMrCpdumUUp0KeNByF8AAqROKCRFMQoHqFhFDoOJELw/kgtjI
9bfoMZJHf4CZ9R4g3gzXpd0/WY/MHygi9ncgWJD/vnCNAM8eE/AD+JAfvu3xS3+P
RvrCy8ZeTbIhcHMu6roDlsyxTnvBqOBTn3T51HIEr+g=
—–END RSA PRIVATE KEY—–
El descifrado del fichero leeme.enc fallará, ya que o somos muy afortunados, o la clave generada a partir del MD5 de nuestro UID no coincidirá con la clave verdadera… la forma más directa será ir probando UID por UID, desde 0 hasta el máximo UID, que la verdad puede llegar a ser bastante ya que estamos hablando de 2^32 o incluso 2^64 posibilidades, pero en la práctica el máximo UID se queda restringido a 32767 o 65535 posibilidades.
Haciendo un bucle de 0 a 65535 y probando uno por uno, conseguimos descifrar sin problemas el fichero usando la clave privada cuando se llega al UID 23942 lo cual genera la clave b44d430b7454e3e7eae0636defd68abb
El proceso de resolución del reto finaliza aquí, una vez hemos obtenido la clave: M4yTheF0rceBeW1thY0u