jueves, enero 17, 2008

Mini-Tutorial de Esteganografía/Estegoanálisis.
Técnica Sustitutiva LSB by Alfonso Muñoz

FASE 3 - Parte Esteganografía

Estimados "malignos", hace aproximadamente un mes. Chema y yo coincidimos en el CIBSI2007, donde presentaba oficialmente (más o menos) mis impresiones sobre mi herramienta estegoanalítica beta StegSecret. Chema me comentó que le resultaría muy interesante publicar algún que otro tutorial sobre esteganografía/estegoanálisis, ya que a "sus chicos..." les gustan las sensaciones nuevas ;)

Aprovechando el Reto Hacking V se introdujo una pequeña imagen con información oculta de forma secuencial en los LSB (Least Significant Bit) de cada pixel de la imagen, para probar un poco al personal y como escusa para introducir este mini-tutorial.

Empezemos con un mini-tutorial introductorio sobre esteganografía/estegoanálisis y técnicas sustitutivas LSB aplicadas a ficheros BMP, sin base matemática, de momento, en un futuro (maligno mediante) más...

El término Esteganografía se define como la ciencia y/o arte de ocultar una información dentro de otra, que haría la función de “tapadera” (estegomedio o cubierta). En la criptografía, en cambio, no se oculta la existencia del mensaje sino que se hace ilegible para quien no esté al tanto de un determinado secreto (la clave). En actualidad, es muy interesante la combinación de ambas.

El término Estegoanálisis se define como la ciencia que estudia la detección (ataques pasivos) y/o anulación (ataques activos) de información oculta en distintas tapaderas, así como la posibilidad de localizar la información útil dentro de la misma (existencia y tamaño).

Dependiendo del proceso empleado para ocultar la información, su recuperación puede ser inviable, correspondiendo su inversión a la ciencia del criptoanálisis. Piensese, por ejemplo, en el cifrado de una información utilizando un algoritmo criptográfico “seguro” (¿?) y la utilización de un PRNG (Pseudo-Random Number Generator) para seleccionar las posiciones donde se ocultara la información dentro de un estegomedio dado al aplicar una técnica sustitutiva, por ejemplo, LSB.

El estegoanálisis en casos muy concretos se convierte en una tarea trivial, pero en general, es un tema complejo y de difícil aplicación, principalmente por el número enorme de medios de información que existen (cantidad) y por la variedad de técnicas esteganográficas en estos medios.

En este mini-tutorial introductorio voy a centrar la atención en el estegomedio más utilizado: las imágenes digitales, y especialmente, los ficheros BMP por su sencillez.

Una de las técnicas más antiguas y difundidas es la técnica de sustitución LSB (Least Significant Bit). Esta técnica se basa en dos principios simples:

a) La modificación de los bits menos significativos de la codificación de los pixeles de una imagen no introduce un "ruido visual", en general, suficiente para levantar sospechas a una persona que vea una imagen que contiene información oculta.

b) La información almacenada "naturalmente" en los LSB es aleatoria, con lo que su modificación para introducir información oculta no proporcionaría pistas adicionales a un analista.

La primera afirmación a), en general, se cumple, pero la segunda es falsa, más adelante veremos porqué.

Existen distintas maneras de aplicar una técnica sustitutiva LSB dependiendo del estegomedio elegido, en un formato BMP, en general, en la codificación de los pixeles de la imagen, en un fichero GIF, por ejemplo, a los indices que apuntan a la paleta de colores, en un formato JPEG a los coeficientes cuantificados DCTs, etc, etc.

En el Reto V escogimos el formato BMP (cuando hablo de BMP me refiero aquí al Windows BMP) por ser, en general, un formato sin compresión con lo cual permitiría a cualquiera que intentará detectar la información oculta acceder directamente a la codificación de los pixeles. Además, la información se ocultó en el 1erLSB de cada octeto de la zona de los pixeles, con lo que más fácil imposible....

Es posible utilizar cualquier bit de la codificación de un pixel para ocultar una información, pero el ruido introducido, por ejemplo, visual, el bastante notorio para los bits de mayor peso.

[Inserción/Extracción de información]

La cabecera de los ficheros BMP: Tipo (2 byte) + Tamaño Archivo (4 bytes) + Reservado (4 bytes) + Distancia a los pixeles (4 bytes), incluye información para posicionarnos en la codificación de los pixeles de la imagen. Dependiendo de la resolución de la imagen, los pixeles pueden estar codificados de diferentes formas: 1,4,8,16,24,32 bits/pixel.

Por ejemplo, en una resolución típica, de 24 bits/pixel, cada pixel de la imagen se representa con 3 octetos, en este caso uno para el nivel de rojo, otro para el nivel de verde y otro para el nivel de azul, escala RGB.

La codificación de los pixeles es importante a la hora de decidir como ocultar un información, porque esto puede ayudar a dificultar la detección a un potencial estegoanalísta. Es más, puede engañar a algoritmos de detección muy precisos.

En general, la técnica sustitutiva LSB se puede aplicar a los pixeles de la forma que se desee y en el orden que se quiera.

De forma secuencial, pseudoaleatoria, mezcladas, etc. Por ejemplo, en una imagen de 24 bits/pixel (3 octetos), podríamos ocultar en ciertos pixeles sólo información en su octeto de Rojo, en otros en el de azul, etc.

[Consideraciones mínimas de seguridad]

Hace unos años se demostró que la aplicación de un técnica sustitutiva LSB sobre los pixeles de una imagen, independientemente de como se seleccione los pixeles, deja rastros traceables, mayores cuanto mayor sea el mensaje oculto.

A lo largo de la joven historia del estegoanálisis, algunos ataques han mostrado su validez, unos mejores otros peores.

Uno muy clásico son los ataques Visuales que mediante filtrados alertan visualmente de la presencia de información oculta, (aunque depende de la imagen) presenta resultados notorios, por ejemplo, cuando una imagen almacena información oculta aplicando LSB de forma secuencial sobre alguna zona de pixeles de la imagen. De hecho, aunque la información almacenada es muy pequeña si haceis un ataque Visual (LSB-0) con StegSecret a la imagen del RetoV, observareis a bajo a la izquierda un "pequeño patrón".

Por cierto, os lanzo una pregunta facil-facil, ¿si modificamos los LSB al principio del fichero BMP porqué al hacer el ataque Visual vemos modificaciones en la parte de abajo de la imagen y no en la de arriba como debería ser?

Aunque necesitaría un post, por cada uno, para explicarlos medianamente, en general, los algoritmos estegoanalíticos más famosos son los algoritmos estadísticos/estimadores, que se centran en la detección de información oculta con una cierta técnica de ocultación más o menos sofisticada. Existen otros tipos de algoritmos nuevos más prometedores.. pero esto en otra ocasión.

Voy a comentar brevemente 2 algortimos estadísticos/estimadores (ver StegSecret).


El ataque ChiSquare, se basa en estudiar las frecuencias de una pareja de valores y aplicarles un test estadístico chiSquare.

Dado unas condiciones de partida, analizando como se parecen los valores de la pareja se puede estimar la probabilidad de modificación de bits de la imagen, y en consecuencia detectar la presencia de información oculta, y estimar el tamaño de la información enmascarada. Es útil, por ejemplo, para una detección de LSB secuencial o LSB pseudoaleatorio cuando hay más de un 97% de ocupación(aprox) de la cubierta. Dependiendo de como se eliga los valores de la pareja y en que zona de la imagen se aplique el ataque ChiSquare puede tener éxito en su detección o no...

El ataque RS (RS viene del nombre de clasificación de grupos de pixels, R=Regular, S=Singular) es un ataque muy preciso para la detección de mensajes ocultados de forma pseudoaleatoria. Precisión, en torno, a modificaciones de 0'003 bits/pixel.

Cualquiera de estos ataques se pueden aplicar a distintos formatos gráficos y con diferentes codificaciones. Tipicamente, se puede ver su utilidad en imágenes RGB. En general, yo no recomiendo utilizar imágenes para ocultar información, en un futuro justificaré más porqué...

De todas formas, si un usuario lo desea existen unas recomendaciones mínimas de seguridad a cumplir:

a) La elección de la cubierta es muy importante, única por cada transmisión. Se recomienda imágenes de alta resolución (imágenes escaneadas o tomadas con cámaras digitales) o imágenes en escala de grises.

Por ejemplo, la imágen utilizada para el Reto V es una mala imagen. Al ser un imagen con amplias zonas de colores uniformes la sustitución LSB es apreciable en la imagen original. ¿Os habiais dado cuenta?.

b) Si aplicamos una técnica sustitutiva (existen otras, todo a su tiempo) a menor información ocultada menor es la probabilidad que las alteraciones producidas permitan a un analista detectar la presencia de información oculta. Basicamente esto se puede hacer de dos maneras:

b1) Ocultando menos información. Esto se puede hacer de multiples formas, y no necesariamente usando compresión. Existen procedimientos muy útiles de matrices de codificación, etc.... (hablaremos en un futuro).

b2) Distribuyendo una información en más de una cubierta. Por ejemplo, StegPage.

Y hasta aquí este breve tutorial.

Me gustaría, aprovechar y comentar unas cuestiones mínimas sobre StegSecret relacionadas con comentarios de gente en Internet que he estado leyendo y, que son erróneas.

En primer lugar, StegSecret es una herramienta de detección (estegoanálisis) con lo cual no se tiene que comparar con herramientas de ocultación (esteganografía)... En segundo lugar, StegSecret implementa, en general, dos tipos de procedimientos. Detección de herramientas esteganográficas concretas que dejan rastros traceables, por ejemplo, EOF y LSB. Y por otro lado, algoritmos visuales y estadísticos que se centran en técnicas de ocultación (no en herramientas concretas que la utilizan), por tanto es genérico. Se centran en LSB secuencial y pseudoaleatorio.

Leyendo por ahí, veo que la gente no ha comprendido muy bien que es una técnica EOF. Asique lo indico rapidamente. Existen multitud de formatos de ficheros que si añades una información al final del mismo, esto no altera su funcionamiento. Pobrad a añadir información a un: .exe, .doc, .ppt, .wav, .mp3, .jpg, .png, .gif, .bmp, etc, etc.

Un técnica muy tontorrona pero que es más o menos dificil de automatizar su detección, en StegSecret, por ejemplo, se analiza la estructura de ciertos formátos gráficos para detectar esta presencia de información, independientemente de la herramienta de ocultación que la haya puesto.

Bueno dicho lo dicho, espero que haya sido útil este minitutorial, no muy básico y nos veremos en un futuro.... o no.

Alfonso Muñoz
http://stegsecret.sourceforge.net/

15 comentarios:

kabracity dijo...

Gracias por el tutorial Alfonso, está bien tener guías sencillas que partiendo de cero te permitan entender conceptos interesantes, como creo que lo es la esteganografía.

Al hacer el reto me quedaron dos dudas sobre el LSB que empleaste:

-Por un lado, en la paleta del bmp, si hubiera estado ordenada (creo recordar que me fijé en que no lo estaba, pero hace ya un mes así que a saber si lo he soñado xD), al tomar el último bit, los cambios no se hubieran apreciado menos de forma visual?

-Por otro mi primera idea fue que habrías aprovechado los bits "de desecho" para ocultar la info sin que se notara nada en la imagen a priori.
Me refiero a que como el ancho de la imagen no era múltiplo de 4 (50), se podría haber metido más info (por ejemplo 4 bits, los 8 darían mucho el cante) en esos dos bytes que teníamos libres cada 52.
Está claro que la cantidad de info sería mucho más limitada, pero en cuanto a lo visual sería más elegante no?
Igual estoy desvariando, pero bueno soy aún nuevo en esto así que perdonadme :P, recuerdo que me quedé con la duda.

Bueno, enhorabuena de nuevo por el artículo, y por la iniciativa de la herramienta libre, espero que sigas con ella ;)

Un Saludo!

Anónimo dijo...

Buen post, espero que no sea el último de este tipo.

Anónimo dijo...

Por cierto a tomar por culo la vagancia en el curro... Controlando al empleado

M$ siempre intentando ayudar al currito... a suicidarse!!

Por cierto, poco movimiento hay hoy en el blog... la fiesta ha pasado factura!!!!

Anónimo dijo...

Tambien existe esteganografia en correos de spam, muchas veces el rey de nigeria no solo queria nuestro num de cuenta sino que ademas decia mas cosas; luego busco la pagian de como generar dichos correos los cuales encima tienen sentido

leandro_tami dijo...

Hola. Encontré tu blog por casualidad y la verdad es que me encantaron muchos de los artículos que leí. Particularmente éste me dejó bastante interesado y se me ocurrio por experimentar con ello, por lo que pronto voy a estar subiendo a mi blog los resultados.
Para ver si realmente entendí bien voy a tomarme la libertad de responder a las preguntas de kabracity. Por favor luego danos tu opinión:

1) Cuando hablás de BMPs, te referís exclusivamente a imagenes de más de 256 colores, de tal forma que no tienen paleta de colores. Si aplicamos tu método a un mapa de bits con paleta los cambios de color podrían ser tan bruscos que la imagen quedaría visible alterada y no es eso lo que se pretende

2) Puede ser (no estoy al tanto) que haya bits reservados en el formato BMP que se puedan usar para guardar datos. Respecto a los campos de ancho y alto, estos no podrían tocarse porque si bien para una imagen de 2x2 nos basta con 2 bits, el formato estipula que son x bits, y los programas que leyeran la imagen no podrían dibujarla.

3) La respuesta a tu pregunta "facil facil" creo que es que ese efecto se da porque la matriz de pixeles está al revés en los formatos BMP, para que uno la dibuje empezando de abajo hacia arriba lo cual es más rápido porque chequear el flag de cero es más fácil que comparar si llegamos o no al ancho/alto de la imagen.

Anónimo dijo...

Hola amigos.

Me alegra que les haya gustado este minitutorial, cuando disponga de un poquito de más tiempo, maligno mediante, hablaremos de procedimientos algo más sofisticados y no muy conocidos.

En cuanto, a alguna de las cosas que comenta "kabracity" la respuesta puede ser más o menos larga. Resumiendo algún aspecto:

+ Tipicamente un fichero BMP va sin paleta de colores, aunque es posible que la tenga. Se han documentado multitud de formas de ocultar una información utilizando los valores presentes en la paleta de colores (mecanismos no muy seguros como comentaremos en un futuro) y por supuesto en los indices que apuntan a estos, por ejemplo para ficheros GIF.

Piensese que si existe paleta de colores los valores de los pixeles de toda la vida son "indices" (valores de menor tamaño, de ahi la gracia de utilizar paleta de colores para hacer ficheros graficos más pequeños. Por ejemplo, si la paleta es de 256 colores, con un octeto (2^8) podemos direccionar cualquier posicion de un color presente en la paleta). En este caso, si se aplica una tecnica LSB a los indices el valor del pixel real (el que veremos en pantalla) será el mismo o un valor adyacente de la posición que apunta el indice a la paleta de colores (depende si introducimos un 0 o 1).

Es decir, tu puedes ocultar información utilizando la paleta de colores o los indices que apuntan a ella, pero existe un número importante de consideraciones a tener en cuenta para poder afirmar que el proceso es seguro desde un punto de vista estegoanalítico. Se ha escrito mucho, sobre como poder preprocesar (+- ordenar) una paleta
de colores para ocultar información, pero las consideraciones son muchas.

En esteganografía, como en otras ciencias, existen muchos "puristas" y existen técnicas que digamos no son muy recomendables. Por ejemplo, se puede ocultar información
a modo de comentario de la cabecera de ficheros JPEG, sin embargo, nadie considera esto como un procedimiento esteganografico mediamente robusto, aunque es cierto, que en determinados entornos es tan válido como otro para enviar una información subrepticia.

Resumiendo, hemos empezado por lo más sencillo una técnica LSB secuencial sobre los valores de los pixeles de un BMP, sin compresión y sin paleta de colores. Si se puede ocultar información haciendo uso de la paleta de colores, y el impacto visual depende muy mucho de como se procese la paleta y del número de colores involucrados. Por ejemplo, no es lo mismo una imagen de escala de grises que una de alta resolución.


Un saludo, espero que sirva de ayuda.

PD: Si os gusta el tema os invito a que colaboreis con el desarrollo de StegSecret en el manual describo muchas cosas que están pendientes. Algunas tan simples como generar hashes de aplicación esteganográficas disponibles en Internet.

kabracity dijo...

