Solución al reto esteganografía de 79137913

domingo, 26 de junio de 2016



Hace ya casi tres años que @79137913 publicó en underc0de.org este reto sobre esteganografía. Un wargame realmente entretenido y largo como el diablo. Así que antes de seguir leyendo si aún no has intentado solucionarlo, ¿qué esperas?


¿Qué necesitaremos?

  • Editor hexadecimal (en mi caso uso GHex)
  • Python 2.*
  • Java
  • Compilador C (solo si usas Linux para resolver el reto)
  • El archivo del reto que podemos descargar acá  
 Así es, necesitaremos Python y Java porque en algunos niveles nos va a hacer falta algo de programación para poder continuar. También es necesario aclarar que el reto estaba pensado para usuarios de Windows por lo que en algunos niveles los usuarios de Linux vamos a tener que realizar un par de pasos más.

Lo que aquí propongo es mi solución al reto basada en mis conocimientos (no soy un experto en el tema) así que lo más probable es que en algunos pasos use métodos que aunque me funcionaron podrían no ser los más eficaces.

Una vez aclarada la nota anterior... ¡Manos a la obra!

Primer nivel: Misterio.bmp

El archivo que nos deja numeritos 79137913 es un .rar (el primero de muchos) que dentro tiene la imagen Misterio.bmp similar a la que encabeza esta entrada. Si la abrimos con nuestro visor de imágenes favorito, notamos que la imagen tiene el siguiente texto:

Esta imagen guarda muchos secretos!!!!!!

Como el reto trata de esteganografía y básicamente la imagen nos está diciendo que hay más de lo que podemos ver, busquemos datos al final del archivo. Para ello abrimos la imagen con el editor hexadecimal y nos desplazamos hasta el final.

Misterio.bmp
Misterio.bmp

La técnica de esconder información (incluso otros ficheros) al final de un archivo se conoce como esteganografía por EOF (End Of File) Leer más

Al final del archivo no encontramos un mensaje diciendonos qué hacer (como en muchos otros retos). La buena noticia es que esto no significa que no halla nada más dentro de la imagen. Como ya nos lo contó la nota anterior, aparte de colocar información en forma de texto al final de los archivos, también se pueden colocar más archivos.

¿Pero entonces, cómo sabemos si hay un archivo dentro de otro? Bueno, la solución es simple, vamos a usar las cabeceras. Todos los archivos las tienen y es la forma en que los distintos programas saben como procesar cada archivo. Acá tenemos una lista con algunas cabeceras (en hexadecimal) y el tipo de archivo al que corresponden.

Una vez sabiendo esto búsquemos archivos comprimidos dentro de la imagen (buscamos por comprimidos ya que éstos nos permiten guardar varios archivos como si fueran uno solo). Así que usamos de nuevo nuestro editor hexadecimal, pero esta vez de una forma un poco más inteligente: vamos a buscar las cabeceras de los tipos de comprimidos más comunes.

Misterio.bmp
Misterio.bmp
Usando la lista de cabeceras y la opción buscar del editor hexadecimal podemos notar que efectivamente hay un rar dentro de la imagen (o su cabecera por lo menos).

¿Pero ahora, cómo sacamos el rar de ahí? Bueno, como ya explicamos anterior mente, las cabeceras son lo que delimitan y dan estructura a un archivo. Hay programas que explotan esta capacidad, por ejemplo, los lectores de rar, zip comienzan a leer los archivos apartir de donde encuentran una cabecera de inicio y hasta una cabecera de final por lo que no importa si hay basura antes o después de cada cabecera, el software no tendrá problemas en leer el archivo.

Así que tenemos dos opciones:
  • La primera, cambiar la extensión del archivo a .rar para que el sistema operativo abra el archivo con el lector de rar.
  • La segunda, programar un pequeño script que saque toda la información a partir de la cabecera del rar.
Vamos a programar un pequeño script en Python2 que usa expresiones regulares para extraer el rar (también agregaremos la opción para extraer un zip que nos será útil unos niveles más adelante).

#!/usr/bin/python2
# -*- coding: utf-8 -*-
 
 
import os
import re
import sys
 
rar_ = re.compile(".*?(52617221.*).*?", re.DOTALL | re.IGNORECASE)
zip_ = re.compile(".*?(504B0304.*).*?", re.DOTALL | re.IGNORECASE)
es_rar = None

def abrir_archivo(ruta):
    global es_rar
    print "Comprobando archivo:", ruta
    if ruta.lower().endswith(".rar"):
        print "Es un rar"
        es_rar = True
        
    with open(ruta, "rb") as archivo:
        data = archivo.read()
        data  = data.encode("hex")
    comprobar_rar(data, ruta)
 
 
def comprobar_rar(data, nombre):
    if rar_.match(data):
        if not es_rar:
            nombre += "in.rar"
            print "\t[+] Hay un rar dentro"
            print "\t[+] Guardando en:", nombre
            with open(nombre, "wb") as archivo:
                archivo.write(rar_.findall(data)[0].decode("hex"))  
    else:
        print "no rar"
    if  zip_.match(data):
        nombre += "in.zip"
        print "\t[+] Hay un zip dentro"
        print "\t[+] guardando en:", nombre
        with open(nombre, "wb") as archivo:
            archivo.write(zip_.findall(data)[0].decode("hex"))
    else:
        print "No zip"
    
 
def comprobar_ruta(ruta):
    if os.path.isfile(ruta):
        abrir_archivo(ruta)

 
if len(sys.argv) > 1:
    comprobar_ruta(sys.argv[1])
else:
    print "Uso: inRar.py <archivo>"

Sin importar cual de las dos opciones usemos, debemos llegar a un archivo comprimido que cuando lo intentamos abrir nos pide una contraseña. 79137913 no nos piensa hacer las cosas tan fáciles, pero si intentamos con secretos palabra sospechosamente subrayada en el mensaje de la imagen el rar precisamente nos revela sus secretos (Turum tsss).

Segundo nivel: La Verdad.rar

Ahora tenemos tres archivos: La Verdad.rar, Carta del César.txt e Historia.txt
Por supuesto, La Verdad.rar tiene contraseña y los otros dos archivos dicen:

DRRS0NRR = DRRSRRNRR , D0SRRNRR = DRRSRRNRR , DRRSRRN0 = DRRSRRNRR , DRRS80N0 = DRRSRRNRR , D0S80NRR = DRRSRRNRR , D80S0NRR = DRRSRRNRR , D0SRRN80 = DRRSRRNRR

Julio Cesar le dio una carta a su mensajero diciendole solo una palabra "Februarius" y el destinatario, hasta el momento solo el que hizo este reto y el Cesar saben lo que dice la carta.

Historia.txt nos dice que sólo el César y 79137913 saben lo que la carta dice, lo que nos lleva a pensar que tal vez la información está cifrada usando el método césar.

"El cifrado césar es un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3, la A sería sustituida por la D (situada 3 lugares a la derecha de la A)" Leer más

Ya solo nos falta saber cuál es el desplazamiento. Y ahí es donde entra la segunda pista: "Februarius" que según la Wikipedia es el mes número doce en el calendario juliano. Ahora solo queda descifrar el mensaje, podemos usar alguna de las tantas online o programar la nuestra.

Acá un pequeño ejemplo de como quedaría una función en Python que implementa el cifrado césar. Para usarla sólo necesitamos cambiar "mensaje" por el contenido de la carta (manteniendo las comillas) y ejecutar el script.

import string

letras = string.ascii_lowercase
total = len(letras)


def cesar(mensaje, salto):
    descifrado = ""
    for x in mensaje:  # Recorremos el mensaje
        if x not in  letras:  # Si el caracter no es una letra
            descifrado += x   # lo dejamos como esta y continuamos
            continue          # con el bucle
        else:
            # Obtenemos la posicion de la letra en la lista
            index = letras.find(x)
            # A la posicion del caracter aumentamos el salto
            # y sacamos el moulo para que si la suma se pasa de
            # la longitud de la lista comience desde cero y no
            # lance un error
            index = (index + salto) % total 
            descifrado += letras[index]
    print descifrado
 
print cesar("mensaje", -12) 

Teniendo en cuenta que como el mensaje está cifrado y lo queremos descifrar el desplazamiento es hacía la izquierda (por eso el -12 cuando llamamos a la función cesar en nuestro código) si usamos una aplicación online hay que tener en cuenta que si sólo nos permite desplazarnos hacía la derecha el desplazamiento ahora no sería 12 sino 26-12=14 (26 son la cantidad de letras en el alfabeto sin contar la ñ)

RFFG0BFF = RFFGFFBFF , R0GFFBFF = RFFGFFBFF , RFFGFFB0 = RFFGFFBFF , RFFG80B0 = RFFGFFBFF , R0G80BFF = RFFGFFBFF , R80G0BFF = RFFGFFBFF , R0GFFB80 = RFFGFFBFF

Qué según 79137913 en el post original del reto esto nos indica equivalencias entre colores RGB:

RFFG0BFF = RGB(FF, 00, FF) = RGB(255, 000, 255)

Como lo único que tiene sentido es modificar los colores en Misterio.bmp según nuestra carta descifrada, eso es lo que haremos. ¿Pero cómo? Que no cunda el pánico, para eso tenemos a nuestro amigo Java. Así es, vamos a programar una aplicación que lea una imagen píxel a píxel y modifique su color si es necesario.

import java.io.File;
import java.awt.Color;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class Imagen {
    private BufferedImage imagen;
    private File abierta;
    
    
    public boolean abrir(String ruta) {
        abierta = new File(ruta);
        if (abierta.isFile()) {
            try {
                imagen = ImageIO.read(abierta);
                return true;
            } catch (Exception e) {
                System.err.println("Error: " + e);
                System.exit(1);
            }
        } 
        return false;
    }
    
    
    public void leer() {
        Color reemplazo = new Color(255, 255, 255);
        Color reemplazar[] = {new Color(255, 0, 255),
            new Color(0, 255, 255),
            new Color(255, 255, 0),
            new Color(255, 128, 0),
            new Color(0, 128, 255),
            new Color(128, 0, 255),
            new Color(0, 255, 128),
        };
        for (int x = 0; x < imagen.getWidth(); x++) {
            for(int y = 0; y < imagen.getHeight(); y++) {
                
                int pixel = imagen.getRGB(x, y);
                
                for (Color actual : reemplazar) {
                    if (pixel == actual.getRGB()) {
                        imagen.setRGB(x, y, reemplazo.getRGB());
                        System.out.println("Reemplazando: " + actual);
                    }
                }
            }
        }
        
    }
    
    public void noWhite() {
        for (int x = 0; x < imagen.getWidth(); x++) {
            for(int y = 0; y < imagen.getHeight(); y++) {
                int pixel = imagen.getRGB(x, y);
                
                if (pixel != new Color(255, 255, 255).getRGB()) {
                    imagen.setRGB(x, y, new Color(0, 0, 0).getRGB());
                }
            }
        }
    }
    
    public void guardar() {
        String rutaGuardar = String.format("%s%s%s", abierta.getParent(),
                File.separator, "reemplazada.bmp");
        try {
            ImageIO.write(imagen, "bmp", new File(rutaGuardar));
            System.out.println("guardado en: " + rutaGuardar);
        } catch (Exception e) {
            System.err.println("Error: " + e);
            System.exit(1);
        }
    }
}

El método abrir() abre la imagen si existe.
El método leer() lee la imagen píxel a píxel buscando una coincidencia con los colores que encontramos en la carta descifrada, si encuentra la coincidencia modifica el color a RGB(255, 255, 255) (blanco).
El método noWhite() también lee la imagen píxel a píxel pero esta vez convierte a negro todos los píxeles que no sean blancos (así podemos ver mejor el mensaje oculto).
El método guardar() guarda la imagen con las modificaciones.

public class Abrir {
    public static void main(String[] args) {
        Imagen imagen = new Imagen();
        boolean abierta;
        
        if (args.length == 1) {
            abierta = imagen.abrir(args[0]);
            if (abierta) {
                imagen.leer();
                imagen.noWhite();
                imagen.guardar();
                System.out.println("elblogdeonce.blogspot.com\n");
            }
        } else {
            System.out.println("Uso: estego.jar ");
        }
    }
}

Esta clase simplemente implementa a la clase Imagen Descargar estego.jar

$ java -jar estego.jar Misterio.bmp

Luego de pasar la imagen Misterio.bmp por estego.jar tenemos una nueva imagen:

Código
Código

COD:58325461

Y así es como obtenemos el código (58325461) para La Verdad.rar. Donde encontramos un archivo que pone:

Estas buscando mal!
yo que vos busco un .zip

¿¡ENSERIO NUMERITOS!? tanto trabajo solo para que me digas que estoy equivocado...

Bueno, después de respirar profundo y maldecir repetidas veces a numeritos continuemos. Acá es donde nos será útil el primer script en Python (inrar.py), para extraer el zip de La Verdad.rar


Salida inrar.py
Salida inrar.py

Ahora tenemos un nuevo archivo: La Verdad.rarin.zip cuya contraseña es la que obtuvimos anteriormente de la imagen. Bueno, parece que todo el trabajo anterior no fue en vano.

Tercer nivel: El Lugar.rar

Dentro de  LA Verdad.rar tenemos otros tres archivos más para continuar: El Lugar.rar con contraseña como era de esperarse, Keygen.vbe por la extensión parece un script de windows (VBS) y No avances más!.text

Estas buscando algo que no quieres saber!

(Muchas líneas en blanco despues...)

Avanza bajo tu propia responsabilidad:
el ultimo de los 300 fibonaccis te abrira la siguiente puerta.

En este paso separamos caminos los usuarios de Windows y los de Linux.

Si usas Windows debería ser suficiente con ejecutar el script, y en el inputbox que aparece ingresar como código el número 300 de la sucesión Fibonacci y se debería mostrar la contraseña. Si esto no funciona o eres usuario de Linux, conseguir la contraseña nos va a tomar un par de pasos más.

En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales:
1, 1, 2, 3, 5, 8, 13, ...
La sucesión comienza con los números 0 y 1 y a partir de estos, «cada término es la suma de los dos anteriores» Leer más

Si abrimos el script con el editor hexadecimal lo primero que notamos es que parece que el script está ofuscado.

Keygen.vbe
Keygen.vbe

Luego de una pequeña búsqueda en google encontramos que efectivamente el script está ofuscado, al parecer por la herramienta screnc.exe. Luego de otra extensa búsqueda por los rincones de Google encontramos una herramienta para deosfuscar el script que no funciona solo en Windows, gracias MrBrownstone Acá podemos ver el código en C.

Lo que vamos a hacer es tomar el código y compilarlo para poder desofuscar el script, para ello vamos a pegar el código en un archivo con extención .c decode.c y luego compilamos, para ello en una terminal colocamos:

$ gcc decode.c -o decode

Si todo sale bien, se debe generar el archivo decode. Ahora procedemos a darle permisos de ejecución y ejecutamos de forma que el archivo desofuscado quede en desofuscado.txt.

$ chmod +x decode

$ ./decode Keygen.vbe desofuscado.txt

Si abrimos desofuscado.txt y organizamos un poco todo ese desastre llegamos a lo siguiente:

mSgboX"Numero de serie no encontrado, debera ingresarlo manualmente"
x=iNputBox("Ingrese codigo de autenticacion")
if X="222232244629420445529739893461909967206666939096499764990979600"then
 msgbox"Codigo de activacion Valido, contraseña (sin comillas) : ""Esto fue un robo"""
ElsE
 raNdomiZe timEr
 msgbOx Int(RNd()*99999)
end if

De donde podemos deducir que la contraseña es: Esto fue un robo

Cuarto nivel: Interior.rar

Ahora tenemos, de nuevo, otros tres archivos: Interior.rar, Exterior.jpg y Avances de nuestro equipo.text

Hay que encontrar la direccion para ingresar al interior del banco ahi se guarda lo que buscamos!

La imagen Exterior.jpg nos muestra lo que parece ser la fachada de un banko, el Falcon Private Bank. En este caso, la pista es muy directa, necesitamos la diracción del banco. Con solo poner el nombre del banco en Google tenemos la dirección completa y el teléfono:

Falcon Private Bank
Falcon Private Bank

Luego de jugar un poco con la dirección, encontramos que la contraseña correcta es: Pelikanstrasse 37

Quinto nivel: Caja de seguridad.rar

Una vez dentro del banco, nos encontramos con otros tres archivos: Caja de seguridad.rar, Avances.txt, Caja fuerte.jpg.

Ya estamos dentro del banco, nadie sabe que nos infiltramos, estuvimos recopilando informacion acerca de la combinacion de la caja fuerte, sabemos que la combinacion es de 6 numeros de uno o dos digitos cada una, sabemos que el gerente del banco siempre lee los manuales de las cajas fuertes, pero aun no conseguimos entrar.
Sabemos que la combinacion se ingresa de la siguiente forma:
##-##-##-##-##-##
Y si los numeros son de un solo digito se los antepone con un 0.

Gracias a esta pista tenemos una idea de lo que tenemos que buscar: seis números de uno o dos dígitos. Si miramos la imagen Caja fuerte.jpg atentamente, notamos que en la puerta de la caja están indicadas las especificaciones:

Caja fuerte.jpg
Caja fuerte.jpg

Donde aparecen los números: 22, 1, 2, 22, 11, 4. ¡Seis números! Si los llevamos al formato que nos indica la pista tenemos: 22-01-02-22-11-04 que resulta ser la contraseña.

Sexto nivel: Maquina.rar

Ahora que estamos dentro de la caja fuerte nos encontramos con dos archivos:
Maquina.rar, Dentro de la caja.text

Estamos dentro!

