Recientemente, me encontraba terminando un script en bash, realizando pruebas para comprobar que estaba funcionando correctamente cuando, tras realizar unas modificaciones al script y volver a lanzarlo, comenzó a ejecutarse un borrado recursivo de los ficheros de la máquina, el temido ‘rm -rf‘. La típica ‘noobada‘ que esperas que nunca te ocurra sucedió.
Afortunadamente, el script se estaba ejecutando en una máquina virtual de pruebas como usuario no privilegiado, por tanto la máquina seguía estando operativa. Gracias a estas medidas de precaución pude comprobar el alcance de la broma y ver que todo el directorio /home del usuario se había borrado. Dicho directorio contenía el script que estaba escribiendo de modo que, se podría decir, que el script se había fagocitado a sí mismo, llevándose con él unas cuantas horas de trabajo.
Lógicamente, antes de dar por perdido el trabajo decidí probar con alguna herramienta de análisis forense que me permitiese recuperar, si no la totalidad, al menos parte del código que llevaba escrito.
Tras algunas consultas decidí probar con la herramienta Scalpel. Se trata de una herramienta de código abierto, basada en Foremost y disponible tanto para entornos Windows como para Linux/Mac OS. Su uso es muy sencillo, pero para explicarla e ilustrar el caso, supongamos que el script que estábamos buscando era el siguiente:
#!/bin/bash function borrarFichero { rutaFichero=$(pwd)/$1 if [ -e $rutaFichero ]; then echo "$(date +%s) $rutaFichero borrado" >> $logFile echo "rm -rf $rutaFichero" else echo "No se puede encontrar el fichero" exit 1 fi } function main { borrarFichero $1 } logFile=/home/saw/var/log/borrados.log # Empezamos main $@
Este script elimina un fichero o directorio, y registra la fecha de borrado en un fichero de log. Aunque el script es muy simple y su propósito bastante absurdo, espero sirva para introducir el uso de la herramienta.
OJO: No ejecutes este script a no ser que entiendas lo que hace. Podrías perder información importante.
Supongamos ahora que, estando ubicados en el directorio /home/saw, lanzamos el script olvidándonos pasar como argumento el nombre del fichero que queremos borrar. El típico error de ejecutar comandos con prisas que, en este caso, conlleva el borrado del home del usuario saw.
Que no cunda el pánico. Instalamos la herramienta Scalpel y pasamos a modificar el fichero de configuración ubicado en /etc/scalpel/scalpel.conf
Como se ve en la imagen anterior, el fichero de configuración de Scalpel comprende varios ejemplos de uso que pueden activarse o desactivarse descomentando la línea en cuestión. Tomemos como ejemplo la línea definida para recuperar ficheros htm:
htm n 50000 <htm </html>
donde
- htm: extensión de los ficheros que queremos recuperar
- n: ‘n‘ si no queremos que la búsqueda sea sensible a mayúsculas, ‘y‘ para que sí lo sea
- 50000: tamaño en bytes. Scalpel dividirá la imagen del disco sobre el que se realizará la recuperación, en porciones de este tamaño y busca en ellas la ocurrencia de las cabeceras y el pie. Si las encuentra, en una segunda pasada trata de reconstruir los ficheros delimitados por estos campos.
- <html: header o cabecera que debe estar contenida en los ficheros que queremos recuperar.
- </html>: footer o pie, debe estar contenido en el fichero. Este campo no es obligatorio pero si se incluye permite acotar mejor las búsquedas.
Se da la circunstancia que suelo estructurar los script de la misma manera que el que presento como ejemplo así que si nos fijamos más arriba, vemos que es bastante fácil adaptar la directiva anterior para ficheros htm, y crear una propia para tratar de recuperar nuestro script perdido. Así pues llegamos a lo siguiente
sh y 10000000 #!/bin/bash #\ Empezamos
Creamos una carpeta para almacenar los ficheros recuperados y ejecutamos Scalpel sobre la partición de interés (en nuestro caso la que contenga el /home), mediante la siguiente instrucción:
Como podemos ver, la herramienta ha extraído 28 ficheros.
Por último queda acceder al directorio de salida, y comprobar si, efectivamente, hemos podido recuperar el script. En este caso hemos tenido suerte y haciendo un less del primer fichero comprobamos que hemos podido recuperar el código, aunque tendremos que eliminar algo de contenido basura que se encontraba a continuación del footer.
En otras ocasiones, habrá que hacer algo de trabajo mediante greps o incluso probando a ejecutar de nuevo Scalpel definiendo distintos tamaños y delimitadores. Como siempre es recomendable leer la documentación de la herramienta y explorar las distintas directivas que vienen pre-configuradas, pues nunca se sabe cuándo puede ocurrir un nuevo ‘rm -rf‘.
You could certainly see your skills in the work you write.
The world hopes for more passionate writers such as you who aren’t afraid to
mention how they believe. Always follow your heart.