@leandro_tami hablo un poco de memoria, pero si no recuerdo mal el ficherito era un bmp de 8 bits, así que era de 256 colores, y si no recuerdo mal tenía paleta de colores (y ahora estoy en duda porque le he entendido a alfonso que hemos empezado por uno que no tenía paleta de colores jaja, me he perdido!)
Y no es que haya bits reservados, sino que cuando el número de píxeles por fila no es múltiplo de 4 hay bits de relleno:
"If the number of bytes matching a row (scanline) in the image is not divisible by 4, the line is padded with one to three additional bytes of unspecified value so that the next row will start on a multiple of 4 byte location in memory or in the file." (http://en.wikipedia.org/wiki/BMP_file_format)

Eso es lo que entendí, pero puede ser que me haya liado.

@alfonso lo qu describes es lo que yo había pensado que era la idea aquí; ya te digo, estoy casi convencido de que en este bmp teníamos paleta de colores, y que los bytes donde estaba el mensaje eran índices a posiciones de esa paleta, por eso hice alusión a lo de ordenarla, ya que cogiendo el lsb los cambios visuales serían menos bruscos.

Esperamos el artículo sobre los procedimientos más sofisticados :)

Un saludo

Anónimo dijo...

Hola kabracity, pues si te soy sincero hablo de memoria, creo que no tenía paleta de colores la imagen del reto, voy a mirarlo. En cualquier caso, en nuestro ejemplo da =, como la sustitución es byte a byte no existe mucha diferente entre que exista y no. Y los efectos visuales, en la imagen en concreto, al ser tan pequeña y con pocos colores y uniformes, poco más se puede hacer para ocultar una información, y facilitar en este caso que la encontrarais.

Un saludo.

Anónimo dijo...

Lo que comentas de:

"If the number of bytes matching a row (scanline) in the image is not divisible by 4, the line is padded with one to three additional bytes of unspecified value so that the next row will start on a multiple of 4 byte location in memory or in the file..."

el problema de utilizar este tipo de ideas, amén de otras cosas, al igual que sucede con el preformateo de la paleta de colores es que crees "patrones" facilmente detectables, para el reto podría haber estado bien, pero pense que un LSB tradicional era más adecuado. Por ejemplo, se puede detectar patrones del tipo: si la imagen es multiplo de tal pues miro tal posiciones y compruebo que...

Por este motivo, y siendo "purista"
estos procedimientos no se suelen "recomendar"....

Este tipo de fallos se encuentran sobre todo en muchas de las herramientas disponibles en Internet que ocultan información en ficheros GIF. Luego os paso un par de libros de referencia que profundizan en ello, y en los patrones que dejan y que se puede observar por ejemplo utilizando herramientas como PhotoShop, por si les quereis echar un vistazo.

Un saludo.

Anónimo dijo...

Una pregunta por curiosidad... a que os dedicais profesionalmente Alfonso,Kabracity,... porque yo soy programador y puedo jurar que al ritmo que avanza este mundo no tengo tiempo para mucho más que el curro y estar al día de las nuevas herramientas y de las mejoras de las existentes, y esto mucho más si trabajas bajo plataforma MS.

Ale un saludo fieras, acongojado me teneis...

Chema Alonso dijo...

Hola a todos, veo que os ha gustado el temita este de las esteganotopatías :P.

Gracias Alfonso!

eres un crá! ;)

NetVicious dijo...

La pregunta que deja Alfonso en el minitutorial (muy interesante por cierto) es bastante sencilla ya que los BMP se codifican al reves, es decir los primeros bits del fichero son los últimos bits de la imagen.

Se ve muy fácilmente cuando abres un BMP gordote como va "pintando" la imagen de abajo a arriba.

Anónimo dijo...

os paso la web de como emitri menasjes ocultos en spam
http://www.spammimic.com/

y de esteganografia en imagenes:
http://digitalphotography.weblogsinc.com/2005/07/29/steganography-with-flickr
http://www.petitcolas.net/fabien/watermarking/2mosaic/index.html
En la Universidad Carlos III existe un grupo q trabaja sobre esto; ello me dieron una parte de un master en al cual trataban el tema de esteganografia.

Talvisota dijo...

hola... lo único que no entiendo es lo siguiente: con qué motivo se oculta esa info? llegué hasta tu blog por el manual pdf del programa, el cual dice que una imagen de skin del k-meleon tiene 40b de info... esa es mi, quizá tonta pregunta, pero agradecería una respuesta. gracais

Anónimo dijo...

Estoy "completly sure" que esta imagen guarda un mensaje oculto, pero soy incapaz de descifrarlo.

https://pbs.twimg.com/media/CSAzk7_WUAMEnWW.jpg

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares