lunes, 1 de enero de 2018

Criptografía (LXXXIII): Solución Reto 10

El  enunciado del décimo reto que puse en este post era el siguiente: "Sospechamos que un empleado de nuestra compañía está sacando información confidencial para pasársela a la competencia. Tras diversas investigaciones creemos que para ello puede estar utilizando el pendrive que le ha proporcionado la empresa. Con la excusa de grabar en él cierta documentación conseguimos que nos lo deje y tras su análisis conseguimos recuperar diversos archivos borrados. Todos ellos están protegidos por contraseña, menos un archivo con una imagen (se asocian al reto este último y uno de los recuperados). En la imagen se oculta la contraseña del resto de archivos recuperados: ¿me puedes decir cuál es?".

Este reto es de esteganografía y su solución es:

1.- Descargamos los dos archivo asociados al reto (Reto 10_Imagen.bmp y Reto 10_Archivo recuperado 1.zip) y abrimos el segundo de ellos. Este archivo contiene un archivo comprimido (Documento 1.txt) protegido por contraseña.

En el enunciado del reto ya se nos dice que en la imagen se oculta la contraseña del archivo anterior y del resto de archivos recuperados. Abrimos el primero de los archivos asociados al reto (Reto 10_Imagen.bmp) con un editor hexadecimal,

El tamaño de archivo que se indica en su cabecera coincide con el que realmente tiene:
Por tanto, podemos descartar los métodos esteganográficos que incrementan el tamaño del archivo portador, tales como: EOF y el de ampliación de la cabecera para ocultar información adicional en ella.

Otro de los métodos más sencillos para ocultar información en un archivo de imagen bmp consiste en utilizar los Bytes de relleno de cada línea de la imagen. Es decir, en un archivo bmp los valores correspondientes a cada línea de la imagen se disponen de izquierda a derecha con una longitud de línea múltiplo de 4 Bytes, agregándose en caso necesario los Bytes con valor 0 que se precisen hasta completar la longitud múltiplo de 4. Estos Bytes de relleno se ignoran a la hora de visualizar la imagen, por lo que su utilización para ocultar información adicional no afecta a su visualización.

En nuestro reto, tal y como se puede observar en la figura siguiente, la imagen bmp tiene 523 píxeles de ancho:
En la figura anterior en la que se muestra la cabecera del archivo bmp, vemos que se utilizan 24 bits (3 Bytes) por píxel ("0018" en hexadecimal, 24 en decimal), por lo que cada línea de la imagen tendrá (523 píxeles x 3 Bytes/píxel) + 3 Bytes = 1.569 Bytes + 3 Bytes = 1.572 Bytes. Es decir, 1.569 no es múltiplo de 4 y, por tanto, se añaden 3 Bytes de relleno en cada línea hasta que su longitud sea igual al siguiente múltiplo de 4, hasta 1.572. Además, para conocer cuanta información podemos ocultar como máximo en esta imagen utilizando los Bytes de relleno de todas las líneas de la imagen basta con multiplicar el alto de la imagen (que tal y como se observa en la figura anterior es 412 píxeles) por el número de Bytes de relleno de cada línea, es decir, en nuestro caso: 412 líneas x 3 Bytes/línea = 1.236 Bytes.

Con el editor hexadecimal vamos a la posición que ocupa el primer carácter de relleno correspondiente a la primera línea de la imagen (en hexadecimal: 36 + 621 = 657):
Los tres caracteres de relleno de la primera línea contienen los valores en hexadecimal "4B 65 79", que se corresponden en ASCII con los caracteres "Key", por lo que parece que, efectivamente, se han utilizado los Bytes de relleno de algunas líneas para ocultar la contraseña que nos pide el reto.

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la segunda línea de la imagen (en hexadecimal: 657 + 3 + 621 = C7B):
Los tres caracteres de relleno de la segunda línea contienen los valores en hexadecimal "2F 30 38", que se corresponden en ASCII con los caracteres "/08".

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la tercera línea de la imagen (en hexadecimal: C7B + 3 + 621 = 129F):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "2D 30 33", que se corresponden en ASCII con los caracteres "-03".

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la cuarta línea de la imagen (en hexadecimal: 129F + 3 + 621 = 18C3):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "00 00 00".

Por tanto, vamos a realizar la primera prueba con la contraseña = "Key/08-03", y, efectivamente, es la clave correcta. El archivo Documento 1.txt que contiene el archivo zip tiene el siguiente contenido:
Por tanto, la solución al reto 10 es: Key/08-03.

******** PRÓXIMO RETO
Reto 11:   "En el fondo del mar".

No hay comentarios:

Publicar un comentario