Recuperar archivos eliminados usando Foremost (Linux)

¡Hola a todos! Hace un par de días perdí la partición donde tenía mi /home. Afortunadamente pude recuperar el 98% de los archivos que necesitaba. Es decir, en realidad no me interesaba recuperar imágenes, música, etc… lo único importante era recuperar los archivos PHP con los que había estado trabajando.

Aclaro esto puesto que esta entrada se va a enfocar en la configuración manual de Foremost, un programa para hacer carving, de tal manera que rescatemos solamente aquello que realmente nos interesa. Existen otros programas, pero este fue el que realmente me ayudó en esos momentos de pánico.

¿Cómo funciona? Foremost trabaja con imágenes generadas con dd o particiones directamente, y se basa en el análisis de encabezados y footers de los archivos para ‘extraer’ lo que se pueda salvar.

Importante: si has eliminado accidentalmente algún archivo lo primero, después de blasfemar un rato, es evitar hacer cualquier tipo de escritura de datos sobre la misma. Esto es porque tus datos en realidad aún están allí, y el único riesgo que tienen de ser eliminados es que se sobrescriban datos en el mismo sector en donde se encuentran.

Dicho esto, tienes dos opciones:

  • Si tienes otra partición con suficiente espacio para almacenar un backup de la partición a ser tratada, puedes usar el comando dd y luego trabajar sobre esa imagen. En esta entrada se explica con más detalle cómo hacer esto.
  • Si no tienes espacio (tal como me ocurrió a mi), puedes trabajar directamente sobre la partición (i.e. el archivo /dev/sdaX ó /dev/hdbX, etc.). Solo ten en mente que NO deberías montar dicha partición, al menos no en modo de lectura-escritura.

Instalación de Foremost

La instalación es bastante sencilla ya que Foremost se incluye en prácticamente todos los repositorios de cualquier distribución. Así que puedes usar tu gestor de paquetes preferido. Siendo tan sencilla la instalación por repositorios, solo me queda mostrar la instalación manual que es incluso más sencilla… descargamos la última versión deForemost (1.5.6 al momento de escribir esta entrada), descomprimimos, compilamos e instalamos:

wget http://foremost.sourceforge.net/pkg/foremost-1.5.6.tar.gz
tar xfzv foremost-1.5.6.tar.gz
cd foremost-1.5.6
make && make install

Ejemplo básico de uso de Foremost

El siguiente comando de ejemplo es un de los tantos cientos de miles que te encontrarás en la red… no me enfocaré mucho en este aspecto porque ya se encuentra muy bien documentado:

foremost -t pdf -i imagen.iso -o pdfs-recuperados

Básicamente le estamos diciendo al Foremost que busque archivos de tipo PDF en el archivo de imagen (creado con dd) imagen.iso y que los guarde en pdfs-recuperados. Lo único que nos interesa recalcar en este punto es que Foremost tiene un set de archivos predefinidos de los cuales conoce su header y footer (como los PDFs en este caso); este set se compone de los archivos más comunes (imágenes  y videos en diferentes formatos, archivos de office, zips, etc.) Pero… ¿qué pasa con otro tipo de archivos menos comunes? Tranquilo, ya vamos para allá ;)

Ejemplo de configuración del Foremost

Foremost puede ser configurado mediante un archivo (por defecto: /etc/foremost.conf) de tal manera que no tengamos que especificar el tipo de archivo a buscar y, lo que es mejor, podemos definir nuestros propios tipos de archivos. En nuestro ejemplo, te meterás en mis zapatos, te imaginarás que has perdido el trabajo de tres días y que tu objetivo es rescatar unos cuantosarchivos de PHP.

Entonces… ¿por donde comenzar? Bien… lo primero es echar un vistazo al archivo /etc/foremost.conf en donde puedes encontrar patrones de búsqueda para diferentes tipos de archivo (de hecho, son las que usa Foremost cuando usamos el flag -t). La sintáxis de estos patrones es sencilla y consta de una sola línea; esta línea tiene los siguientes parámetros separados por espacios o tabulaciones:

  • Extensión del archivo… ¿debo explicar esto?
  • Definir si se debe hacer distinción entre mayúsculas y minúsculas al buscar el header y footer del archivo. Pon ‘y’ si deseas que sea case-sensitive o ‘n’ en caso contrario.
  • Tamaño máximo del archivo.
  • Encabezado: lo que se debe buscar en los encabezados de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.
  • Footer (opcional): lo que se debe buscar al final de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.

Por ejemplo, este es uno de los que se encuentra configurados por defecto en el Foremost:

jpg y 20000000 \xff\xd8\xff\xe1 \xff\xd9

Básicamente busca archivos con extensión .jpg y con un tamaño máximo de 20000000 bytes. Además especifica uno de los posibles encabezados que un archivo tipo JPEG puede tener (\xff\xd8\xff\xe1) y su footer (\xff\xd9).

Como puedes ver, el encabezado y el footer pueden ser especificados en hexadecimal. Esto es bastante útil ya que en muchos casos no necesitamos simplesarchivos de texto sino que podríamos querer recuperar uno binario. En cualquier caso, es recomendable usar hexadecimal… pero ¿cómo se qué debo poner? Bien… recuerda que tu misión es recuperar losarchivos PHP, así que… ¿qué tal si creamos uno para ver cómo se ve en hexadecimal?

Creamos entonces un archivo con el siguiente contenido y lo guardamos como test.php:

1.<?php
2.if($meLoTire){
3. echo "o_O mode-panic:on";
4.}
5.?>

Ahora debemos abrir este archivo con algún editor hexadecimal. Si usas Gnome, Ghex es una buena opción (sino, también)… lo instalas desde los repositorios y con él abres el archivo que acabas de crear… este lucirá así:

ghex

¡Ahora ya podemos configurar Foremost como expertos, puesto que ya sabemos qué hexadecimales poner! Cada caracter del archivo que creamos equivale a un valor en hexadecimal y nos interesa enfocarnos en la representación hexadecimal de “<?php” puesto que así comienzan losarchivos en los que estamos interesados.

Así que para este caso, los hexadecimales son 3C, 3F, 70, 68 y 70. Por lo tanto podemos crear un nuevo patrón dentro de /etc/foremost.conf que luzca algo así:

php y 100000 \x3C\x3F\x70\x68\x70

Si queremos ser más precisos podemos especificar el footer:

php y 100000 \x3c\x3f\x70\x68\x70 \7da\3f\x3e

Fíjate que he definido un footer bastante concreto que hará que Foremost busque archivos que finalicen con un ‘}’ seguido de un ‘Enter’ (retorno de carro) y finalmente con “?>”. Una vez hayamos terminado de configurar los patrones conlos que queramos iniciar la búsqueda, guardamos y cerramos el archivo.

Puesto que es el archivo por defecto no es necesario especificarlo al momento de ejecutar Foremost. Esto por supuesto implica que puedes crear un archivo con patrones en cualquier otro lado, y en tales casos debes referencialo con el flag -c. ¡Que comience el carving!

foremost -i /dev/sda1 -o ~/recuperados/

Como puedes ver, no especificamos ningún tipo  de archivo así que Foremost se enfocará en aquellos configurados en el archivo .conf. Además, en este caso estamos especificando directamente la partición. Esto podría llevar un rato, así que tienes tiempo de leer algo entretenido ¿qué tal esta bonita guía sobre Vi? ¿o esta otra sobre un hermoso Gentoo/BSD?

Una vez Foremost haya terminado su trabajo… el tuyo apenas comienza. Aunque Foremost es un excelente programa, los resultados no pueden ser 100% confiables (¿hay algo que lo sea?). Y para empeorar las cosas, Foremost NO recupera los nombres de los archivos. En vez de ello, crea una secuencia de archivos numéricos con la extensión; cosas como 8392383874.php ó 239492782.php ¿chévere, no?

Todo parece que pasaremos un buen rato jugando con nuestro querido amigo GREP; y es que este maravilloso comando puede ser realmente útil en estos casos. Así que aquí van algunos comandos que te podrían servir:

  • grep busqueda changos.ext
    Busca la cadena ‘busqueda’ dentro del archivo changos.ext
  • ¿qué tal una búsqueda en todos los archivos? Esto podría servir para nuestro caso de los PHP:
    cat *.php | grep -l cosa_a_buscar
  • ¿y si queremos buscar un string en varios archivos que se encuentran en diferentes directorios? Este comando es de los que más uso a diario:
    find /ruta/ -exec grep -l cosa_a_buscar {} \;

Cosas por considerar

  • Existe una gran probabilidad que los datos recuperados no estén del todo bien formados. Por ejemplo, podrían tener “basura” dentro. Esto es posible de corregir enarchivos de texto, ya que solo necesitas un editor decente y un par de minutos para “ver qué te sirve”.
  • Si los archivos recuperados tienen basura dentro, es mejor usar editores de texto en consola que no se quejan tanto al momento de editarlos. Gedit simplemente no los abre.
  • Algunas veces los archivos quedan fragmentados; esto es, en un archivo recuperado queda una parte de lo que buscas, y en otro queda el restante. Por esto, es bastante útil que uses herramientas como Meld (excelente por cierto).  Considera este ejemplo de la vida real: en el archivo blablaa.php tenía parte inicial del archivo mientras que en blebelbel.php tenía el resto:

meld_640

Esto es difícil de notar ‘a ojo’, por lo que puedo decir que Meld me salvó el trasero una vez más (y de paso se ganó una donación). Así, combinando el trabajo de Foremost y la ayuda de Meld pude recuperar prácticamente todo lo que necesitaba.

Pero, te repito, si fuesen archivos binarios los que quieres rescatar la cosa sería mucho más difícil. En este caso, ‘la basura’ se puede identificar fácilmente dentro del archivo, y de la misma manera se puede eliminar. En una archivo binario sin embargo es un poco más difícil.

Otros buenos programas con propósitos similares

Fuente: Casi Diablo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: