Esteganografía fuera de los archivos: escondiendo datos directamente en los sectores

Una breve introducción

La esteganografía, si alguien no lo recuerda, es la ocultación de información en algún contenedor. Por ejemplo, en imágenes (se discutió aquí y aquí). También se pueden ocultar datos en tablas de archivos del sistema (de esto se escribió aquí), e incluso en paquetes de protocolo TCP. Lamentablemente, todos estos métodos tienen un inconveniente: para insertar información de manera discreta en un contenedor, se necesitan algoritmos sofisticados que consideren las características internas del contenedor. Además, hay problemas con la resistencia del contenedor a manipulaciones: por ejemplo, si se edita ligeramente la imagen, se pierde la información oculta.

¿Se puede evitar el uso de algoritmos sofisticados y manipulaciones sutiles de datos y, aun así, garantizar la funcionalidad del contenedor y un nivel aceptable de preservación de datos ocultos? Adelantándome, diré: ¡sí, se puede! E incluso propongo una utilidad.

Los detalles crudos del método

La idea principal es tan simple como un golpe en la cabeza: en el disco hay áreas en las que el sistema operativo nunca escribe (o escribe en raras ocasiones). Para evitar buscar estas áreas con algoritmos complejos, usaremos la redundancia: es decir, duplicaremos nuestra información oculta muchas, muchas veces en todos los sectores del disco. Luego, directamente sobre toda esta belleza se pueden crear las particiones necesarias, formatear sistemas de archivos, escribir archivos e instalar sistemas operativos: de todos modos, parte de los datos secretos se conservará y se podrá extraer, y la duplicación repetida nos ayudará a reconstruir el todo a partir de fragmentos.

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

Los inconvenientes también son, creo, obvios:

  • Los datos secretos solo se podrán modificar mediante la reescritura completa de todo el disco, con la posterior recreación del contenido visible para el usuario. No se puede usar software que recree el disco a partir de una imagen: recreará también los datos secretos anteriores.
  • Cuanto mayor sea el volumen de datos secretos, mayor será la probabilidad de pérdida de parte de la información.
  • La extracción de datos del disco puede llevar mucho tiempo. Desde unos minutos hasta varios días (los discos modernos son más grandes).

Ahora pasemos a los detalles.

Está claro que si simplemente dispersamos datos secretos por todo el disco, estarán ocultos solo de una mirada desprevenida. Si armamos la vista, digamos, con un editor de disco, los datos aparecerán en toda su gloria. Por lo tanto, sería bueno cifrar los datos para que no se vean. Los ciframos de manera sencilla, pero con gusto: usando el algoritmo aes256-cbc. Pediremos al usuario la clave de cifrado, dejándolo que invente una buena contraseña.

La siguiente pregunta es cómo distinguir los datos "correctos" de los dañados. Aquí nos ayudará un checksum, pero no uno cualquiera, sino un SHA1. ¿Y qué? Para git es bastante bueno, así que también nos servirá. Decidido: equipamos cada fragmento de información guardado con un checksum, y si coincide después de desencriptar, significa que la desencriptación fue exitosa.

También necesitaremos el número del fragmento y la longitud total de los datos secretos. El número del fragmento es para rastrear qué partes hemos desencriptado y cuáles quedan. La longitud total nos será útil al procesar el último fragmento, para no escribir datos adicionales (es decir, padding). Y ya que tenemos un encabezado en camino, agregaremos el nombre del archivo secreto. Esto será útil después de la desencriptación, para que no tengamos que adivinar con qué abrirlo.

Probamos el método en la práctica

Para la prueba, tomaremos el dispositivo de almacenamiento más común: una memoria USB. Encontré una antigua de 1 GB, que es adecuada para experimentos. Si, como a mí, se te ha ocurrido la idea de no complicarte con dispositivos físicos y probarlo en un archivo — una imagen de disco, pues te diré de inmediato: no funcionará. Al formatear dicho "disco", Linux crea el archivo de nuevo, y todos los sectores no utilizados estarán llenos de ceros.

Como máquina con Linux, lamentablemente, tuve que usar una estación meteorológica en desuso en un Raspberry Pi 3. La memoria no es abundante, por lo que no ocultaremos archivos grandes. Limitaremos el tamaño máximo a 10 megabytes. Los archivos demasiado pequeños también carecen de sentido ocultar: la utilidad escribe datos en el disco por clústeres de 4 KB. Por lo tanto, nos limitaremos a un archivo de 3 KB, ya que cabe en un solo clúster.

Iremos paso a paso con la memoria USB, comprobando después de cada paso si se puede leer la información oculta:

  1. Formateo rápido en formato FAT16 con un tamaño de clúster de 16 KB. Esto es lo que Windows 7 ofrece hacer con una memoria USB que no tiene sistema de archivos.
  2. Relleno de la memoria USB con basura al 50%.
  3. Relleno de la memoria USB con basura al 100%.
  4. Formateo 'largo' en formato FAT16 (con sobreescritura de todo).

