Foremost : petit outil de data recovery
Tout le monde connait les concours de circonstances malheureux. Une patte de chat qui se balade sur votre serveur et tape malencontreusement un rm -rf *.
Ou encore un collègue qui a fait tomber sa tartine sur le clavier, mêmes conséquences, la confiture en moins...
Évidemment, qui dit données importante dit sauvegarde, mais on n'est pas toujours conscient de l'importance des données, jusqu'à ce que le pire arrive.
Et bien, ça tombe bien ! Pourquoi ? Parce qu'il existe des outils faits pour ça ! Attention, que cela ne vous dispense pas d'une sauvegarde, mais il faut bien avouer qu'en attendant d'en mettre une, il faut d'abord les récupérer, ces données importantes.
Foremost est un outil de récupération de données, rentrant dans la catégorie data carving, qui fonctionne sur la base de la partition et du type de donnée à restaurer.
L'outil peut travailler sous tout type d'image disque, d'un dd jusqu'à une vrai partition.
Installation
Foremost a de grandes chances d'être disponible depuis les dépôts de votre Linux. Nous, nous allons l'installer depuis les sources. A l'heure où j'écris ces lignes, on en est à la version 1.5.7, alors que la version proposée par les dépôts est la 1.5.6. Remarquez, on a vu pire...$ wget http://foremost.sourceforge.net/pkg/foremost-1.5.7.tar.gz $ tar -zxf foremost-1.5.7.tar.gz && cd foremost-1.5.7/Le README nous dit de lancer un make plutôt que de passer par un ./configure, ce que nous faisons :
$ make gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c main.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c state.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c helpers.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c config.c config.c: In function ‘translate’: config.c:27: attention : valeur calculée n'est pas utilisée config.c:32: attention : valeur calculée n'est pas utilisée config.c:37: attention : valeur calculée n'est pas utilisée config.c:42: attention : valeur calculée n'est pas utilisée config.c:47: attention : valeur calculée n'est pas utilisée config.c:52: attention : valeur calculée n'est pas utilisée config.c:57: attention : valeur calculée n'est pas utilisée gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c cli.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c engine.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c dir.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c extract.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c api.c gcc -Wall -O2 -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 main.o state.o helpers.o config.o cli.o engine.o dir.o extract.o api.o -o foremost $ make install install -m 755 foremost /usr/local/bin install -m 444 foremost.8.gz /usr/share/man/man8 install -m 444 foremost.conf /usr/local/etcLa configuration se trouve donc dans /usr/local/etc. Il s'agit surtout de définir les types de données à récupérer.
# # Foremost configuration file #------------------------------------------------------------------------- # Note the foremost configuration file is provided to support formats which # don't have built-in extraction functions. If the format is built-in to foremost # simply run foremost with -t and provide the format you wish to extract. # # The configuration file is used to control what types of files foremost # searches for. A sample configuration file, foremost.conf, is included with # this distribution. For each file type, the configuration file describes # the file's extension, whether the header and footer are case sensitive, # the maximum file size, and the header and footer for the file. The footer # field is optional, but header, size, case sensitivity, and extension are # not! # # Any line that begins with a '#' is considered a comment and ignored. Thus, # to skip a file type just put a '#' at the beginning of that line # # Headers and footers are decoded before use. To specify a value in # hexadecimal use \x[0-f][0-f], and for octal use \[0-3][0-7][0-7]. Spaces # can be represented by \s. Example: "\x4F\123\I\sCCI" decodes to "OSI CCI". # # To match any single character (aka a wildcard) use a '?'. If you need to # search for the '?' character, you will need to change the 'wildcard' line # *and* every occurrence of the old wildcard character in the configuration # file. Don't forget those hex and octal values! '?' is equal to 0x3f and # \063. # # If you would like to extract files without an extension enter the value # "NONE" in the extension column (note: you can change the value of this # "no suffix" flag by setting the variable FOREMOST_NOEXTENSION_SUFFIX # in foremost.h and recompiling). # # The ASCII option will extract all ASCII printable characters before and after # the keyword provided. # # The NEXT keyword after a footer instructs foremost to search forwards for data # that starts with the header provided and terminates or is followed by data in # the footer -- the footer data is not included in the output. The data in the # footer, when used with the NEXT keyword effectively allows you to search for # data that you know for sure should not be in the output file. This method for # example, lets you search for two 'starting' headers in a document that doesn't # have a good ending footer and you can't say exactly what the footer is, but # you know if you see another header, that should end the search and an output # file should be written. # To redefine the wildcard character, change the setting below and all # occurances in the formost.conf file. # #wildcard ? # # case size header footer #extension sensitive # #--------------------------------------------------------------------- # EXAMPLE WITH NO SUFFIX #--------------------------------------------------------------------- # # Here is an example of how to use the no extension option. Any files # containing the string "FOREMOST" would be extracted to a file without # an extension (eg: 00000000,00000001) # NONE y 1000 FOREMOST # #--------------------------------------------------------------------- # GRAPHICS FILES #--------------------------------------------------------------------- # # # AOL ART files # art y 150000 \x4a\x47\x04\x0e \xcf\xc7\xcb # art y 150000 \x4a\x47\x03\x0e \xd0\xcb\x00\x00 # # GIF and JPG files (very common) # (NOTE THESE FORMATS HAVE BUILTIN EXTRACTION FUNCTION) # gif y 155000000 \x47\x49\x46\x38\x37\x61 \x00\x3b # gif y 155000000 \x47\x49\x46\x38\x39\x61 \x00\x00\x3b # jpg y 20000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9 # jpg y 20000000 \xff\xd8\xff\xe1 \xff\xd9 # jpg y 20000000 \xff\xd8 \xff\xd9 # # PNG (used in web pages) # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # png y 200000 \x50\x4e\x47? \xff\xfc\xfd\xfe # # # BMP # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # bmp y 100000 BM??\x00\x00\x00 # # TIF # tif y 200000000 \x49\x49\x2a\x00 # #--------------------------------------------------------------------- # ANIMATION FILES #--------------------------------------------------------------------- # # AVI (Windows animation and DiVX/MPEG-4 movies) # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # avi y 4000000 RIFF????AVI # # Apple Quicktime # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # mov y 4000000 ????????\x6d\x6f\x6f\x76 # mov y 4000000 ????????\x6d\x64\x61\x74 # # MPEG Video # mpg y 4000000 mpg eof # mpg y 20000000 \x00\x00\x01\xba \x00\x00\x01\xb9 # mpg y 20000000 \x00\x00\x01\xb3 \x00\x00\x01\xb7 # # Macromedia Flash # fws y 4000000 FWS # #--------------------------------------------------------------------- # MICROSOFT OFFICE #--------------------------------------------------------------------- # # Word documents # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # doc y 12500000 \xd0\xcf\x11\xe0\xa1\xb1 # # Outlook files # pst y 400000000 \x21\x42\x4e\xa5\x6f\xb5\xa6 # ost y 400000000 \x21\x42\x44\x4e # # Outlook Express # dbx y 4000000 \xcf\xad\x12\xfe\xc5\xfd\x74\x6f # idx y 4000000 \x4a\x4d\x46\x39 # mbx y 4000000 \x4a\x4d\x46\x36 # #--------------------------------------------------------------------- # WORDPERFECT #--------------------------------------------------------------------- # # wpc y 100000 ?WPC # #--------------------------------------------------------------------- # HTML (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) #--------------------------------------------------------------------- # # htm n 50000 # #--------------------------------------------------------------------- # ADOBE PDF (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) #--------------------------------------------------------------------- # # pdf y 5000000 %PDF- %EOF # # #--------------------------------------------------------------------- # AOL (AMERICA ONLINE) #--------------------------------------------------------------------- # # AOL Mailbox # mail y 500000 \x41\x4f\x4c\x56\x4d # # # #--------------------------------------------------------------------- # PGP (PRETTY GOOD PRIVACY) #--------------------------------------------------------------------- # # PGP Disk Files # pgd y 500000 \x50\x47\x50\x64\x4d\x41\x49\x4e\x60\x01 # # Public Key Ring # pgp y 100000 \x99\x00 # Security Ring # pgp y 100000 \x95\x01 # pgp y 100000 \x95\x00 # Encrypted Data or ASCII armored keys # pgp y 100000 \xa6\x00 # (there should be a trailer for this...) # txt y 100000 -----BEGIN\040PGP # # #--------------------------------------------------------------------- # RPM (Linux package format) #--------------------------------------------------------------------- # rpm y 1000000 \xed\xab # # #--------------------------------------------------------------------- # SOUND FILES #--------------------------------------------------------------------- # (NOTE THIS FORMAT HAS A BUILTIN EXTRACTION FUNCTION) # wav y 200000 RIFF????WAVE # # Real Audio Files # ra y 1000000 \x2e\x72\x61\xfd # ra y 1000000 .RMF # # asf y 8000000 \x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C # # wmv y 20000000 \x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C # # wma y 8000000 \x30\x26\xB2\x75 \x00\x00\x00\xFF # # wma y 8000000 \x30\x26\xB2\x75 \x52\x9A\x12\x46 # # mp3 y 8000000 \xFF\xFB??\x44\x00\x00 # mp3 y 8000000 \x57\x41\x56\45 \x00\x00\xFF\ # mp3 y 8000000 \xFF\xFB\xD0\ \xD1\x35\x51\xCC\ # mp3 y 8000000 \x49\x44\x33\ # mp3 y 8000000 \x4C\x41\x4D\x45\ #--------------------------------------------------------------------- # WINDOWS REGISTRY FILES #--------------------------------------------------------------------- # # Windows NT registry # dat y 4000000 regf # Windows 95 registry # dat y 4000000 CREG # # lnk y 5000 \x4C\x00\x00\x00\x01\x14\x02\x00\x00\x00\x00\x00\xC0\x00\x00 # chm y 100000 \x49\x54\x53\x46\x03\x00\x00\x00\x60\x00\x00\x00\x01\x00\x00 # cookie n 4096 id= # rdp y 4096 \xFF\xFE\x73\x00\x63\x00\x72\x00\x65\x00\x65\x00\x6E\x00\x20\x00\x6D # #--------------------------------------------------------------------- # MISCELLANEOUS #--------------------------------------------------------------------- # (NOTE THIS FORMAT HAS BUILTIN EXTRACTION FUNCTION) # zip y 10000000 PK\x03\x04 \x3c\xac # (NOTE THIS FORMAT HAS BUILTIN EXTRACTION FUNCTION) # rar y 10000000 Rar! # # java y 1000000 \xca\xfe\xba\xbe # # cpp y 20000 #include #include ASCII #--------------------------------------------------------------------- # ScanSoft PaperPort "Max" files #--------------------------------------------------------------------- # max y 1000000 \x56\x69\x47\x46\x6b\x1a\x00\x00\x00\x00 \x00\x00\x05\x80\x00\x00 #--------------------------------------------------------------------- # PINs Password Manager program #--------------------------------------------------------------------- # pins y 8000 \x50\x49\x4e\x53\x20\x34\x2e\x32\x30\x0dOK, on ne touche à rien dans la conf. Testons plutôt pour voir ce que foremost arrive à récupérer !
$ ls test.jpg $ rm -f test.jpgPour ceux qui ne s'en doutaient pas, foremost tourne en root, sinon, il vous balancera un joli Processing: stdin.
$ foremost -t jpeg -i /dev/sda3 Processing: /dev/sda3 |******************************]Les images retrouvées sont rangées sous un répertoire spécialement crée pour l'occasion : output/jpg/, et, croyez-moi, vous n'avez pas idée de tout ce qui transite sur le disque dur. La preuve, j'avais supprimé un jpg, j'en ai retrouvé 1881.
$ ls output/jpg/| head 20496384.jpg 20627472.jpg 20660444.jpg 20660513.jpgPar contre, la relance d'un foremost passera soit par la suppression du répertoire output, soit via l'option -T (timestamp).
Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus Audit File Foremost started at Mon Oct 18 18:19:39 2010 Invocation: foremost -t jpeg -i /dev/sda3 Output directory: /home/bux/foremost/output Configuration file: /usr/local/etc/foremost.conf ------------------------------------------------------------------ File: /dev/sda3 Start: Mon Oct 18 18:19:39 2010 1879: 553701224.jpg 131 KB 283495026688 1880: 562854256.jpg 10 KB 288181379072 [...] Finish: Mon Oct 18 18:23:53 2010 1881 FILES EXTRACTED jpg:= 1881 ------------------------------------------------------------------ Foremost finished at Mon Oct 18 19:23:53 2010Bien entendu, si l'on ne précise pas le type des objets à récupérer, Foremost rappatrie tout ce qu'il peut.
$ foremost -T /dev/sda3 Processing: /dev/sda3 |****************************[...] $ ls output_Mon_Oct_18_19_30_06_2010/ audit.txt dll exe jar mov ole ppt rif sxc vis xls avi doc gif jpg mp4 pdf pptx sdw sxi wav xlsx bmp docx htm mbd mpg png rar sx sxw wmv zipA noter que parfois, pour certains types de données, les données récupérées sont inexploitables telles quelles. C'est le cas du pdf par exemple. Il faudra donc composer avec les données récupérées, ce qui représente encore du temps avant de pouvoir retrouver définitivement ce que l'on a perdu.