Esteganografía por archivos: ocultar datos directamente en sectores

Breve introducción

La esteganografía, si alguien no lo recuerda, esconde información en algunos contenedores. Por ejemplo, en imágenes (discutidas aquí и aquí). También puede ocultar datos en las tablas de servicios del sistema de archivos (esto fue escrito sobre aquí), e incluso en paquetes de servicio del protocolo TCP. Desafortunadamente, todos estos métodos tienen un inconveniente: para "insertar" información en un contenedor de manera imperceptible, se necesitan algoritmos astutos que tengan en cuenta las peculiaridades de la estructura interna del contenedor. Y surgen problemas con la resistencia del contenedor a la manipulación: por ejemplo, si editas ligeramente la imagen, se pierde la información oculta.

¿Es posible de alguna manera prescindir de algoritmos astutos y manipulaciones sutiles con los datos y aún así garantizar la funcionalidad del contenedor y un nivel aceptable de seguridad de los datos ocultos? De cara al futuro, diré: ¡sí, puedes! Incluso ofreceré una utilidad.

Detalles sangrientos del método.

La idea básica es tan simple como un golpe en la frente: hay áreas en el disco en las que el sistema operativo nunca escribe (o escribe en casos excepcionales). Para evitar la necesidad de buscar estas áreas utilizando algoritmos astutos, usaremos redundancia, es decir, duplicaremos nuestra información oculta muchas, muchas veces en todos los sectores del disco. Luego, justo encima de todo este esplendor, puede crear las particiones necesarias, formatear sistemas de archivos, escribir archivos e instalar sistemas operativos; de todos modos, parte de los datos secretos se guardarán y podrán recuperarse, y la duplicación repetida nos ayudará armar el conjunto original a partir de las piezas.

La ventaja de este método es obvia: no dependemos del formato de archivo, ni siquiera del tipo de sistema de archivos utilizado.

Las desventajas también son, creo, obvias:

  • Los datos secretos solo se pueden cambiar reescribiendo completamente todo el disco y luego recreando el contenido visible para el usuario. Sin embargo, no puedes utilizar un software que recree el disco a partir de una imagen: también recreará los datos secretos anteriores.
  • Cuanto mayor sea el volumen de datos secretos, mayor será la probabilidad de perder cierta información.
  • Recuperar datos del disco puede llevar mucho tiempo. Desde varios minutos hasta varios días (los discos modernos son grandes).

Ahora pasemos a los detalles.

Está claro que si simplemente unta datos secretos por todo el disco, solo se ocultarán a simple vista. Si equipa su mirada con, digamos, un editor de disco, los datos aparecerán en todo su esplendor. Por tanto, sería una buena idea cifrar los datos para que no aparezcan. Cifraremos de forma sencilla, pero con buen gusto: utilizando el algoritmo aes256-cbc. Le pediremos al usuario la clave de cifrado y le dejaremos encontrar una buena contraseña.

La siguiente pregunta es cómo podemos distinguir los datos “buenos” de los malos. Aquí nos ayudará una suma de comprobación, pero no una simple, sino SHA1. ¿Y qué? Es lo suficientemente bueno para git, por lo que también nos vendrá bien. Decidido: proporcionamos a cada información almacenada una suma de verificación, y si después del descifrado coincide, significa que el descifrado fue exitoso.

También necesitará el número de fragmento y la longitud total de los datos secretos. El número de fragmento es para llevar la cuenta de qué piezas ya hemos descifrado y cuáles quedan. La longitud total nos será útil a la hora de procesar el último fragmento, para no escribir datos innecesarios (es decir, relleno). Bueno, como todavía tenemos un encabezado, agregaremos allí el nombre del archivo secreto. Será útil después del descifrado para no adivinar cómo abrirlo.

Probando el método en la práctica.

Para comprobarlo, tomemos el medio más común: una unidad flash. Encontré uno antiguo con 1 GB de capacidad, que es bastante adecuado para experimentos. Si a usted, como a mí, se le ocurrió la idea de no molestarse con los medios físicos, sino probarlo en un archivo, una imagen de disco, le diré de inmediato: no funcionará. Al formatear dicho "disco", Linux vuelve a crear el archivo y todos los sectores no utilizados se rellenarán con ceros.

Desafortunadamente, como máquina con Linux, tuve que usar una estación meteorológica en el balcón de la Raspberry Pi 3. No hay mucha memoria allí, por lo que no esconderemos archivos grandes. Nos limitamos a un tamaño máximo de 10 megas. Tampoco tiene sentido ocultar archivos que son demasiado pequeños: la utilidad escribe datos en el disco en grupos de 4 KB. Por lo tanto, a continuación nos limitaremos a un archivo de 3 KB: encaja en uno de esos grupos.

Nos burlaremos de la unidad flash por etapas, comprobando después de cada etapa si la información oculta es legible:

  1. Formateo rápido en formato FAT16 con un tamaño de clúster de 16 KB. Esto es lo que ofrece Windows 7 con una unidad flash que no tiene un sistema de archivos.
  2. Llenar la unidad flash con todo tipo de basura al 50%.
  3. Llenar la unidad flash con todo tipo de basura al 100%.
  4. Formateo “largo” en formato FAT16 (sobrescribiendo todo).

Las dos primeras pruebas, como se esperaba, terminaron con una victoria total: la utilidad pudo extraer con éxito 10 megabytes de datos secretos de la unidad flash. Pero después de que la unidad flash se llenó con archivos al máximo de su capacidad, se produjo una falla:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Como puede ver, sólo se descifraron con éxito 158 clústeres (632 kilobytes de datos sin procesar, lo que da 636424 bytes de carga útil). Está claro que aquí no hay forma de conseguir 10 megabytes y, sin embargo, entre estos grupos hay claramente duplicados. Ni siquiera puedes recuperar 1 megabyte de esta manera. Pero podemos garantizar que recuperaremos 3 kilobytes de datos secretos de una unidad flash incluso después de formatearla y escribirla al máximo de su capacidad. Sin embargo, los experimentos muestran que es muy posible extraer un archivo de 120 kilobytes de una unidad flash de este tipo.

Desafortunadamente, la última prueba mostró que se sobrescribió toda la unidad flash:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

No ha sobrevivido ni un solo grupo... ¡Triste, pero no trágico! Antes de formatear, intentemos crear una partición en la unidad flash y ya en ella un sistema de archivos. Por cierto, viene de fábrica exactamente con este formato, así que no estamos haciendo nada sospechoso.
Es de esperar que el espacio disponible en la unidad flash haya disminuido ligeramente.

También es de esperar que no se puedan ocultar 10 megabytes en un disco completamente lleno. ¡Pero ahora el número de clústeres descifrados con éxito se ha más que duplicado!

Total clusters read: 250752, decrypted: 405

Desafortunadamente, es imposible ensamblar un megabyte a partir de piezas, pero doscientos kilobytes son fáciles.

Bueno, la noticia sobre la última cuarta verificación, esta vez es alegre: ¡formatear completamente una unidad flash de este tipo no condujo a la destrucción de toda la información! 4 kilobytes de datos secretos caben perfectamente en el espacio no utilizado.

Tabla resumen de la prueba:

Esteganografía por archivos: ocultar datos directamente en sectores

Un poco de teorización: sobre el espacio libre y los sectores no utilizados

Si alguna vez has dividido tu disco duro en particiones, habrás notado que no siempre es posible asignar todo el espacio libre en el disco. La primera sección siempre comienza con alguna sangría (normalmente 1 megabyte o 2048 sectores). Detrás del último tramo también sucede que queda una pequeña “cola” de sectores no utilizados. Y a veces hay huecos entre secciones, aunque raramente.

En otras palabras, hay sectores en el disco a los que no se puede acceder durante el trabajo normal con el disco, ¡pero se pueden escribir datos en estos sectores! Y eso significa leerlo también. Ajustado por el hecho de que también hay una tabla de particiones y un código de cargador de arranque, que se encuentran en el área vacía al principio del disco.

Tomemos un descanso de las secciones por un momento y miremos el disco a vista de pájaro, por así decirlo. Aquí tenemos una partición vacía en el disco. Creemos un sistema de archivos en él. ¿Podemos decir que algunos sectores del disco permanecen sin borrar?

E-e-e - ¡redoble de tambores! ¡La respuesta casi siempre será sí! De hecho, en la mayoría de los casos, la creación de un sistema de archivos se reduce a escribir solo unos pocos bloques de información de servicio en el disco y, de lo contrario, el contenido de la partición no cambia.

Y también, de forma puramente empírica, podemos suponer que el sistema de archivos no siempre puede ocupar todo el espacio que se le asigna hasta el último sector. Por ejemplo, un sistema de archivos FAT16 con un tamaño de clúster de 64 kilobytes obviamente no puede ocupar completamente una partición con un tamaño que no sea múltiplo de 64 kilobytes. Al final de dicha sección tendrá que haber una "cola" de varios sectores, inaccesibles para almacenar datos del usuario. Sin embargo, esta suposición no pudo confirmarse experimentalmente.

Por lo tanto, para maximizar el espacio disponible para el esteganograma, es necesario utilizar un sistema de archivos con un tamaño de clúster mayor. También puedes crear una partición, incluso si no es necesario (en una unidad flash, por ejemplo). No es necesario crear secciones vacías ni dejar áreas no asignadas; esto atraerá la atención de los ciudadanos interesados.

Utilidad para experimentos.

Puedes tocar el código fuente de la utilidad. aquí

Para compilar, necesitará Qt versión 5.0 o superior y OpenSSL. Si algo no funciona, es posible que tengas que editar el archivo steganodisk.pro.

Puede cambiar el tamaño del clúster de 4 KB a, digamos, 512 bytes (en secretfile.h). Al mismo tiempo, el coste de la información del servicio aumentará: el encabezado y la suma de comprobación ocupan una cantidad fija de 68 bytes.

Por supuesto, debe ejecutar la utilidad con derechos de usuario root y con precaución. ¡No se harán preguntas antes de sobrescribir el archivo o dispositivo especificado!

Disfrutar

Fuente: habr.com

Añadir un comentario