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/etc

La 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\x0d
OK, 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.jpg
Pour 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.jpg
Par 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 2010
Bien 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        zip
A 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.

Conclusion

Foremost est donc un outil puissant et très simple d'utilisation, pour peu que vous ayez des types classiques de données, après quoi il vous faudra sûrement parfaire la configuration afin d'élargir le panel des objets potentiellement récupérables. Par contre, comme tout outil de récupération de donnée, si vous aviez beaucoup perdu, il y aura pas mal de travail en aval. Encore une occasion de balancer la proposition d'un système de sauvegarde fiable :)
Vus : 3077
Publié par K-Tux : 59