miércoles, 26 de enero de 2011

Montando un sistema de descargas oculto ( 2 ): cifrando y pensando a lo grande

[ Montando un sistema de descargas oculto ( 1 ): las bases ]

Seguimos avanzando, está claro que aunque los datos se ocultan dentro de una imágen, si tiras de esteganografía para esto, dejar los datos simplement así es casi como que vayan en *****, si alguien busca datos ocultos en una imágen LSB es lo primero que se probaría, hay  que reforzarlo con un cifrado, con un simple ARC4 con una clave segura y suficiente padding basta para darle en los morros a los cotillas y para desalentar a algun bot que analice la red en busca de algo sospechoso, este cifrado ya se explico anteriormente, así que vamos con lo siguiente.

Una sola imágen está bien para cosas pequeñas, pero hasta una relativamente grande no puede soportar más de 1 mega, hay que buscar una forma de dividir el archivo y mantener una lista de las ubicaciones de las partes, digamos por ejemplo que queremos dividir el archivo cifrado entre las imágenes y subir estas a un hosting de imágenes como Imageshack.us, habría que guardar las URL donde quedan las imágenes, ya puestos la clave se podría sacar de "/dev/urandom" para que sea lo suficientemente cerca y de paso guardar el tamaño del archivo original, en esta implementación, el formato usado es este:

Actualización: corregido un error muy tonto que podía ocurrir al guardar la clave en el gzip :P


 - Tamaño del archivo original: 8 bytes
 - Clave en hexadecimal, string acabada en \0
 - Las URL, en el orden en que se codifico el archivo, terminada cada una por \0

Todo comprimido con GZip.

Los scripts: el primero, que divide un archivo entre varias imágenes y genera el gzip con "la hoja de ruta" [ stego_split.py ] ( utiliza esto para las peticiones POST ), el segundo, que descarga las imágenes y descifra el archivo usando el archivo GZip [ stego_join.py ].
Nota: al dividir el archivo, para de subir imágenes cuando puede haber metido todo el archivo.
Nota2: al dividirlo, el mayor cuello de botella es la subida por eso se hace con multiples hilos, al final cuando pone "Online: ...", esos son los hilos que están subiendo imágenes.

Argumentos del que divide y sube:

./stego_split.py <archivo> <salida> <imágen> [<imágen>[ ... ]]


Argumentos del que lo vuelve a juntar:

./stego_join.py <camino.gz> <salida>




Capturas subiendo un archivo de 2Megas:

Escogí el formato GZip  porque aunque no comprime mucho, es suficiente para datos sobre todo alfabéticos, además soporta "basura" al final del archivo, entonces se pueden utilizar los scripts de la parte anterior para añadirlo a una imágen, por ejemplo, una imágen como esta ( obra del gran "Bichero") puede contener el GZip que permite recuperar las otras imágenes y el archivo final ( solo un video de colorines ) :



$ ./stego_extract.py piratas.png path.gz
$ ./stego_join.py path.gz video.avi
Tamaño del archivo: 2758500
Clave:  fccf9b4969c1feaec8faeb4ca70e11cdd9484018
Descargando http://img192.imageshack.us/img192/4793/upanddown0sp.png
Leyendo upanddown0sp.png
Descargando http://img511.imageshack.us/img511/2542/upanddown1sp.png
Leyendo upanddown1sp.png
Descargando http://img6.imageshack.us/img6/9034/upanddown2sp.png
Leyendo upanddown2sp.png
Descargando http://img13.imageshack.us/img13/404/upanddown3sp.png
Leyendo upanddown3sp.png
Descargando http://img534.imageshack.us/img534/3374/upanddown4sp.png
Leyendo upanddown4sp.png
Descargando http://img843.imageshack.us/img843/6019/upanddown5sp.png
Leyendo upanddown5sp.png
Descargando http://img17.imageshack.us/img17/2379/upanddown6sp.png
Leyendo upanddown6sp.png
Descargando http://img836.imageshack.us/img836/7600/upanddown7sp.png
Leyendo upanddown7sp.png
$ md5sum video.avi para_prueba.avi
6e604af1761085c9104b8141c01d47e8  video.avi
6e604af1761085c9104b8141c01d47e8  para_prueba.avi
$

El problema: hay que subir más o menos 4 veces más datos de los necesarios, probado con un archivo de ~ 50 megas, resulta en 200, ... y dá gracias de que PNG esté comprimido.

Y hasta aquí esto de montar un mini sistema de descargas oculto, nos leemos.

No hay comentarios:

Publicar un comentario