Hola en esta entrada quiero compartir con ustedes técnicas usadas en esteganografia para hacer mas difícil detectar o extraer archivos ocultos. En esta entrada intentare usar imagenes muy agradables a la vista
¿Ofuscación?
No literalmente, por que la ofuscación busca hacer algo mas dificil de entender sin alterar el contenido. Y aqui si se altera. En mi precario vocabulario no recordé ninguna palabra descriptiva a esto (si alguien la tiene favor de hacermelo saber)
Bueno ¿de que va la cosa?
Fácil, en algunos casos como ya mencione anteriormente nos podemos enfrentar a ciertos obstaculos extras que los creadores del reto pueden poner. Ejemplo claro es que algunos hacen uso de tecnicas de programacion para hacer “dificil” la extraccion. Ayer mientras divagaba mi mente por “equis persona y una HORROROSA razon” me puse a navegar tridimensionalmente por mis archivos, llegando a una vieja carpeta con retos que cree hace mucho y con los que practicaba mi penosa programacion en php. Dentro de ellos encontré archivos “deshechos” o mal formados, y me puse a la tarea de analizarlos y ver que “ocultaban”.
Asi que veamos.
Ejemplo 1
El primer archivo es enrevesado.hex el cual como vemos en la siguiente imagen parece decir algo como el clasico “àÿøÿFIFJ” ¿Les suena? A mi se me parece a la cabecera de un JPG, aunque algo enredado no?
Lo mejor sera analizarlo hexadecimalmente.
Yo rápidamente encontre un patron, cada 6 bytes lo pusieron al revés.
Dificil? Para nada, ya que identificamos como esta hay que reacomodar las cosas. Para ello hago uso del siguiente script en python.
#!/usr/bin/env pythonfile = open("enrevesado.hex","rb").read() #Leo el archivo binariofinal = open("taylor.jpg","wb") #Creo un archivo llamado taylor.jpg en modo escrituraordenar = ""for i in range(0,len(file),6): #Recorro cada 6 bytes#Ordeno los bytes, por posicion los acomodo asi (6,5,4,3,2 y 1 byte)ordenar += file[i+5:i+6]+file[i+4:i+5] +file[i+3:i+4]+file[i+2:i+3]+ file[i+1:i+2]+file[i:i+1]#Los escribo en taylor.jpgfinal.write(ordenar)final.close()
Lo guardo como ordenar.py y lo ejecuto y me genera el archivo reconstruido con el nombre taylor.jpg
Y nos genera esta linda imagen de taylor.jpg
Ejemplo 2:
Nuestro siguiente ejemplo es apartir del archivo quesera.hex pareciera ser otro archivo sin sentido, sin embargo como en el ejemplo anterior se logra visualizar algo empero es algo raro.
Al abrirlo hexadecimalmente y analizarlo por algunos segundos, caeremos en cuenta de que se trata. Vemos algo como “PPNNGG” mas adelante “IIHHDDRR” lo cual me suena a “PNG” y el chunk “IHDR” cabecera del PNG. Empero la cuestion aqui es por que lo vemos repetido?
- Una teoria es que hay dos PNG.
- La segunda teoria es que es uno solo y repitieron cada byte delante de el mismo.
Sin embargo si seguimos analizando y llegamos al pie de formato, vemos que ya no se cumplo la teoria 2, puesto que vemos ahora adelante de cada byte, bytes nulos y no el repetido como suponiamos. Por lo que nos queda la teoria uno “Son dos imagenes PNG” y podemos complementar la teoria con que “Una imagen es mas chica que la otra y se relleno con byte nulos”.
Bueno aun todo sigue siendo una teoria, lo que haremos ahora ya que sabemos que sucede es recolecar cada dos bytes, empezando desde la posición 0(0,2,4,6,8…) y después la posición 1(1,3,5,7,9…)
Para ello haremos tambien un pequeño script, esta vez en PHP para demostrar la variedad.
#Abro el archivo a analizar$file=file_get_contents('quesera.hex');#Creo dos archivos de salida$salida1= fopen("SalidaSexy1.png","w");$salida2= fopen("SalidaSexy2.png","w");#Variables temporales$tmp1="";$tmp2="";#Recorro de principio a fin quesera.hex cada 2 bytesfor ($i=0;$i<=strlen($file);$i+=2) { #Guardo en la variable tmp1 cada segundo byte $tmp2.=$file[$i]; #Guardo en la variable tmp2 cada primer byte [($i-1)==(2-1)==1] $tmp1.=$file[$i-1]; } #Guardo el resultado en sus respectivos archivos fputs($salida1,$tmp1); fclose($salida1); fputs($salida2,$tmp2); fclose($salida2); ?>
Ejecutamos nuestro script y nos creara las imagenes PNG de salida. Veamos:
Imagen SalidaSexy1.png una imagen de gOOgle
Imagen SalidaSexy2.png una imagen de una “Love Fan de linux/ubuntu”
LISTO
Ahora a practicar un rato. A continuación les dejo 2 ejercicios para practicar
Reto1:
¿Hermosa silueta?
Reto2:
¿Una ducha?
- A cada imagen cuando encuentren lo que deben, deje un tipico “Pass:” para que sepan cuando termina el reto
- Cada imagen tiene una imagen mayor o igual de agradable a la vista
- El reto 1 (Silueta), es fácil, solo un poco de análisis y una trampa que puse por ahí
- El reto 2 (Shower/Baño), es un poco mas complejo, pero si lo resuelven vale la pena (tambien el reto 1 vale mucho la pena)
Habiendo ya demostrado algunos casos, quiero decir una cosa mas. Las imagenes usadas aqui, a mas de uno les es agradable visualmente, y aunque ustedes no lo crean, son BUENISIMAS imagenes para ocultar algo ¿Por que?
- Por el contexto de la imagen sirven principalmente como DISTRACCION
- Lo que alguien menos va a hacer es ponerse a analizar si tiene algo
Asi que este tipo de imagenes sirve por si solas para ocultar, sin necesidad de hacer mucho.
P.D. Estas imagenes son tipicas de “Razones para usar linux” ¿Buenas razones no? yo uso linux
P.D.2. Ya habiendo aprendido esto, recomiendo darse una vuelta por EL RETO 7 de NUESTRA PRIMER SERIE DE RETOS y veran lo facil que es
Sin mas, aparte de lo que pueda parecer este post, espero les sirva y se queden con la parte academica, y no solo con los wallpapers jeje.
Atte. hecky
hecky@neobits.org