Recuperar archivos eliminados usando Foremost [configuración manual]
¡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.
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 de Foremost (1.5.6 al momento de escribir esta entrada), descomprimimos, compilamos e instalamos:
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:
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 cuantos archivos 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 simples archivos 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 los archivos 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:
<?php
if($meLoTire){
echo "o_O mode-panic:on";
}
?>
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í:
¡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 los archivos 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 \7d\0a\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 con los 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!
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 en archivos 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:
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
7 Comentarios | deja el tuyo





No tenía ni idea de la existencia de esto y parece interesante, pero… si tienes una conexión a internet más o menos decente, ¿qué ventajas puede ofrecer sobre usar Dropbox? A mí también me salvó un par de veces que perdí archivos importantes.
Gracias por este genial artículo.
Muy bien documentado y expresado…
Hola!
@Jesus… casualmente ahora estoy usando dropbox con algunos archivos importantes (de hecho, los PHP que salvé)… y esta guía explica cómo tratar de arreglar las cosas en caso que no hayamos usado ese tipo de programas para tener todo en la nube y a salvo.
@elkaribou: gracias por tu comentario… siempre eres bienvenido a participar.
Un saludo!
Como siempre amigo, bien explicado todo.
No conocia esa herramienta, la tomare en cuenta de ahora en adelante, porque me ha tocado tener que recuperar archivos y particiones de algunos hard drivers.
Hola
Gracias recupere todos los archivos..
Saludos
a usar git la proxima vez con esos archivos
, gracias por el articulo