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:

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:

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:

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