23 ago 2011

File Carving – Excavando en los ficheros

Hola hoy veremos lo que es File Carving, algunas herramientas, pros y contras. Pero primero definamos que es.

El File carving lo podemos definir “entre cuates” como el proceso de excavación de ficheros en búsqueda de mas ficheros agregados basándonos en su estructura. (Para una definición mas formal pueden consultar ForensicsWiki).

En ámbito Forense esta rama es muy importante, pero nosotros lo veremos enfocados a la Esteganografía. El uso de File carving en la Esteganografía nos ahorrara mucho tiempo si lo sabemos utilizar adecuadamente. Para los gustosos de wargames, este es el secreto para hacer retos rapidos :P

Obviamente para estos procesos existen diversidad de programas, pero nosotros veremos 2 de los mas famosos.

Entender como trabaja este tipo de “file carving” sera escencial para nosotros, ya que con uso de programas como foremost o scalpel, tendremos 2 posibles tipos de resultados:

  1. Nos automatiza EXITOSAMENTE todo el trabajo de extracción de archivos agregados por la tecnica EOF.
  2. Nos lanza monton de Falsos Positivos.

Para entender esta cuestion sera necesario destacar que tanto foremost como scalpel, trabajan con archivos de configuracion; foremost.conf y scalpel.conf respectivamente.

¿Pero que contienen estos archivos?

 

Aparte de contener muchos comentarios en explicaciones, contienen una mini base de datos de Headers & Footers. Osease que este tipo de file carving se basa en la busqueda de cabeceras que estan definidos por una serie de bytes. Si la cadena de bytes se encuentra se busca si tiene un footer en dado caso y se guarda.

El de foremost luce de esta forma:

¿Limitaciones?

 

Bastantes puesto que si nuestra base de datos no contiene nuestro “Numero Mágico” (Firma de archivo en la cabecera) no sera identificado y por ende no sera descartado.

Ahora pasemos a ver 3 categorias. 1)El uso de foremost 2)El uso de Scalpel 3)Una limitacion y solucion propia

 

1)Foremost

 

El uso de foremost es muy sencillo, simplemente es pasarle de argumento el archivo a procesar y automaticamente se generara una carpeta llamada “output” que contendra los archivos encontrados y un fichero de texto llamado “audit.txt” que es el resumen del proceso.

1
foremost imagen.png

Foremost tambien tiene algunas opciones faciles como (-t TipoDeFichero) que nos permite definir que archivos nos interesa. -o que nos dice la carpeta destino, en este punto es importante definir que si se encuentra actualmente una carpeta “output” y volvemos a correr foremost, nos dara error y habra que definir otra carpeta destino.

Foremost es mi preferido por su facilidad, rapidez y eficacia :D

 

2)Scalpel

 

Scalpel a diferencia de foremost es un poco mas complejo de usar, puesto que tenemos que definirle ciertos parametros. Pero antes de empezar debo comentar que al hacer este tutorial visite la pagina de scalpel y me lleve una sorpresa al saber que hay una nueva version 2.0 liberada apenas en abril. Asi que recomiendo actualizar ya que la mayoria de distribuciones que la tienen contienen la version 1.6. Yo en mi gestor de paquetes no encontre scalpel actualizado, asi que desinstale y la compilacion fue sumamente sencilla.

1
./config && make

Bueno antes de utilizar scalpel a diferencia de foremost hay que modificar el fichero de configuracion (scalpel.conf) puesto que todo viene comentado y habra que descomentar los patrones.

Una vez realizada esta tarea veamos el uso basico de scalpel

1
scalpel -c scalpel.conf imagen.png

A diferencia de foremost, scalpel pide incluyas con el parametro “-c” el archivo de configuracion. ¿Me pregunto por que no lo hace por default? Y bueno al final nos crea una carpeta “scalpel-output” donde estara lo que encontro.

A mi parecer scalpel requiere de mas trabajo para funcionar correctamente a diferencia de foremost. Y mas aun no siempre eh obtenido los resultados deseados.

 

3)Ni scalpel ni foremost. Nuestro “carver casero”

 

En ámbitos forenses reales podemos encontrarnos con ciertos casos en los que un file carver es necesario para la automatizacion de extraccion de archivos, sin embargo podemos vernos ante una situación donde una persona agregue al final de un archivo, informacion extra PERO CIFRADA.

¿Cual es el problema?

Nuestro problema aqui es que al estar cifrado ninguno de los archivos de configuracion de nuestro “file carver” favorito tendra la secuencia de bytes para identificarlo. Esto se convertira en una exclusion inmediata y nosotros ni en cuenta de la existencia de esa informacion si no lo analizamos manualmente.

¿Aún no me creen?

Pongamoslo mas facil; si nosotros tenemos un archivo de texto y lo juntamos al final de un PNG, el file carver no lo detectara puesto que un texto puede iniciar de diferentes formas y por ende con diferentes bytes por lo que no sera identificado. Veamos el ejemplo con foremost y scalpel:

Foremost lo descarta automaticamente dejando solo la imagen y al final lo borro y scalpel no encontro nada (con la opcion -b recuperaria la imagen tal como esta, osease solo la copiaria). Pero ninguno de los 2 lo identifico como archivo de texto externo.

El problema es que SI NO SE ANALIZA MANUALMENTE no nos daremos cuenta de la existencia del mensaje. Ok ¿aun no se ve la relevancia de este problema? Veamos un ejemplo de lo que podria pasar:

Supongamos tenemos 50 imagenes png diferentes y 50 textos con mensajes supersecretos diferentes. Los tengo nombrados de la forma imagen1.png imagen2.png … imagen50.png y los textos igualmente mensaje1.txt …etc…

Si yo hago esto:

1
for i in {1..50};do cat imagen$i.png mensaje$i.txt > imagen$i.png;done

Con esto estoy adjuntando cada mensaje en la imagen y sustituyendo la imagen original por la esteganografeada.

Ahora le pasamos el file carver a cada archivo y en el caso de foremost excluira cada mensaje. Scalpel probablemente los dejara pero no nos alertara. Asi que podriamos tener 50 mensajes pasando delante del analista si solo se limita al uso de “file carver”. (Claro con un strings saldrian todos los mensajes)

¿Solución?

En este caso podemos hacer algo sencillo. En mi caso se me ocurrio un script que junto con foremost nos puede brindar grandes beneficios. Una vez se pasa foremost y se encuentra el archivo hace una comparacion de lo encontrado con el original, si hay diferencia de bytes lo recupera.

Para esto hare uso de este pequeño script que hice en python:

1234567891011121314151617
#!/usr/bin/env pythonimport syssteg = open(sys.argv[1],"rb").read()original = open(sys.argv[2],"rb").read()lensteg = len(steg)lenorig = len(original)if(lensteg!=lenorig):print "Inconsistencia en peso."print str(lensteg-lenorig)+" bytes sobrantes"sobrante = open("Sobrante.hex","wb")tmp=""for i in range(lenorig,lensteg,1):tmp+=steg[i]sobrante.write(tmp)sobrante.close()else:print "Archivos con Peso identico"

Ahora lo primero sera ocultar algo…Para este ejemplo usare un PDF y al final le agregare un texto de nuevo (Notese aqui podria ser un archivo cifrado). Después le paso foremost y me recuperara NADA MAS EL PDF. Y aqui sera el momento de usar el script ./carver.py pasandole como argumento1 el archivo esteganografeado y como argumento 2 el original(el recuperado por foremost).

12345
echo "Neobits.org Esta ocultando un mensaje super secreto ;)" >> algo.pdf foremost algo.pdf./carver.py algo.pdf output/pdf/00000000.pdf

Aqui ya nos dice que SI EXISTE una inconsistencia (55 bytes). Y se salvo en Sobrante.hex, ahora si vemos el peso de sobrante y vemos su contenido nos encontramos con:

Y Listo!!! Vemos que quedo de maravilla. Rapidamente pondre una serie de screenshots demostrando como recuperaria un archivo cifrado con 100% exito.

 

<Prueba Archivo cifrado>

1.-Imagenes2.-Cifrar katy2.png con un XOR ^0×203.-katy2.png cifrado4.-File carving con foremost5.-Recuperacion con ./carver.py6.-Xor ^0×20 para recuperar7.-Imagen recuperadaY como vemos todo salio a la perfección. Nos fue factible recuperar un archivo cifrado por medio de “File carving” aunque no estuviera definido por estructura el fichero =)

 

Sin extenderme mas espero este articulo les agradara y quedara claro el objetivo del articulo. Cualquier comentario Bienvenido.

Saludos ;)

Atte. hecky

hecky@neobits.org

Sigueme en twitter: http://twitter.com/hecky

3 comentarios:

  1. Al ejecutar el script en python (2.x) me encuentro con el siguiente error:"SyntaxError: Non-ASCII character '\xe2' in file file carving.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details"Al verificar ejecutando con python 3.x el siguiente:" File "file carving.py", line 3 steg = open(sys.argv[1],”rb”).read() ^SyntaxError: invalid character in identifier"Exelente el articulo como es costumbre :)

    ResponderEliminar
  2. Hola Renateitor:Mira el articulo original lo puedes encontrar en mi web http://neobits.org/?p=900El problema que te sale se debe que al copiarlo aqui, por cuestiones me supongo del CMS o algun plugin, modifico algunas cosas:1.-El error te sale en esta linea: steg = open(sys.argv[1],”rb”).read()Y aunque lo corrijas saldra tambien en la linea 4,8,9,10,11 y 17...Esto se debe a que si te fijas las comillas no son como deberian. Mira:Aqui aparece ” y debe ser "Solo debes cambiarlas. Y aunque arregles eso me supongo seguira un error por que tambien borraron la identacion (Osea que las tambulaciones para definir los IF y FOR los eliminaron.)

    ResponderEliminar
  3. [...] Hecky nos trae una interesante entrada sobre File Carving – Excavando en los ficheros [...]

    ResponderEliminar