lunes, 7 de febrero de 2011

Recuperando Archivos Borrados. Parte I.

 Nos ha pasado a todos. Borramos el archivo equivocado, en el momento menos apropiado. ¿Cómo recuperarlo? Existen muchos programas con interfaz gráfica para recuperar archivos eliminados para el sistema operativo Windows. Sin embargo, no existen tantos programas similares para el sistema operativo Linux. Esta situación, aunado a los últimos cambios en los sistemas de archivos de Linux puede hacer que el proceso de recuperación sea algunas veces hasta frustrante.

En realidad, la posibilidad de recuperar archivos eliminados en Windows es en cierta manera mayor que en Linux. La diferencia se debe a que la eliminación de metadatos es actualmente relativamente más frecuente en los sistemas de archivos de Linux que en NTFS de Windows por ejemplo. En consecuencia, el procedimiento en Linux se hace un poquito más involucrado pues no se cuenta con la estructura del nombre de archivo y en muchos casos tampoco con la estructura de los metadatos.

Supongamos el siguiente escenario: Escribimos el archivo con la respuesta a la vida, el universo y a todo:
$ cat > respuesta_absoluta.txt
La respuesta a la vida, el universo y a todo es: cuarenta-y-dos.
^D
$ ls respuesta_absoluta.txt
respuesta_absoluta.txt
$

Perfecto, ahi esta nuestro archivo con la respuesta a la pregunta sobre la vida, el universo y absolutamente todo. Definitivamente un archivo muy importante. Sin embargo:

$ rm resp*
$

Oh no! mi expresión regular ha eliminado todos los archivos que comienzan con "resp" incluendo la respuesta a la vida, el universo y a todo! ¿Qué podemos hacer?

Para comenzar a recuperar archivos en Linux, el primer requisito es el fabuloso paquete de utilidades "The Sleuth Kit". Existen diversos paquetes de instalación para distintas distribuciones de Linux. Por ejemplo:

En Fedora:
yum install sleuthkit
En Debian:
apt-get install sleuthkit
Etc.

Específicamente, estaremos usando principalmente las utilidades icat y ifind del sleuthkit y la utilidad strings de casi todas las distribuciones de linux.

El primer paso es localizar la unidad de datos que almacenaba nuestro archivo. Como ya no existe la estructura de nombre del archivo eliminado, es necesario buscar algo distintivo en el contenido de mi archivo. En ese caso ejecutamos el comando:

$ strings -a -n 13 -t d /dev/sda1 | grep 'cuarenta-y-dos'

En donde /dev/sda1 es la particion en donde se encontraba nuestro archivo y la cadena "cuarenta-y-dos" es el string que nos interesa.

Afortunadamente, la respuesta a la vida, el universo y a todo es muy particular, de lo contrario estariamos revisando cadenas de caracteres por 7.5 millones de años y los ratones se comerían nuestros datos. Este comando, sin embargo, puede demorarse un buen tiempo dependiendo del tamaño de nuestro disco duro. Pero en todo caso, mucho menos que 7.5 millones de años.
...
125829120 La respuesta a la vida, el universo y a todo es: cuarenta-y-dos.
^C
$

El numero que arroja el programa strings es la posicion en bytes en el disco en donde se encuentra nuestra cadena de caracteres. El siguiente paso es determinar la unidad de almacenamiento que corresponde a esa posición. Como usualmente el tamaño de los bloques/clusters es de 4KB,simplemente necesitamos dividir 125829120 entre 4096. Sin embargo, podemos el verificar el tamaño de los bloques con este comando:

$ fsstat /dev/sdb1 | grep -i block\ size
Block Size: 4096
$

Ahora, podemos usar una calculadora para hacer la división como han malacostumbrado a los niños de hoy en día, o podemos hacerlo usando la linea de comando como "la escuela vieja":

$ echo '125829120/4096' | bc
30720
$

Este número (30720) nos dice en qué bloque se encuentra la información que deseamos. En el peor de los casos con esta información podemos recuperar por lo menos parcialmente nuestra información:

$ blkcat /dev/sdb1 30720
La respuesta a la vida, el universo y a todo es: cuarenta-y-dos.
$

Esta solución puede no ser suficiente si el archivo que recuperamos es mayor a 4096 bytes y si existe mucha fragmentación en el disco. En esos casos, y si hay suerte, sólo nos hace falta encontrar el inodo al cual pertenece este bloque y asi conseguir toda nuestra información:

$ ifind -d 30720 /dev/sdb1
12
$

Eureka! Este es el número (12) que necesitabamos. Ahora simplemente, si nuestro disco tiene suficiente espacio en blanco, y el archivo que vamos a recuperar es lo suficientemente pequeño, podemos simplemente:

$ icat /dev/sdb1 12 > resucitada_respuesta_absoluta.txt
$ cat resucitada_respuesta_absoluta.txt
La respuesta a la vida, el universo y a todo es: cuarenta-y-dos.
$

EEl último comando desafía las "buenas práticas" pues estamos recuperando un archivo y escribiendo sobre el mismo dispositivo bajo análisis. Pero en el caso de la vida, el universo y todo se pueden romper alguna que otra regla. En las situaciones en donde el archivo sea muy grande o que no exista mucho espacio libre en el disco analizado es mas recomendable recuperar la información  en un disco alterno.

Lamentablemente, en casi cualquier distribución de Linux moderna, el penúltimo paso no será existoso porque la información del inodo será eliminada al borrar el archivo. En estos casos es necesario utilizar técnicas más avanzadas de forensica digital que serán el tema de futuros artículos.

No hay comentarios:

Publicar un comentario en la entrada