domingo, 8 de febrero de 2009

Data carving

Segun la definición del dfrws2006 el data carving sería:

"el proceso de extraer una serie de datos de un gran conjunto de datos. La técnica de data carving se utiliza habitualmente durante una investigación digital cuando se analiza el espacio no ubicado de un sistema de ficheros para extraer archivos. Los archivos son 'desenterrados' del espacio no ubicado utilizando valores para las cabeceras y piés específicos del tipo de archivo. Las estructuras manejadas por el sistema de ficheros no son tenidas en cuenta durante el proceso"

Tal y como se desprende de la anterior definición, un concepto estrechamente relacionado con el data carving sería el de cabecera y pié de fichero. Los ficheros que maneja cualquier sistema operativo no son mas que bloques de datos binarios con un formato determinado. Los ficheros pueden o no tener una extensión (p.e. txt) que se utiliza para identificar el tipo de fichero de que se trata, pero este no es un dato determinante. En su lugar, el tipo de fichero puede identificarse inequívocamente analizando lo que se conoce como magic numbers.

Un magic number, en relación a un fichero, es una constante que permite identificar el tipo para el fichero que la contiene dado que todos los ficheros contienen un magic number que delimita el inicio (cabecera) y pueden o no tener uno para el final (pié) del fichero. Por ejemplo, para los ficheros GIF el magic number en formato ASCII para la cabecera se correspondería con "GIF87a" o "GIF89a" y para el pié, en formato hexadecimal, sería "00 3b". Éste dato, y no la extensión asignada, es el que utiliza el comando file de Linux para identificar el tipo de un fichero que se le proporciona como argumento:

[neofito@wadalberto ~]$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dinamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

El comando file lee la información relacionada con los magic numbers desde el fichero compilado /usr/share/file/magic.mgc o desde /usr/share/file/magic en caso de que no exista la versión binaria.

Lo más parecido al comando anterior que existe en Windows sería la utilidad filever, la cual puede instalarse como parte de las support tools disponibles en el cd de instalación de Windows 2k/XP/2k3. Un ejemplo de su ejecución, despues de eliminar la extensión para el fichero objeto de análisis, sería:
C:\Archivos de programa\Support Tools>filever.exe /B sidwkr

--a-- W32i DLL ENU 1.0.0.1 shp 102,912 08-17-2001 c:\archivos de programa\support tools\sidwkr

Ahora que ya entendemos algo mejor el concepto de data carving y como, sin utilizar las funcionalidades ofrecidas por el sistema de ficheros, es posible recuperar archivos desde bloques de datos en crudo vamos a analizar el funcionamiento de la utilidad foremost.

Se trata de una herramienta desarrollada originalmente por Jesse Kornblum y Kris Kendall para el Air Force Office of Special Investigations y The Center for Information Systems Security Studies and Research de los Estados Unidos. Su código ha sido liberado y actualmente es mantenido por la comunidad Open Source.

Vamos a investigar como funciona y aprendremos a utilizarlo, pero lo haremos desde un sistema Windows, y para ello necesitaremos de la ayuda de Cygwin.

¿Qué es Cygwin?

Se trata un entorno Linux que puede ejecutarse en un sistema Windows. Es algo así como un traductor, de forma que todas las llamadas del API de Linux son trasladadas y ejecutadas como llamadas del API de Windows. El componente principal lo conforma la libreria cygwin1.dll, la cual es responsable de proporcionar dicha traducción y, por lo tanto, permitir la ejecución de programas Linux en un sistema Windows.

Desarrollado por Red Hat se distribuye bajo licencia GPL y puede descargarse de forma gratuita. En estos momentos está confirmado su funcionamiento en las diferentes ediciones de Windows, tanto en sus versiones de 32 como de 64 bits.

Solo un apunte, para que una aplicación Linux pueda ejecutarse bajo Windows será necesario compilarla a partir de sus fuentes, utilizando para ello el entorno proporcionado por Cygwin, así como ubicar la librería cygwin1.dll en una ruta accesible para el ejecutable obtenido.

Instalando Cygwin

El primer paso, evidentemente, consitirá en descargar el instalador desde la página oficial. La última versión disponible para la dll de Cygwin en el momento de escribir estas líneas es la 1.5.25-15, mientras que cada uno de los diferentes paquetes disponibles para su descarga mantiene su propia versión. Pero no deberemos preocuparnos de este punto, de eso se encargará el instalador.

Una vez ejecutado nos aparecerá una ventana indicándonos la versión del instalador. Si pulsamos el botón Siguiente podremos escoger el origen de los paquetes utilizados para la instalación:
  • Install from Internet
    Se trata de la opción predeterminada y será preciso disponer de conexión a Internet. Si la seleccionamos se realizará la descarga e instalación, conservándose los paquetes utilizados para ser reutilizados en un futuro (p.e. la instalación en una máquina distinta).

  • Dowload Without Installing
    Mediante esta opción podremos descargar todos los paquetes que precisemos para utilizarlos posteriormente en una instalación offline.

  • Install from local directory
    Para utilizar esta opción tendremos que haber ejecutado el instalador previamente mediante cualquiera de las dos opciones anteriores.