Los primeros dos ensayos terminaron de manera completamente predecible con una victoria total: la utilidad pudo extraer con éxito 10 megabytes de datos secretos de la memoria USB. Pero después de que se llenó la memoria USB hasta el tope con archivos, hubo un fallo:

Total de clústeres leídos: 250752, descifrados: 158
ERROR: no se puede escribir secretFile incompleto

Como podemos ver, se logró descifrar con éxito solo 158 clústeres (632 kilobytes de datos en bruto, lo que da 636424 bytes de carga útil). Es evidente que aquí no se puede reunir 10 megabytes, y entre estos clústeres claramente hay duplicados. Incluso 1 megabyte de esta manera ya no se puede recuperar. Pero se puede garantizar que recuperaremos 3 kilobytes de datos secretos de la memoria USB incluso después de que se formatee y se llene por completo. Sin embargo, los experimentos muestran que es posible extraer un archivo de 120 kilobytes de tal memoria USB.

El último ensayo, desafortunadamente, mostró que la memoria USB se sobrescribió completamente:

$ sudo .\/steganodisk -p password \/dev\/sda
Tamaño del dispositivo: 250752 clústeres
250700 99%
Total de clústeres leídos: 250752, descifrados: 0
ERROR: no se puede escribir secretFile incompleto

No quedó ningún clúster… Triste, pero no trágico. Intentaremos crear una partición en la memoria USB antes del formateo, y luego una sistema de archivos en ella. Por cierto, de fábrica llegó exactamente con este formateo, así que no estamos haciendo nada sospechoso.
Es bastante predecible que el espacio disponible en la memoria USB ha disminuido un poco.

También es bastante predecible que no se pudo ocultar 10 megabytes en un disco completamente lleno. ¡Pero ahora el número de clústeres descifrados con éxito ha aumentado más del doble!

Total de clústeres leídos: 250752, descifrados: 405

Desafortunadamente, no se puede reunir un megabyte de piezas, pero doscientos kilobytes se pueden conseguir fácilmente.

Y la noticia del último, 4.º chequeo, esta vez es positiva: el formateo completo de tal memoria USB no llevó a la destrucción de toda la información. ¡120 kilobytes de datos secretos caben perfectamente en el espacio no utilizado!

Tabla resumen de las pruebas:

Esteganografía fuera de los archivos: escondiendo datos directamente en los sectores

Un poco de teoría: sobre el espacio libre y los sectores no utilizados.

Si alguna vez dividiste un disco duro en particiones, es posible que hayas notado que no siempre se puede asignar todo el espacio libre en el disco. La primera partición siempre comienza con un cierto margen (normalmente es de 1 megabyte, o 2048 sectores). También puede quedar un pequeño "colgante" de sectores no utilizados después de la última partición. Y, a veces, también permanecen espacios entre las particiones, aunque raramente.

En otras palabras, hay sectores en el disco a los que no se tiene acceso durante el uso normal del disco, ¡pero se pueden escribir datos en esos sectores! Y, por lo tanto, también se pueden leer. Con la salvedad de que también hay una tabla de particiones y un código de arranque que se encuentran en la zona vacía al inicio del disco.

Desviémonos por un momento de las particiones y veamos el disco desde una perspectiva más amplia, digamos, desde el aire. Tenemos una partición vacía en el disco. Vamos a crear un sistema de archivos en ella. ¿Se puede decir que algunos sectores del disco han quedado sin sobrescribir?

Y— ¡un redoble de tambores! La respuesta casi siempre será — ¡sí! Porque en la mayoría de los casos, la creación de un sistema de archivos implica que solo se escriben unos pocos bloques de información de servicio en el disco, mientras que el contenido de la partición no cambia.

Y además — empíricamente — se puede suponer que el sistema de archivos no siempre puede ocupar todo el espacio asignado hasta el último sector. Por ejemplo, un sistema de archivos FAT16 con un tamaño de clúster de 64 kilobytes evidentemente no podrá ocupar completamente una partición cuyo tamaño no sea múltiplo de 64 kilobytes. Al final de tal partición, debe quedar un "colgante" de varios sectores que no se puede utilizar para almacenar datos de usuario. Sin embargo, esta suposición no se ha podido confirmar experimentalmente.

Entonces, para maximizar el espacio disponible para la esteganografía, se debe usar un sistema de archivos con un tamaño de clúster mayor. También se puede crear una partición, incluso si no es necesario (por ejemplo, en una memoria flash). No es necesario crear particiones vacías ni dejar áreas no asignadas, ya que esto podría atraer la atención de personas interesadas.

Herramienta para experimentos

Puedes revisar el código fuente de la herramienta aquí

Para compilar se requiere Qt versión 5.0 o superior y OpenSSL. Si algo no compila, probablemente tendrás que ajustar el archivo steganodisk.pro.

Se puede cambiar el tamaño del clúster de 4 KB a, digamos, 512 bytes (en secretfile.h). Esto aumentará los costes de información de servicio: el encabezado y la suma de verificación ocupan 68 bytes fijos.

Naturalmente, debe ejecutar la utilidad con privilegios de usuario root y con precaución. ¡No habrá preguntas antes de sobrescribir el archivo o dispositivo especificado!

Disfruta.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster