Esteganografía: Ofuscación de archivos (parte 2)

Luego de haber enseñado como ofuscar un archivo dentro de otro, llegó el momento de saber como “separarlos”. En la primera parte, hubo comentarios de quienes tenian problemas porque se corrompía el archivo y no todas las versiones de unrar o unzip lo podían descomprimir, ya que obviamente, el archivo tiene muchos bits y bytes extras que no corresponden al zip, al rar o al archivo que escondimos. Una vez separado el archivo que hemos escondido, evitaremos todos estos problemas y tendremos nuestro archivo íntegro.

Para separar el archivo vamos a usar el comando split, que nos permite “dividir” o “cortar” un archivo por líneas, bytes, etc. En este caso, separaremos por bytes el archivo.
La sintaxis de split para separar un archivo es tan simple como:

$ split --bytes=XXX archivo
o tambien
$ split -b XXX archivo

De esta forma, el split separará el archivo cada XXX bytes, creando archivos de la forma xab, xac, xad, … xaN.
Ejemplo:
[zerial@balcebu ejemplo_split]$ du -sh archivo.jpg
48K archivo.jpg
[zerial@balcebu ejemplo_split]$ split -b 10000 archivo.jpg
[zerial@balcebu ejemplo_split]$ ls
archivo.jpg xaa xab xac xad xae
[zerial@balcebu ejemplo_split]$ du -csh *
48K archivo.jpg
12K xaa
12K xab
12K xac
12K xad
8.0K xae
104K total
[zerial@balcebu ejemplo_split]$

Para poder separar el archivo ofuscado, vamos a necesitar saber de antemano el tamaño del archivo original, para poder separarlo por esa cantidad de bytes.

Siguiendo con el mismo ejemplo del primer post, aquí vamos:

Tenemos los tres archivos; el archivo principal, el archivo que queremos ofuscar y el archivo ya ofuscado
[zerial@balcebu ofuscar]$ ls -l
total 816
-rw-r--r-- 1 zerial users 408482 Oct 27 09:54 archivo.zip
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg
-rw-r--r-- 1 zerial users 6041 Oct 27 09:52 dummie.jpg
[zerial@balcebu ofuscar]$

Nuestro fin es separar el archivo “archivo.zip” de “archivo_ofuscado.jpg”.
[zerial@balcebu ofuscar]$ mv archivo_ofuscado.jpg separacion/
[zerial@balcebu ofuscar]$ cd separacion/
[zerial@balcebu separacion]$ ls
archivo_ofuscado.jpg
[zerial@balcebu separacion]$

Vemos el tamaño en bytes del archivo principal “dummie.jpg”
-rw-r--r-- 1 zerial users 6041 Oct 27 09:52 dummie.jpg

6041 bytes. Por tanto, tenemos que decirle a split, que nos divida el archivo_ofuscado.jpg en pequeños trozos de 6041 bytes cada uno.

[zerial@balcebu separacion]$ split -b 6041 archivo_ofuscado.jpg
[zerial@balcebu separacion]$ ls -l
total 956
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaa
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xab
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xac
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xad
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xae
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaf
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xag
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xah
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xai
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaj
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xak
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xal
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xam
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xan
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xao
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xap
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaq
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xar
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xas
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xat
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xau
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xav
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaw
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xax
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xay
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xaz
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xba
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbb
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbc
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbd
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbe
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbf
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbg
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbh
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbi
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbj
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbk
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbl
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbm
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbn
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbo
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbp
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbq
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbr
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbs
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbt
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbu
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbv
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbw
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbx
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xby
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xbz
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xca
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcb
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcc
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcd
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xce
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcf
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcg
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xch
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xci
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcj
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xck
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcl
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcm
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcn
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xco
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 xcp
-rw-r--r-- 1 zerial users 3735 Nov 19 10:57 xcq
[zerial@balcebu separacion]$

Ya tenemos dividido el archivo_ofuscado en pequeños trozos. Como nuestro archivo dummie.jpg teina un tamaño de 6041 bytes y es este archivo el que está por sobre el archivo ofuscado, el primer archivo que nos extrajo split corresponde a dummie.jpg; por tanto, renombramos xaa a dummie.jpg y concatenamos todos los demas archivos y lo llamamos archivo.zip (corresponde a nuestro archivo ofuscado)

[zerial@balcebu separacion]$ mv xaa dummie.jpg
[zerial@balcebu separacion]$ cat x* >archivo.zip
[zerial@balcebu separacion]$ rm x*
[zerial@balcebu separacion]$ ls -l
total 816
-rw-r--r-- 1 zerial users 408482 Nov 19 10:59 archivo.zip
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg
-rw-r--r-- 1 zerial users 6041 Nov 19 10:57 dummie.jpg
[zerial@balcebu separacion]$

Con esto ya hemos extraído nuestro archivo ofuscado. Para comparar que está íntegro y que realmente corresponde al original, comparemos los md5:

5c29dbb3975a5ffe31768b79548e1884 archivo.zip
ded467af5a22134c44da18bc8d4fed1b dummie.jpg
5c29dbb3975a5ffe31768b79548e1884 ../archivo.zip
ded467af5a22134c44da18bc8d4fed1b ../dummie.jpg

Los dos primeros archivos corresponden a los archivos extraídos con split y los dos últimos a los archivos originales. Los md5 coinciden, por lo que lo hemos conseguido. Si ahora unzipeamos nuestro archivo.zip, no nos mostrará ningun warning, lo mismo pasara con winrar, etc.

[zerial@balcebu separacion]$ unzip archivo.zip
Archive: archivo.zip
creating: tipografias/
inflating: tipografias/Aller_Bd.ttf
inflating: tipografias/Aller_BdIt.ttf
inflating: tipografias/Aller_It.ttf
inflating: tipografias/Aller_Lt.ttf
inflating: tipografias/Aller_LtIt.ttf
inflating: tipografias/Aller_Rg.ttf
inflating: tipografias/AllerDisplay.ttf
[zerial@balcebu separacion]$

Sin warnings ni errores.

4 comentarios

  1. Y al “desofuscarlos” no pierden consistencia los datos? me refiero a que no hay problemas de corrupcion?

  2. No, no pierden. Como puse en el articulo mas de una vez, no se corrompen, ademas hice la prueba de ver el md5 del archivo original y del “desescondido” y son identicos.

  3. Muy buena explicacion, la cosa interesante aqui es que pasa cuando no tienes el tamaño del archivo original?

    En el caso de no tenerlo lo que podemos hacer se me ocurre seria

    hexdump -C archivo_ofuscado.jpg | grep -ae PK

    Al ver las concordancias, busquemos hexadecimalmente donde esta un FFD9 (pie de un JPG) y en seguida el PK(firma cabecera del ZIP)

    vemos el offset y apartir de ahi hacemos el split 😉

    Saludos 😉

  4. Hola @hecky: Estoy pensando en un tercer y ultimo post, donde mostrare otro “truco” para saber cual es el BIT o los BYTES para poder “cortar” nuestro archivo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.