martes, 31 de mayo de 2016

Esteganografía fácil. Caso práctico



La esteganografía consiste en la aplicación de técnicas para ocultar un mensaje dentro de otro, conocido como portador. El término proviene del griego steganos (oculto) y graphos (escritura). En el fondo se trata de algo tan aparentemente sencillo como es esconder algo a la vista de todos.
En el mundo de la informática se puede esconder cualquier tipo de archivo siendo los portadores típicos documentos multimedia de audio, video o imagen.

La ocultación

Hoy vamos a ver un caso de ocultación esteganográfica muy sencilla usando el método de concatenación conocido como appendX. Este método consiste en algo tan sencillo como “añadir” al final del archivo portador el archivo a ocultar:
 
La forma de hacer esto es muy sencilla. Si estemos en un entorno Windows solo tenemos que ejecutar en el símbolo del sistema, en la carpeta donde tengamos guardados los documentos portador y a ocultar lo siguiente:

copy /b portador.jpg+fichero_a_ocultar.zip escondido.jpg

Tras la ejecución de este comando obtendremos el archivo escondido.jpg. Si lo visualizamos no veremos mas que la imagen del portador.

Ejemplo:
Tengo el fichero White_Cat_and_a_mouse.jpg que voy a usar como portador y el 201_military_base_08.jpg que quiero ocultar. El comando a ejecutar sería:

copy /b White_Cat_and_a_mouse.jpg+201_military_base_08.jpg lindogatito.jpg







Y si miro la carpeta con el explorador de Windows tendré lo siguiente: 




Vemos que la imagen resultado del copiado lindogatito.jpg es indistinguible de la elegida como portadora.

Vamos a ocultar también un archivo zip en otra imagen:



Siendo el resultado como anteriormente indistinguible de la imagen portadora:



Obviamente si hay una diferencia: el tamaño del archivo, pero si eliminamos del ordenador la imagen original no tendremos con que compararla y nos parecerá una imagen sin más.
En sistemas Linux/Unix es también muy sencillo. Se consigue el mismo resultado usando el comando “cat”:

cat portador.jpg ficheroaesconder.zip > ficheroescondido.jpg

Hay otros métodos, pero este es indudablemente el mas sencillo de todos.

El análisis

Ahora imaginemos el siguiente escenario: estamos realizando un análisis forense a un disco duro del que previamente hemos hecho una copia bit a bit del mismo. No es necesario decir que tenemos que usar una de las copias de ese disco y no el original.

Analizando su contenido nos encontramos con varias imágenes que nos parecen sospechosas, ¡quien guarda en su HD fotos de gatos!!!...bueno…no es tan sospechoso…

¿Cómo averiguamos si detrás de esos lindos gatitos nuestro sospechoso está escondiendo algo?
He decidido usar Kali Linux 2.0 para hacer el análisis forense de las imágenes. Si las visualizo sin mas con el visor de archivos veo lo mismo que veía en Windows:




Lo primero que intento, es obtener mas información de las imágenes leyendo los metadatos. Para hacer esto uso la herramienta exiftools que previamente instalo en Kali con el comando:

apt-get install exiftool

Recordar que Kali recomienda usar por defecto el usuario root, por lo que no es necesario hacer sudo.
Buscando información en los metadatos de la primera imagen (bonitogatito.jpg) no veo nada raro:




El análisis de metadatos no da ninguna pista. Usamos otro camino. Instalamos la herramienta stegdetect, que nos permite averiguar si una imagen tiene información oculta y que método de ocultación se ha usado. Tener cuidado con esta herramienta, no detecta todos los posibles métodos de ocultación ya que se ha quedado un poco desfasada, por ejemplo, no detecta el método jphide usado por el programa de ocultación steghide.

Instalar esta herramienta, stegdetect, requiere de un par de pasos. Desde un terminal en Kali ejecutar:

wget http://archive.debian.org/debian/pool/main/s/stegdetect/stegdetect_0.6-3_amd64.deb
dpkg -i stegdetect_0.6-3_amd64.deb

Con esto tendremos instalada la herramienta que vamos a usar a continuación.

Desde el directorio donde tengamos las imágenes a analizar ejecutamos lo siguiente:

stegdetect *.jpg

Obtenemos el siguiente resultado:




