Récupération de données après suppression (grep et dd)

Plop à tous …

Aujourd’hui forensic ;), le but est de récupérer des données supprimées (via rm ou d’autres commandes ‘NON destructive’ de type shred). La version longue et en anglais de ce que je vais raconter là.

Pour ceux qui l’ignorait (comme moi), avec grep il est possible de forcer une recherche texte sur des données brutes (y compris des disques dur donc), ce qui peut permettre de récupérer des données après suppression … comme c’est une recherche texte, vous imaginé bien qu’il ne peut s’agir uniquement de fichier texte du style la configuration de votre serveur apache, la sauvegarde du dump sql de la semaine (repiqué de l’article fournit en lien ;)).

Donc n’imaginez pas récupérer des images avec ça (regarder plutôt du côté de foremost ou photorec).

Côté commande donc, il suffira de grep et de dd, installé par défaut sur toute bonne distrib unix.

Pour le grep, il suffit de rajouter le paramètre -a (ou –binary-files=text), le paramètre b pour afficher les bytes, puis de spécifier le fichier brut de données (image extraite par dd, ou un /dev/ directement).

Pour l’exemple, j’ai supprimé mon fichier xorg.conf (aaaarrrrggggghhh Nannn), connaissant la structure du fichier, et sachant qu’il se trouvait dans mon /dev/sda2, je peux lancer la commande suivante :

sudo grep -a -b 'Section "Monitor"' /dev/sda2 > ~/xorgRecup

Dans le fichier xorgRecup
J’aurais une ligne de type (byte de l’emplacement:texte trouvé) :

1756337329:Section "Monitor"

Si je veux récupérer les lignes suivantes et précédentes, je peux jouer avec le paramètre -A m (after) et -B n (before) de grep, qui me renverront les m lignes après ou les n lignes avant ma recherche, mais comme j’ai déjà récupéré l’emplacement sur mon disque dur en bytes, je peux directement extraire mon fichier via dd (avec plus ou moins de précision … surtout moins en fait ^^).

Mais il faut tout d’abord savoir combien de bloc il faut skip lors de la récupération de notre fichier avec dd.

On divise donc le nombre de bytes trouvés par grep (chez moi 1756337329) par le nombre de bytes par block pour notre système de fichier, chez moi : 512. Ce qui donne pour mon exemple : 1756337329 / 512 = 3430346, puis il faut rajouter 63 (c’est le nombre de secteurs par tête, mais ça dépend aussi de l’emplacement de votre recherche, si il est en début ou en fin de cylindre, donc + ou – 63).

Mon dd ressemble à ceci :

sudo dd if=/dev/sda2 of=testReco skip=3430409 count=1000 bs=512

et au final, j’ai un fichier assez crade de 500Ko, qui contient à quelques lignes près mon fichier xorg … Je suis sauvé!!!!

Certes, j’aurais pu reconfigurer mon xorg, mais là n’était pas la question 😉 …

Pour des fichiers textes, la récupération des données n’est pas aussi complexe que je le pensais …
Mais sur des SF de types ext3 et ext4, il faut procéder à la récupération des données extrêmement vite, car les octets libérés sont déclarés libre et risque d’être utilisé dès l’écriture d’un nouveau fichier, et dans ce cas, les données seront irrécupérable …