En nuestro caso dejaremos la opción predeterminada y continuaremos el proceso pulsando el botón Siguiente.

En este momento indicaremos el directorio donde se instalarán los diferentes ficheros que conforman la aplicación así como otras opciones relacionadas. Dejaremos las seleccionadas de forma predeterminada y pulsaremos Siguiente.

La siguiente pantalla nos solicita la ruta del directorio donde queremos que se almacenen los ficheros descargados, la cual deberá existir previamente. En mi caso he indicado C:\cygwin_install, lugar donde, una vez finalizado el proceso, tambien moveré el instalador.

Las siguientes ventanas permiten definir las opciones de conexión a Internet, así como el servidor que se utilizará para descargar los paquetes necesarios.

Ahora llega el momento crucial, momento en el cual realizaremos la selección de los paquetes que serán descargados y, en consecuencia, instalados. Además de los predeterminados, y para el propósito que nos ocupa, desplegaremos la categoría Devel y seleccionaremos los paquetes gcc y make. Observaremos como se autoseleccionarán las dependencias necesarias. Al pulsar el botón Siguiente se realizará la descarga e instalación de los paquetes indicados. Para finalizar el proceso aceptaremos las opciones predeterminadas de creación de accesos directos para la aplicación.


Generando el ejecutable de foremost


Vamos a curiosear un poco antes de continuar. Tal como se indicaba en el proceso de instalación, de forma predeterminada todos los paquetes que conforman el entorno de Cygwin se ubicarán bajo el directorio C:\cygwin. Si analizamos su contenido observaremos un árbol de directorios similar al existente en todos los sistemas Linux. Como curiosidad indicar que para acceder a cualquier fichero del sistema Windows anfitrión podremos utilizar el directorio cygdrive. Por ejemplo, para obtener un listado del contenido de la unidad C ejecutaremos:
neofito@wadalberto ~
$ ls -l /cygdrive/c/

Llega el momento de obtener el ejecutable de foremost, y para ello vamos a compilarlo desde las fuentes. Descargaremos el paquete con la última versión disponible desde el sitio oficial y lo ubicaremos, por ejemplo, dentro del directorio home de nuestro usuario (en mi caso /home/neofito).

Lanzaremos ahora el prompt de cygwin accediendo a un emulador de la shell bash. Vamos a desempaquetar las fuentes de foremost, y para ello ejecutaremos:
neofito@wadalberto ~
$ tar xvzf foremost-1.5.5.tar.gz

Accederemos ahora al directorio recién obtenido y ejecutaremos los comandos necesarios para compilar el paquete, esto es:
neofito@wadalberto ~
$ cd foremost-1.5.5/
neofito@wadalberto ~/foremost-1.5.5
$ make

Para finalizar el proceso de instalación restaría ejecutar el comando "make install", pero dado que únicamente buscábamos obtener el binario terminaríamos en este punto. Si ahora utilizamos el explorador de Windows para acceder al directorio C:\cygwin\home\foremost-1.5.5 observaremos como el binario resultante tiene la extensión .exe.

Utilizando foremost desde Windows

Bien, una vez hemos obtenido el ejecutable compilado de foremost vamos a reunir los ficheros necesarios para poder ejecutarlo bajo cualquier sistema Windows, aunque no se disponga de una instalación de Cygwin en el mismo.

En primer lugar necesitaremos el binario ejecutable, foremost.exe, y su fichero de configuración, foremost.conf, los cuales podremos encontrar, siempre que hayamos seguido exactamente los pasos descritos con anterioridad, en el directorio foremost-1.5.5 dentro del home de nuestro usuario. En mi caso particular la ruta exacta sería:
C:\cygwin\home\neofito\foremost-1.5.5

Por último precisaremos también de la librería cygwin1.dll que, como ya sabemos, se encarga de proporcionar la traducción de las llamadas del API de Linux al API de Windows. Si durante la instalación de cygwin hemos aceptado las opciones predeterminadas localizaremos la dll en el directorio C:\cygwin\bin.

Una vez localizados estos tres ficheros podremos copiarlos a cualquier otra instalación de Windows y utilizar el comando foremost como si estuviéramos en una máquina Linux, siempre y cuando todos se encuentren en la misma ubicación.

El fichero de configuración foremost.conf controla los tipos de ficheros que foremost es capaz de localizar y para ello incluye especificaciones detalladas para los magic number que conforman la cabecera y el pié. Por defecto foremost es capaz de encontrar numerosos tipos de ficheros y puede ampliarse su numero incluyendo definiciones explícitas. Para ello deberá incluirse una nueva línea no precedida por el caracter #, correspondiente a un comentario, y con los siguientes campos:
  • Extensión asociada a los ficheros obtenidos (p.e. gif) o NONE en el caso de que no la tenga.
  • El magic number diferencia entre mayúsculas y minúsculas (case-sensitive), y, o no, n.
  • Tamaño máximo del fichero si antes no se ha localizado el pié, indicado en bytes.
  • Valor hexadecimal u octal para el magic number que identifica la cabecera.
  • Valor hexadecimal u octal para el magic number que identifica el pié, en el caso de que lo tenga.
  • Opciones especiales (REVERSE y NEXT) y que no resultan estrictamente necesarias.

gif y 155000000 \x47\x49\x46\x38\x37\x61 \x00\x3b
gif y 155000000 \x47\x49\x46\x38\x39\x61 \x00\x00\x3b

Las opciones que admite el fichero de configuración son las siguientes:
  • REVERSE
    Provoca que la búsqueda del fichero se realice de forma inversa, es decir, primero se localiza el pié y desde allí se busca hacia delante hasta encontrar la cabecera o alcanzar el tamaño máximo indicado. Resulta útil cuando se buscan ficheros que no tienen una cabecera explícitamente definida.

  • NEXT
    Realiza una búsqueda hacia delante desde la coincidencia de la cabecera hasta alcanzar el tamaño máximo indicado o localizar el pié, el cual, sin embargo, no es incluido en el fichero resultante.

Foremost trabaja leyendo bloques de datos de un tamaño por defecto igual a 512 bytes, a menos que se utilice la opción -b, la cual permite especificar un tamaño de bloque distinto. Una vez leidos los datos se almacenan en memoria y se realiza la busqueda de la cabecera o pié, según las opciones especificadas en el fichero de configuración. Cuando se haya una coincidencia se almacena en memoria el tamaño máximo indicado para el tipo de fichero y se escribe en el fichero resultante el total almacenado en memoria o los datos englobados por las marcas de cabecera y pié del fichero.

Los resultados obtenidos se almacenan, por defecto, en el directorio output, el cual se ubicará en la misma ruta desde la que se ejecute foremost. La opción -o permite especificar la ruta absoluta para el directorio que almacenará los resultados. Otra opción relacionada es -T, la cual provoca que se agregue la marca de tiempo correspondiente a la de ejecución del programa al nombre del directorio predeterminado.

En el directorio con los resultados de la ejecución de foremost encontraremos un fichero de texto, audit.txt, que incluye información referente a los parámetros utilizados para ejecutarlo, marcas de tiempo para el inicio y final de su ejecución, información del fichero de entrada, número de ficheros encontrados para cada uno de los tipos buscados y referencias a los nombres utilizados para los ficheros volcados así como su tamaño y ubicación dentro del fichero de entrada. También encontraremos diferentes directorios cuyo nombre coincidirá con la extensión de los ficheros volcados como resultado.

Vamos a ver ahora algunos ejemplos de la ejecución de foremost. Para ello utilizaremos como fichero de entrada el publicado como objeto de análisis para el challenge correspondiente al DFRWS 2006, y que podemos descargar desde aquí.

Para localizar todos los ficheros jpg y volcarlos en un directorio de resultados que incluya en su nombre la marca de tiempo de ejecución:
C:\Users\neofito\foremost>foremost.exe -T -t jpg -i dfrws-2006-challenge.raw
Processing: dfrws-2006-challenge.raw
|*|

Para localizar todos los ficheros de Office y volcarlos en el directorio "resultados" obteniendo una salida elocuente:
C:\Users\neofito\foremost>foremost.exe -t ole -v -o resultados
-i dfrws-2006-challenge.raw
Foremost version 1.5.5 by Jesse Kornblum, Kris Kendall, and Nick Mikus
Audit File
 
Foremost started at Sun Feb 8 19:24:34 2009
Invocation: foremost -t ole -v -o resultados -i dfrws-2006-
challenge.raw
Output directory: resultados
Configuration file: /cygdrive/c/Users/javi/Desktop/blogpost/foremost.conf
Processing: dfrws-2006-challenge.raw
|------------------------------------------------------------------
File: dfrws-2006-challenge.raw
Start: Sun Feb 8 19:24:34 2009
Length: Unknown
 
Num Name (bs=512) Size File Offset Comment
 
0: 00032837.doc 282 KB 16812544
1: 00045964.doc 71 KB 23533568
*|
Finish: Sun Feb 8 19:24:34 2009
 
2 FILES EXTRACTED
 
ole:= 2
------------------------------------------------------------------
 
Foremost finished at Sun Feb 8 19:24:34 2009

Puede consultarse el significado explícito para cada una de las opciones admitidas por foremost en el siguiente documento.

Bibliografía

Extreme Exploits
Victor Oppleman, Oliver Friedrichs y Brett Watson
Anaya Multimedia

Data Carving Concepts

File Signatures Table

Auditoría forense: file carving con foremost


Y esto ha sido todo, en breve más, y mejor, espero.

2 comentarios:

GigA ~~ dijo...

Buen artículo Neo, desconocía la herramienta. Me recuerda a los metadatos que recolecta "la foca" de informatica 64.

Salu2

neofito dijo...

Pues gracias, no conocia a la tal "foca" :-)

Saludos