Esto ya si que nos da información: las dos primeras imágenes tienen datos añadidos al final. La primera aparentemente esconde un fichero con cabecera PK, lo que quiere decir que puede ser un .zip, y el segundo un Exif II que es una imagen.

La extracción de la información oculta

Pues ahora que sabemos que tenemos dos imágenes portadoras de archivos ocultos vamos a ver cómo podemos separar ambos.

El proceso es prácticamente el mismo en ambos casos. Lo primero es proceder a examinar con un editor/visor hexadecimal cada uno de los archivos para buscar las cabeceras y finales esperados para la extensión. En nuestro caso, tratándose de ficheros .jpg buscaremos en hexadecimal 0xFFD8 (SOI: Start Of Image) como cabecera y 0xFFD9 (EOI: End Of Image) como final. La información existente después de este final será el fichero oculto tras la imagen.

Usaremos como editor la herramienta hexeditor que trae Kali. Una vez abierto el fichero que queremos analizar usaremos el buscador (ctrl+W) para encontrar los bytes en hexadecimal correspondientes a EOI (FF D9). El resultado es el siguiente:



Aquí ya tenemos mucha información:

1.       La dirección del último byte del archivo contenedor es la 0x27121. Recordar que la columna de la izquierda nos da la dirección de la posición del primer byte de la línea que precede en hexadecimal. En este caso el byte FF está en la posición “00027120”.

2.       Derivado de este dato podemos saber que la longitud del archivo portador es en hexadecimal 0x27122 (recordar que el primer byte está en la dirección 0x00, no en la 0x01. Convirtiendo este valor a decimal, por ejemplo, con la calculadora de Windows o con en Linux con echo $((16#27122)), nos da 160034, que es la longitud en decimal del portador.

3.       Todo indica que el archivo oculto en la imagen es un zip ya que la cabecera es 0x504B, o PK en ASCII.

Ahora solo nos queda extraer el fichero oculto tras el portador. Para ello vamos a usar el comando dd de Linux de la siguiente manera:

dd if=bonitogatito.jpg of=oculto.zip bs=1 skip=160034

Los parámetros usados son:

if: es el fichero de entrada, es decir, la imagen que sabemos que tiene un archivo oculto añadido
of: es el fichero de salida, al que le ponemos la extensión zip porque sabemos que ese es su contenido por la cabecera PK.

bs: el el tamaño del bloque para el siguiente argumento, en este caso 1 Byte
skip: le decimos que “esquive” 160034 bloques ( es decir, bytes tal y como hemos indicado con el parámetro anterior) y que escriba en el fichero de salida a partir de esa posición.

El resultado es un fichero llamado oculto.zip, que si analizamos con unzip nos confirma que estamos en lo cierto en cuanto al contenido oculto:



Descomprimimos con unzip oculto.zip y comprobamos que es un fichero de MS Word comprimido en un zip. ¡Hemos encontrado el contenido oculto de la primera imagen!

Ahora vamos a por la segunda, la llamada lindogatito.jpg que stegdetect nos ha dicho que lleva oculta añadida al final otra imagen.

Procedemos de la siguiente manera que con la primera usando hexeditor:



Encontramos el final del jpg en la posición 0x14315 que indica que su longitud en decimal es de 82710 Bytes (14316 hex).

Procedemos con dd igual que anteriormente

dd if=lindogatito.jpg of=oculto.jpg bs=1 skip=82710

Y comprobamos que, efectivamente, había una imagen oculta tras el lindo gatito: 




Como no queremos fiarnos de que detrás de esta imagen oculta haya algo mas ejecutamos de nuevo stegdetect para oculto.jpg, obteniendo un resultado negativo:



Preparar el juego pruebas para hacer esta práctica es sencillo, en cualquier caso, aquí tenéis las imágenes contenedoras con datos ocultos.




Conclusión

Como veis, ocultar información usando imágenes como contenedores, para por ejemplo sacar información de una empresa…y con esto no quiero dar ideas…es muy sencillo, pero también lo es detectarlo y extraer la información oculta con unos conocimientos mínimos de seguridad informática. En el caso de análisis forenses, no hay que descartar nunca que detrás de una foto inocente haya algo más…no todo es lo que parece.

Hay herramientas, como steghide, que permiten una ocultación cifrada y una extracción de la información mucho más sencilla, pero eso ya es otra historia…

No hay comentarios:

Publicar un comentario