Recuperando datos con foremost

Iniciado por MYokai, Diciembre 18, 2014, 06:44:06 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Diciembre 18, 2014, 06:44:06 PM Ultima modificación: Diciembre 18, 2014, 06:52:43 PM por ANTRAX
Debido a mi reciente "pérdida" y como me gusta estudiar lo que uso, he dedicido navegar y navegar para poder hacer esto.

Recuperar datos con... (Foremost)

Lo primero de todo... NO uses el dispositivo desde el que deseas rescatar datos,  absolutamente para nada, ni formatear, ni escanear con diversos softwares de recuperación, ni nada de nada, pues puedes correr el riesgo de dañar sectores o corromper archivos.


Para lo único que necesitamos ese dispotivo es para hacer una imagen en el ordenador y trabajar con ella con foremost.

Para crear la imagen usaremos la utilidad dd.

Abrimos el terminar y escribimos esto:

dd if=/dev/sdb of=/home/image.dd conv=noerror,sync

if = input file
/dev/sdb – Unidad a recuperar
of = output file
/home/image.dd – Imagen que se va a crear, (sobre la que trabajaremos)
conv=noerror,sync - Parámetro que indica al comando dd que ignore los errores y siga generando la imagen del dispositivo aunque se produzcan fallos

Dicho esto... explicamos algo sobre foremost:

Introducción


Es la más importante herramienta de consola para recuperar archivos basados en sus encabezados, pies de página, y las estructuras de datos internas. Este proceso se conoce comúnmente como carving. Foremost puede trabajar en archivos de imagen, tales como los generados por dd, SafeBack, Encase, etc, o directamente en una unidad. Los encabezados y pies de página se pueden especificar a un archivo de configuración o se pueden utilizar modificadores de línea de comandos para especificar los tipos de archivos integrados. Estos tipos incorporados miran las estructuras de datos de un formato de archivo dado, que permite una recuperación más fiable y rápida.

Originalmente desarrollado por la Oficina de la Fuerza Aérea de los Estados Unidos de Investigaciones Especiales y el Centro de Estudios de Seguridad de Sistemas de Información e Investigación. A pesar de que ha escrito para el uso de la ley, está disponible gratuitamente y se puede utilizar como un herramienta general de recuperación de datos. Todo se ha abierto al público en general.

Descarga en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Algunas pruebas de carving se pueden encontrar enNo tienes permitido ver los links. Registrarse o Entrar a mi cuenta, (Test 11 y 12).

Foremost: Misión principal... Recuperar archivos de una imagen de disco basado en los encabezados y pies de página especificados por el usuario. Utiliza el file carving.

Qué es el file carving??

El File carving lo podemos definir como el proceso de excavaciónde ficheros en búsqueda de mas ficheros agregados basándonos en su estructura. (Para una definición mas formal se puede consultar ForensicsWiki(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta). El uso de File carving en la esteganografía nos ahorrara mucho tiempo si lo sabemos utilizar adecuadamente. Obviamente para estos procesos existen diversidad de programas, pero nosotros veremos, de momento, foremost. Entender como trabaja este tipo de "file carving" será escencial para nosotros, ya que con el uso de este programa, 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 foremost trabaja con archivos de configuracion; foremost.conf

Qué contiene foremost.conf??

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 están 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.

Funcionalidad

Ante todo, está diseñado para ignorar el tipo de sistema de archivos subyacente y directamente leer y copiar partes de la unidad en la memoria del ordenador. Toma esas porciones de un segmento a la vez, y mediante un proceso conocido como la búsqueda de archivos, carving, esta memoria busca un tipo de encabezado del archivo que coincide con los que se encuentran en el archivo de configuración de Foremost. Cuando se encuentra una coincidencia, se escriben la cabecera y los datos siguientes en un archivo, deteniéndose cuando en cualquiera se encuentra un pie de página, o hasta que el límite de tamaño de archivo es alcanzado.

El archivo de configuración principal también permite que el usuario pueda personalizar los tipos de archivos que se pueden recuperar y permite el uso de comodines para la coincidencia de patrones.

Se basa en la cabecera del archivo y tipos de pie de página especificados en un archivo de configuración definida por el usuario.

Aunque un editor hexadecimal se puede utilizar para recuperar archivos, (y a veces puede ser la mejor opción), el uso de un editor hexadecimal puede ser tedioso si un gran número de archivos deben ser recuperados. Ante todo es útil como una herramienta de recuperación cuando se trata de archivos no fragmentados, porque la herramienta, en su forma actual, simplemente lee datos hasta que se cumple una condición para hace que se detenga la extracción de datos.

Foremost se utiliza desde la interfaz de línea de comandos, sin opción de interfaz gráfica de usuario disponible. Es capaz de recuperar tipos de archivos específicos, incluyendo jpg, gif, png, bmp, avi, exe, mpg, wav, riff, wmv, mov, pdf, ole, doc, zip, rar, htm, y cpp. Hay un fichero de configuración, (normalmente se encuentra en /usr/local/etc/foremost.conf), que se puede utilizar para definir los tipos de archivos adicionales.

Foremost se puede utilizar para recuperar datos de archivos de imágenes, o directamente de los discos duros que utilizan el ext3, NTFS, o sistemas de archivos FAT. Foremost también se puede utilizar a través de un ordenador para recuperar datos de iPhones.

Configurar los tipos de archivos

En cuanto al tipo de archivos con los que puede trabajar, ya hemos visto que se encuentran en /usr/local/etc/foremost.conf. Podemos editar este archivo para añadir más extensiones.

Por defecto, foremost puede recuperar los siguientes tipos de archivo:

jpg - Soporte para los formatos JFIF y Exif incluyendo implementaciones utilizados en las cámaras digitales modernas.
gif
png
bmp - Compatibilidad con el formato BMP de Windows.
avi
exe - Soporte para binarios de Windows PE, que va a extraer archivos DLL y EXE junto con sus tiempos de compilación.
mpg - Soporte para la mayoría de los archivos MPEG (debe comenzar con 0x000001BA)
wav
riff - Esto extraerá AVI y RIFF ya que utilizan el mismo formato de archivo (RIFF). nota más rápido que ejecutar cada uno por separado.
wmv - Nota También puede extraer -wma archivos, ya que tienen un formato similar.
mov
pdf
ole - Esto va a agarrar cualquier archivo utilizando la estructura de archivos OLE. Esto incluye PowerPoint, Word, Excel, Access y StarWriter
doc - Tenga en cuenta que es más eficiente que ejecutar OLE si desea ignorar todos los otros archivos ole.
zip - Nota es que va a extraer los archivos .jar así porque utilizan un formato similar. Abrir documentos de Office son archivos XML sólo zip'd para que se extraen también. Estos incluyen SXW, SXC, SXI y SX? para los archivos de OpenOffice indeterminados.
rar
htm
cpp - C de detección de código fuente, tenga en cuenta este es primitivo y puede generar documentos distintos de código C.
all - Ejecutar todos los métodos de extracción predefinidos. [Por defecto si no se especifica -t]

Podemos visitar No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, que contiene información sobre cientos de diferentes tipos de archivos, tipos de datos, hardware, detalles de la interfaz y todo tipo de otros datos de programación útil; algoritmos, código fuente, especificaciones, etc.

Cómo funciona 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.

Foremost tambien tiene algunas opciones faciles como -t, TipoDeFichero que nos permite definir que archivos nos interesa u -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, a menos que usemos el parámetro -T

Pero podemos vernos ante una situación donde una persona agregue al final de un archivo, informacion extra PERO CIFRADA. En ese caso, tendremos un problema, puesto que el archivo foremost.conf tiene la secuencia de bytes de identificarlo, por lo que lo excluiría de manera inmediata y no nos daríamos ni cuenta de la existencia de esa informacion si no lo analizamos manualmente.

Foremost lo descarta automaticamente dejando solo la imagen y al final lo borra, pues no lo identifica como archivo de texto externo. El problema es que, si no se analiza manualmente, no nos daremos cuenta de la existencia del mensaje.

Solución para esta situación??

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 con un pequeño script en python:

–----------------------------------------------------------------------------------------------------------------------

Código: python
#!/usr/bin/python

################################################################################
# Alexander Leary, Scott Fenwick, Melissa Parker
# April 2013
#
# Main file for carving program
# Requires carver_files and carver_partitions carving actions
# All three files require carver_common for database related tasks
################################################################################

import sys
import re
import argparse

import carver_files
import carver_partitions
import carver_common

################################################################################
# Function:      main_menu(image)
# Variables: image, choice, type, string, slice, start, stop 
# Launches all program functions by looping through and getting user input
################################################################################
def main_menu(image):
        while True:
                choice = raw_input("\
                \n\
                1. Open Database \n\
                2. Print Database Contents \n\
                3. Search Files Database \n\
                4. Carve File \n\
                5. Carve Partition \n\
                6. Exit \nSelection: ")

                if re.match('^Populate|1$', choice, re.IGNORECASE):
                        while True:
                                choice = raw_input("\t\t1. New Database \n\t\t2. Existing Database \nSelection: ")
                                if re.match('^new|1$', choice, re.IGNORECASE):
                                        db_info = carver_common.new_db(raw_input("Database Name? "))
                                        carver_common.insert_list_db(db_info,image)
                                        break
                                elif re.match('^old|existing|2$', choice, re.IGNORECASE):
                                        db_info = carver_common.open_db(raw_input("Database Name? "))
                                        break
                                else:
                                        print "Bad Input"
                elif re.match('^Print|2$', choice, re.IGNORECASE):
                        carver_files.query_files_table_db(db_info)
                        carver_partitions.query_partitions_table_db(db_info)
                elif re.match('^Search|3$', choice, re.IGNORECASE):
                        while True:
                                type = raw_input("\tType of Search? \n\t\t1. By Name \n\t\t2. By Disk Location \nSelection: ")
                                if re.match('^Name|1$', type, re.IGNORECASE):
                                        carver_files.query_name_db(db_info, raw_input("\nString to search for? "))
                                        break
                                elif re.match('^Inode|2$', type, re.IGNORECASE):
                                        carver_files.query_inode_db(db_info, raw_input("\nString to search for? "))
                                        break
                                else:
                                        print "Bad Input"
                elif re.match('^File|4$', choice, re.IGNORECASE):
                        while True:
                                type = raw_input("\tCarve By: \n\t\t1. By Name \n\t\t2. By Location \n\t\t3. File Number \n\t\t4. Back \nSelection: ")
                                if re.match('^Name|1$', type, re.IGNORECASE):
                                        string = raw_input("\nName to search for? ")
                                        carver_files.query_name_db(db_info, string)
                                        if re.match('^Yes|Y$', raw_input("\nContinue? "), re.IGNORECASE):
                                                carver_files.carve_file(db_info, image, string)
                                                break
                                elif re.match('^Inode|2$', type, re.IGNORECASE):
                                        string = raw_input("\nDisk Location to search for? ")
                                        carver_files.query_inode_db(db_info, string)
                                        if re.match('^Yes|Y$', raw_input("\nContinue? "), re.IGNORECASE):
                                                carver_files.carve_file(db_info, image, string)
                                                break
                                elif re.match('^Number|3$', type, re.IGNORECASE):
                                        string = raw_input("\nDB File Number to search for? ")
                                        carver_files.query_file_number_db(db_info, string)
                                        if re.match('^Yes|Y$', raw_input("\nContinue? "), re.IGNORECASE):
                                                carver_files.carve_file(db_info, image, string)
                                                break
                                elif re.match('^Back|4$', type, re.IGNORECASE):
                                        break
                                else:
                                        print "Bad Input"
                elif re.match('^Partition|5$', choice, re.IGNORECASE):
                        carver_partitions.query_partitions_table_db(db_info)
                        while True:
                                slice = raw_input("\tCarve By: \n\t\t1. By Name \n\t\t2. By Sector \n\t\t3. Back \nSelection: ")
                                if re.match('^Name|1$', slice, re.IGNORECASE):
                                        string = raw_input("\nPartition name? ")
                                        carver_partitions.query_partition_name_db(db_info, string)
                                        if re.match('^Yes|Y$', raw_input("\nContinue? "), re.IGNORECASE):
                                                carver_partitions.carve_partition(db_info, image, string)
                                        break
                                elif re.match('^Sector|2$', slice, re.IGNORECASE):
                                        start = raw_input("\nStart Sector? ")
                                        stop = raw_input("\nStop Sector? ")
                                        carver_partitions.carve_partition(db_info, start, stop)
                                        #query check input
                                        break
                                elif re.match('^Back|3$', slice, re.IGNORECASE):
                                        break
                                else:
                                        print "Bad Input"
                elif re.match('^Exit|6$', choice, re.IGNORECASE):
                        break
                else:
                        print "Bad Input"
                       
################################################################################
# Function:      main()
# Variables: image, original_digest, final_digest
# Hashes original file, opens the main menu, the checks the file hasn't been
# altered in any way.
################################################################################
def main():
       
        arguments = argparse.ArgumentParser()
        arguments.add_argument('-n','--nohash', help='Disable Image Hashing', action='store_true', required=False)
        arguments.add_argument('-i','--image', help='Pass Image Name', action="store", required=False)
        arguments.set_defaults(n=False, nohash=False, i="", image="")
        passed_arguments = arguments.parse_args()
       
        if passed_arguments.image != "":
                image = passed_arguments.image
        else:
                image = raw_input("\nImage Name? ")

        if not passed_arguments.nohash:
                original_digest = carver_common.hashfile(image)

        main_menu(image)
        if not passed_arguments.nohash:
                final_digest = carver_common.hashfile(image)
                if original_digest != final_digest:
                        print "\n\n\n Warning File Altered \n\n\n"
                else:
                        print "File Unaltered"
        return;

if __name__ == "__main__":
        main()

–----------------------------------------------------------------------------------------------------------------------

Este script hay que usarlo una vez pasado foremost con ./carver.py

Soltado el tostón...

A trabajar...


Me reitero en lo importante de crear un archivo de imagen con la utilidad dd, o con las aplicaciones EnCase y SafeBack.

Si el usuario crea un directorio de imagen, a continuación, copia la imagen y el archivo de configuración para ser analizados, a ese directorio.

Mientras se ejecuta foremost, se produce un archivo audit.txt, que contiene las opciones de línea de comandos usadas, información de la ruta y el nombre de la imagen. El nombre más importante se asigna al archivo recuperado, después mide a la imagen en la que se encuentra el archivo, y se muestra la longitud del archivo. La columna denominada "Interior" en el archivo de auditoría indica si el archivo recuperado se encontró fuera del inicio de un sector.

Para recuperar archivos completos, (suponiendo que todo el archivo sigua intacto), se debe prestar atención a los tamaños de los archivos especificados en el archivo foremost.conf. Por ejemplo, el tamaño máximo predeterminado para un archivo PDF es 100,000 bytes, y el valor predeterminado para un archivo html es 50,000 bytes. Se pueden ajustar los tamaños de los archivos en el archivo foremost.conf para producir una recuperación de los archivos PDF y html más grandes, y se puede utilizar la información en la columna "Encontrado en Byte" con la opción -s. Esto hace que sea fácil buscar a través de la imagen y realizar otra recuperación con el archivo PDF y html.

A los archivos que recupera foremost se les asignan nombres numéricos, a partir de 00000000, y agrega la extensión correspondiente.

Abrimos el terminal.

Instalamos foremost con apt-get install foremost

Tecleando foremost -h, para obtener visualizar la ayuda.

-V - Mostrar información de copyright, y sale
-t - especificar el tipo de archivo. (jpeg -t, pdf...)
-d - activar la detección bloque indirecto, (para sistemas de archivos de UNIX)
-T - Tiempo estampar el directorio de salida por lo que no tiene que borrar el directorio de salida cuando se ejecutan varias veces.
-i - especificar archivo de entrada, (por defecto es la entrada estándar)
-a - Escribir todas las cabeceras, No realiza ninguna detección de errores,(archivos dañados).
-b número - Permite especificar el tamaño del bloque utilizado en todo. Esto es relevante para la denominación de archivos y búsquedas rápidas. El valor predeterminado es 512. Ejemplo: foremost -b 1024 image.dd
-k número - Permite especificar el tamaño del fragmento utilizado en foremost. Esto puede mejorar la velocidad si tiene suficiente memoria RAM para ajustar la imagen. Reduce la comprobación que se produce entre trozos de la memoria intermedia. Por ejemplo, si tiene> 500 MB de RAM. es decir. foremost -k 500 image.dd
-w - Sólo escribe el archivo de auditoría, no escribe ningún archivo detectado en el disco
-o - configurar el directorio de salida, (por defecto de salida).
-c - archivo de configuración listo para usar, (por defecto foremost.conf).
-s número - Se salta bloques de números en el archivo de entrada antes de comenzar la búsqueda de cabeceras. es decir. foremost -s -t 512 jpeg -i / dev / sdb.
-q - activar el modo rápido. La búsqueda se realiza en límites de 512 bytes. El modo rápido no debe utilizarse al examinar los sistemas de archivos NTFS, porque NTFS almacena archivos pequeños dentro de la tabla maestra de archivos.
-Q - activar el modo silencioso. Suprime los mensajes de salida.
-v - modo detallado. Registra todos los mensajes en pantalla.
-n - no hace distinción entre mayúsculas y minúsculas al buscar el header y footer del archivo.
-y - hace distinción entre mayúsculas y minúsculas al buscar el header y footer del archivo.

El modo de uso es:

foremost[-h][-V][-d][-vqwQT][-b<blocksize>][-o<dir>] [-t<type>][-s<num>][-i<file>]

foremost -t tipos-de-datos-a-rescatar -i de-donde-rescatar -o donde-dejar-lo-rescatado

Pero mejor lo vemos con unos ejemplos:

Buscar jpeg saltando los primeros 100 bloques

foremost -s 100 -t jpg -i image.dd

Sólo genera un archivo de audit y lo imprime en pantalla

foremost -av image.dd

Busca todos los tipos definidos

foremost -t all -i image.dd

Busca gif y pdf's

foremost -t gif,pdf -i image.dd

Busca documentos de office y archivos jpeg en un sistema Unix

foremost -vd -t ole,jpeg -i image.dd

Se ejecuta con todas las opciones por defecto

foremost image.dd

Otros ejemplos:

foremost -i /home/image.img

foremost -i /home/image.img -o /home/recuperados

foremost -a -i /dev/sdb -o /home/recuperados

foremost -t all -i /dev/sdb -o /home/recuperados

foremost -t jpeg -i /dev/sdb

foremost -t pdf -T -i /dev/sdb

foremost -b 1024 image.dd

foremost -k 500 image.dd

foremost -s -t 512 jpeg -i / dev / sdb

./carver.py unfichero.algo output/directorio/00000000.algo

Podeis descargar No tienes permitido ver los links. Registrarse o Entrar a mi cuenta de

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Y aquí algunos documentos que encontré de interés:

Thesis – An analysis of disc carving techniques No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Full Circle Issue 59 – Foremost No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Analysis of 2006 DFRWS forensic carving Challenge No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Advanced Carving No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Forensics with Linux No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos y espero que os guste y os sea de utilidad esta información.

PD: Pido perdón si hay algo que no se entienda bien, pero mi inglés no es muy técnico, y la mayoría del material que he encontrado está en inglés, por lo que las traducciones tampoco lo son. Lo siento... no soy bilingüe  :'(

Igulamente pido perdón por no poner bibliografías ni referencias, pero han sido muchos los sitios a los que he recurrido en búsqueda de información útil.
Scanned today; Hacked tomorrow.

Excelente aporte bro!! Me viene muy bien!
Muchisimas gracias!!
Saludos!
ANTRAX


Lastima que este post lo vi tan tarde. quizas me hubiera salvado de algunas infecciones que tuve en los ordenadores de la empresa y perdieron toda la data.

Gracias por tal aporte !!!! te pasaste.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Esto es solo para linux o vale en windows?.