Buscamos una caja de seguridad de un Argentino, se llama Franco Antón Gallo.

Para que la maquina de la caja fuerte te traiga la caja de seguridad de la persona hay que ingresarle el numero de Documento Nacional de Identidad de su pais natal creemos que vive en algun pais del Mercosur.

Eso es lo que sabemos por ahora.

Para solucionar esta parte vamos a hacer uso de la página buscardatos.com
que luego de llenar el formulario nos da el CUIT, luego de jugar un poco con los números, encontramos que la contraseña es: 36834443

Séptimo nivel: Viaje.rar

Llegados a este punto nos encontramos con otros siete archivos: dos comprimidos Herramienta.rar y Viaje.rar, dos imágenes: pasaporte.jpg y carnet.jpg. Tres archivos de texto: ACERTIJO.TEXT, Avances.txt y DOCUMENTO CIFRADO.TXT

Quien sera un soldado tan poco animoso y fuerte,
que viene con lanza armado,
y si al contrario ha pasado
el mismo se da muerte.

Encontramos 2 fotos iguales en la caja, un documento cifrado y un anotador con contraseña.

Le pedimos a un experto que vea las fotos y nos envio un software que hara todo por nosotros segun el...

Pero es tan exentrico que nos dejo un acertijo para abrirlo.

Jb pqys ggfxp gws l nfblkf, hpllc bsj qccff flfg pkufpqfg zdk gsmws aywo ccywcyw rtljfz bj ocejbegso, fqffp kn ddczrzlnaz djrppnqz cqodiff, wy hzltj scy qo qchvl bj blanatcshz bj sw.

La solución para el acertijo es: abeja. Cuando descomprimimos Herramienta.rar nos damos cuenta que es un ejecutable de Windows, así que de nuevo, acá separamos caminos los usuarios de Windows y de Linux.

Cuando le pregunté a 79137913 qué era lo que el software hacía esto fue lo que respondió:

tenes que superponer las 2 imagenes y borrar los pixels que sean iguales.
 
tolerance = 3 //(o cualquier numero para que pruebes)
For each pixel in picture1{
 if differencebetween(pixel,otherpicturesamepixel) < tolerance {
  pixel = rgb(255,0,0)
 }else{
  pixel = rgb(0,0,255)
 }
}

Ejemplo differencebetween
print differencebetween(RGB(0,0,0),RGB(1,2,3))
// print: 6
print differencebetween(RGB(0,0,0),RGB(1,0,0))
// print: 1
print differencebetween(RGB(100,100,100),RGB(99,100,101))
// print: 2
print differencebetween(RGB(0,0,0),RGB(0,0,0))
// print: 0

Analizando la función differencebetween nos damos cuenta que lo que hace es sumar las diferencias componente a componente de cada pixel de la imagen. teniendo esto claro, vamos a programar un par de métodos más para nuestra clase Imagen.java que usamos en el segundo nivel:

    public int getRGB(int x, int y) {
        return imagen.getRGB(x, y);
    }
    
    public int[] getDimensiones() {
        int[] dim = {imagen.getWidth(), imagen.getHeight()};
        return dim;
    }
    
    public int diferencia(int p1, int p2) {
        Color c1 = new Color(p1);
        Color c2 = new Color(p2);
        int suma = 0;
        suma += Math.abs(c1.getRed() - c2.getRed());
        suma += Math.abs(c1.getBlue() - c2.getBlue());
        suma += Math.abs(c1.getGreen() - c2.getGreen());
        return suma;
    }
    
    public void superponer(Imagen segunda, int tolerancia) {
        int x = imagen.getWidth();
        int y = imagen.getHeight();
        
        int[] dimensiones = segunda.getDimensiones();
        
        int dx = dimensiones[0];
        int dy = dimensiones[1];
        
        Color blanco = new Color(255, 255, 255);
        Color negro = new Color(0, 0, 0);
        
        if (x == dx && y == dy) {
            for (int w = 0; w < x; w++) {
                for (int h = 0; h < y; h++) {
                    
                    if (diferencia(imagen.getRGB(w, h), segunda.getRGB(w, h)) < tolerancia) {
                        imagen.setRGB(w, h, blanco.getRGB());
                    } else {
                        imagen.setRGB(w, h, negro.getRGB());
                    }
                }
            }
        } else {
            System.err.println("Las imagenes deben tener las mismas dimensiones");
            System.exit(1);
        }
    }

El método getRGB() devuelve el color del píxel en las corrdenadas señaladas.
El método getDimensiones() devuelve un array con las dimensiones de la imagen.
El método diferencia() calcula la diferencia componente a componente entre dos colores RGB
El método superponer() recorre las dos imágenes, llama al método diferencia() para calcular la diferencia entre los píxeles de las dos imágenes y si la diferencia es menor a la tolerancia setea ese pixel en blanco de lo contrario lo hace a negro.

import java.util.Scanner;

public class Abrir {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        boolean estaAbierto1;
        boolean estaAbierto2;
        Imagen imagen1 = new Imagen();
        Imagen imagen2 = new Imagen();
        
        
        if (args.length == 3) {
            String ruta1 = args[0];
            String ruta2 = args[1];
            int tolerancia = Integer.parseInt(args[2]);

            estaAbierto1 = imagen1.abrir(ruta1);
            estaAbierto2 = imagen2.abrir(ruta2);
            if (estaAbierto1 && estaAbierto2) {
                imagen1.superponer(imagen2, tolerancia);
                imagen1.guardar();
                System.out.print("elblogdeonce.blogspot.com\n");
            }
        } else {
            System.out.println("Uso: estego.jar   ");
        }
        
    }
}

Esta clase simplemente implementa a la clase Imagen.java Descargar super.jar

Corremos super.jar y jugando con el valor de la tolerancia notamos que en seis es donde se ven más claras las cosas:

$ java -jar super.jar pasaporte.jpg carnet.jpg 6

Lo que nos arroja la imagen reemplazada.bmp:

reemplazada.bmp
reemplazada.bmp

En la que parecen haber cuatro letras: FOLY

MMM... ahora solo nos quedan las cuatro letras y un mensaje cifrado, lo que nos lleva a pensar en, bueno, blanco es y frito se come. Sí, así es, ¡cifrado por sustitución!

En criptografía, el cifrado por sustitución es un método de cifrado por el que unidades de texto plano son sustituidas con texto cifrado siguiendo un sistema regular; las "unidades" pueden ser una sola letra (el caso más común), pares de letras, tríos de letras, mezclas de lo anterior, entre otros. El receptor descifra el texto realizando la sustitución inversa. Leer más

Luego de, la verdad, hacer un poco de fuerza bruta a algunos de los métodos de cifrado que aparecen en la Wikipedia y otros que no, damos con el adecuado: el cifrado vigènere y gracias a ésta web podemos descifrar el mensaje:

en este viaje ire a panama, tengo que crear unas empresas off shore para retirar dinero de argentina, usare mi pseudonimo federico elaskar, la clave era la fecha de nacimiento de el.

De nuevo, usando la web buscardatos.com encontramos la fecha de nacimiento de Federico Elaskar: 6 de junio de 1984 y de nuevo, jugando un poco con los números, encontramos que la contraseña es: 06061984

Octavo nivel: Aeropuerto.rar

En este nivel nos encontramos con cuatro archivos: Aeropuerto.rar, Llegamos a panama.text, OFICINAS SGI GRUPO FINANCIERO.vbe (Otro script para Windows) y Tarjeta de rossi.jpg.

Casi llegamos al fondo de este robo, o eso es lo que parece...

Preguntando a mucha gente llegamos a la conclusion que el unico que nos puede dar respuestas sobre Franco. A. Gallo es Fabian Rossi, el encargado de la empresa sgi financiera que creemos que hace sus empresas offshore.

El problema es que rossi nunca nos atiende, segun nuestros investigadores, el proximo 23 de julio va a estar en la oficina en algun horario de la mañana.

En lo que tenes que hacer incapie es cual es el paradero actual de Franco.

Eso es todo lo que te podemos decir.

Esta pista básicamente nos dice que tenemos que encontrar el lugar donde se encuentra Franco y que Rossi es quien nos puede dar tal información.

Tarjeta de rossi.jpg a primera vista no nos da información, así que centremos nuestra atención en OFICINAS SGI GRUPO FINANCIERO.vbe que por comodidad renombraremos a script.vbe.

Lo primero que notamos es que este script también está ofuscado, así que ya sabemos que hacer:

$ ./decode script.vbe desofuscado.txt

Luego de organizar un poco ese desastre y descartar esos infinitos condicionales anidados nos quedamos con lo interesante:

(...)
MsgBox"[Luego de una hora hablando]."
MsgBox"Si, por supuesto, el telefono que esta usando Elaskar es el +54 (2902) 532615",,"Rossi"
MsgBOx"Claro, se fue alla!, esta esquiando.",,"Rossi"
MSgBox"Fue un placer!",,"Rossi"
(...)

Acá Rossi nos da dos datos importantes, el primero, un número de teléfono y el segundo, que Elaskar está esquiando.

Del número telefónico podemos sacar información interesante, por ejemplo el +54 nos dice que el teléfono es de Argentina y el 2902 (código de área) nos dice (gracias a cybo.com):

Código de área
Código de área 2902 Argentina

Ahora hemos reducido las posibles locaciones de Elaskar a unas nueve ciudades Argentinas, en este punto podríamos aplicar fuerza bruta para ver si alguno de los nombres de las ciudades es la contraseña o podríamos ser un poco más delicados y usar el segundo dato que nos proporciona Rossi: Elaskar está esquiando.

Luego de una pequeña búsqueda en Google encontramos las estaciones de esquí en Argentina y notamos que hay un par en la Provincia de Santa Cruz, provincia que también aparece en la lista de los prefijos, así que podemos deducir que Elaskar está en Santa Cruz y hemos reducido la lista a las dos ciudades que comparten el código de área 2902.

Luego de intentar un rato (en mi caso más de lo que me hubiese gustado), encontramos que la contraseña es: Calafate

Noveno y décimo nivel: Aeropuerto.rar, Habitacion.rar

En este nivel doble nos encontramos con cinco archivos: dos comprimidos con contraseña: Aeropuerto.rar y Habitacion.rar. Un script de Windows: Esperar al informante.vbe, una imagen: Lugar.jpg y la pista: Novedades.txt

Llegamos a Calafate, nuestro informante nos dijo que Elaskar se esta escondiendo en el hotel Alto Calafate, estamos en la puerta esperando que llegue el informante, el nos dijo que debiamos esperarlo 2 minutos reloj y nos diria en que habitacion se encontraba Elaskar.

Lugar.jpg parece ser una imagen del hotel donde según la pista se está quedando Elaskar y a primera vista no nos brinda mucha información, así que centramos nuestra atención en el script que como ya se está haciendo costumbre está ofuscado. Desofuscamos el script y lo hacemos un poco más legible:

WScript.sleep 120000
MsgbOx"El sujeto esta en la habitacion que es el numero que corresponde a la solucion de este problema:"&cHr(10)&chr(13)&"En el patio de un Instituto hay 70 chicos alineados en 7 filas y 10 columnas. Cada uno da la mano a todos los que están a su alrededor por ejemplo, el que está situado en una esquina daría la mano a tres compañeros ṡCuántos saludos hubo en total?"

Para solucionar este problema, imaginemos a las personas alineadas, algo así:

Arreglo de personas
Arreglo de personas en el patio

Para hallar la cantidad de total de saludos imaginamos que estos son como líneas que unen a los asteriscos de la imagen anterior. Podemos tener tanto líneas verticales y horizontales como diagonales en dos direcciones.

Líneas diagonales (una dirección): 1 + 2 + 3 + 4 + 5 + 6 + 6 + 6 + 6 + 5 + 4 + 3 + 2 + 1 = 54
Líneas diagonales totales: 54 * 2 = 108
Lineas verticales: 9 * 7 = 63
Líneas horizontales: 6 * 10 = 60
Líneas totales: 108 + 63 + 60 = 231

Por lo tanto, tenemos que el número de habitación es: 231

Dentro de la habitación:

Una vez dentro de la habitación nos encontramos tres archivos: Encontramos.txt, Habitacion de elaskar.gif y FOTO_CARNET.jpg

Una foto carnet de una persona que no sabemos quien es, y todo parece que fue extraida de una cedula de identidad, este podria ser la nueva identidad de Franco Gallo, averigua a ver que podemos averiguar... Aun no sabemos a donde se fue Franco, apenas te enteres de su paradero, ve al aeropuerto e intenta encontrarlo.

Primero averigüemos quien es el sujeto de FOTO_CARNET.jpg

Para ello hacemos uso de la herramienta Google Imágenes

Google Imágenes
Google Imágenes

Esta interesante aplicación no solo nos permite buscar imágenes como tradicionalmente lo hacemos en cualquier buscador, sino que también nos permite subir o indicar la url de una imagen y Google buscará imágenes similares.

Hacemos click en el ícono de la cámara que aparece a la izquierda del botón de búsqueda y luego en "Subir una imagen" seleccionamos la imagen (FOTO_CARNET.jpg) et voilà

Resultado Google Imágenes
Resultado Google Imágenes

Ya sabemos quién es el sujeto de la imagen: Lázaro Báez Argentino pero esto no nos da información acerca del paradero de Franco.

Ahora solo nos queda analizar Habitacion de elaskar.gif que a primera vista luce como la imagen de una habitación normal con el televisor encendido donde pone algo, una especie de mensaje que no es muy claro porque cambia.

Para analizarlo mejor, destripemos el gif y la web bloggif.com nos proporciona la herramienta adecuada.

Frame1.gif
Frame1.gif

Frame2.gif
Frame2.gif

Donde se puede leer:

Presidenta inaugurará importante aeronáutica financiada por SGI financiera en Ushuaia

Ya tenemos un lugar: Ushuaia para saber si Franco está ahí, vamos al aeropuerto...

Último nivel: Felicitaciones.rar

en éste, el último nivel nos encontramos, de nuevo, tres archivos: Felicitaciones.rar, INFORMES AEROPUERTO.vbe y Estamos en ushuaia.txt

Genial, llegamos, nos dijeron que una persona fisicamente como Franco ha salido en un avion, tenemos que averiguar como se presento y en que avion se fue, creemos que es un avion que tiene que ver con Elaskar y SGI Financiera... Hay que averiguar a donde fue ese avion el dia 4 de enero de 2013, si conseguimos la patente del avion podremos encontrar donde estuvo, segun un informante, hay una pagina que sube las fotos de los aviones y los sitios donde estuvieron... dijo algo de la "esquina de la aviacion"...

Primero intentemos encontrar la tal página, si buscamos en Google "esquina de la aviación" no encontramos nada que sea de ayuda, así que intentemos por otra parte. Si buscamos en Google "localizar avión por" él mismo nos guía hasta: "localizar avión por matricula" donde el primer resultado es:

Google - localizar avión por matrícula
Google - Localizar avión por matrícula

Acabamos de encontrar al rincón de la aviación: aviationcorner.net

Ahora solo nos falta encontrar la matrícula del avión. La única opción que tenemos es revisar el archivo INFORMES AEROPUERTO.vbe que como ya sabemos tenemos que desofuscar y luego llevar a un formato un poco más legible.

$ ./decode "INFORMES AEROPUERTO.vbe" desofuscado.txt

Para acceder a los datos del avión este script nos pide un nombre y apellido que resulta ser los datos del sujeto de la imagen de los dos niveles anteriores. Así que esa búsqueda no era una perdedera de tiempo como parecía.

If y="LAZARO"Then
y=iNpuTBox("Encontre a un pasajero con ese nombre, para salvaguardar su privacidad digame el apellido en MAYUSCULAS","Empleado de Informes"):
If y="BAEZ"tHen
MsgBOx"Si, Lazaro Baez se fue en el avion con matricula LIMA VICTOR - ZULU SIERRA ZULU",,"Empleado de Informes"
ElSe
MsgBox"No puedo encontrar a ningun tripulante con ese nombre, lo siento",,"Empleado de Informes"
End if

Nos dicen la matrícula usando el alfabeto radiofónico, por lo que tras la "traducción" quedaría: LV-ZSZ. Vamos, que no tiene gran misterio.

El alfabeto radiofónico es un lenguaje de desambiguación alfabética utilizado internacionalmente en radiocomunicaciónes de transmisión de voz en la marina y la aviación, tanto por los servicios civiles como militares. Fue establecido por la Organización de Aviación Civil Internacional (OACI, ICAO en inglés), agencia de la ONU creada en 1944. También es conocido como Interco y como alfabeto fonético OACI. Leer más.

Ahora, ¡a encontrar ese avión! Para ello vamos a usar otra poderosa herramienta de Google, los operadores que nos permiten realizar búsquedas un poco más refinadas. En este caso usaremos el operador site: para buscar los resultados en solo una página. aviationcorner.net para nuestro caso:

Búsqueda avanzada con Google
Búsqueda avanzada con Google

aviationcorner.net - avión LV-ZSZ
aviationcorner.net - avión LV-ZSZ

Ahora sabemos que el cuatro de enero de 2013 el avión con matrícula LV-ZSZ estuvo en San Fernando.

Felicitaciones.txt

Haz terminado la primera parte del desafio Publica en el tema del reto tu nick cifrado con esta web http://www.vantir.com/Encriptar.aspx
Parametros:
Algoritmo: RC2
Key: OSA123456789
IV : 987654321OSA
Texto: [tunick]

Proximamente hare un nuevo reto, espero tenerte en el...

Y llegamos al último archivo del reto solo para enterarnos que todo esto fue solo la primer parte.

Saludos!
Once.

No hay comentarios:

Publicar un comentario