Outils d'utilisateurs

Outils du Site


copie_support

Ceci est une ancienne révision du document !


Copie du support

commande dd

dd if=/dev/sdx of=image.dd bs=512 conv=noerrors,sync

Cette commande va copier l'intégralité du disque sdx dans le fichier image.dd.

  • bs=512, taille des blocks du disque, si non mentionnée, dd prend la valeur de la taille des blocks par défaut.
  • conv=noerrors,sync dd ne s'arrêtera pas en cas d'erreur de lecture sur un block. Après plusieurs essais, il s'avère que dd s'interrompt en cas de block défectueux sur un disque en panne… Doit-on différencier un block défectueux d'une erreur de lectrue de block?

commande dc3dd

Contrairement à dd et à dcfldd, dc3dd ne s'interrompt pas quand elle essaie de lire un secteur défectueux. la commande lancée:

dc3dd if=/dev/sdx hofs=image.111 split=10G verb=on hash=md5 log=dc3dd.log hlog=md5.log
  • if comme dd, la source, dans le même principe que hofs, il existe hifs
  • hofs: la sortie, avec calcul de hash
  • split: En cas de découpage de fichier, définit la taille de chaque partie. Avec un split de 10G, une image de 5OOGO donnera 50 fichiers.
  • splitformat:image.111, format du nom des fichiers. Voir plus bas
  • verb: verbosité
  • hash: format de hash, il est possible de mettre sha1 ET md5, ex: hash=md5,sha1
  • log: emplacement du fichier de log
  • hlog:emplacement du fichier contenant les hashs
  • il existe errlog…

Une option hashwindow permet de calculer le hash à intervalle régulier. Il est intéressant de la mettre à la même valeur que split pour obtenir ainsi le hash de chaque partie de l'image.

Certaines docs mentionnent progress=on, ma version ne reconnaissait pas cette option.

111 donnera 001,002, etc…
000 donnera 000,001,002, etc…
aaa donnera aaa,aab,aac,etc…

Après nommage des fichiers avec comme format 1111, autopsy v3 ne reconnait pas l'image splittée. Il faudra revenir à un format à 3 caractères. Par contre, autopsyv2 n'a pas eu de difficultés à retrouver les fichiers au format 1111.

dc3dd possède une option qui permet d'accéder directement au disque sans être contraint par le kernel caching.

iflag=direct

Avec conv=noerror,sync iflag=direct, dc3dd permet une récupération plus fine des erreurs sur un disque. Voir ddrescue pour plus de détails.


commande dcfldd

La version utilisée actuellement est la v1.3.4-1. Il s'avère que comme dd, la commande s'interrompt an cas de bloc défectueux. Certains évoquent un bug de cette version, d'autres évoquent que, parce que dcfldd est un fork de dd, il se comporte comme la commande dd.


commande ddrescue

La commande ddrescue entre plus dans un cotnexte de récupération de données que de forensics pur. D'autant plus, que cette commande est utilisée en cas d'erreurs sur un disque et que de ce fait, la copie exacte du disque ne peut plus être garantie.

ddrescue va en premier lieu se concentrer sur les secteurs saints du disque, pour ensuite revenir sur les erreurs et tenter de les lire et d'en extraire les données. Cette stratégie est bien sûr paramétrable via les options de ddrescue.

La principale force de cet outil est sa capacité à reprendre son traitement après une interruption quelconque. Ceci est possible grâce aux fichiers de logs créés pendant le processus.

commande de base:

ddrescue /dev/sdx image.ddrescue log.txt

/dev/sdx est la source, image.ddrescue la destination et log.txt le fichier de logs. Ce fichier de logs sera rempli en renseignant les blocks de datas lus et leurs états:

#      pos       size status
0x00000000 0x14580200 +
0x14580200 0x28852000 ?

Les différentes valeurs de “status”:

  • ? nontried
  • * bad area non trimmed
  • / bad area non split
  • - bad hardware block(s)
  • + finished

Pour relancer la commande à partir de son point d'arrêt, il suffit de la relancer à l'identique:

ddrescue /dev/sdx image.ddrescue log.txt

Pour récupérer le plus de données possibles, il faudra relancer pluqieurs fois ddrescue. La première fois, il sera possible de l'éxécuter sans tenter de lire les erreurs:

ddrescue -n /dev/sdx image.ddrescue log.txt
  • -n: empêche ddrescue de revenir sur les erreurs

ceci fait, un fichier de logs est constitués avec les zones saines, et les zones en erreurs marquées par *.

En deuxième lieu, cette commande permettra à ddrescue de tenter de lire les secteurs en erreur (marqués /) 3 fois avant de les marquer ”-” ou “bad” .

ddrescue -r3 -d /dev/sdx image.ddrescue log.txt
  • -r3: relis les erreurs 3 fois avant de les marquer bad.
  • -d: permet d'accéder au disque directement sans passer par le cache Kernel. La différence est visible dans le fichier de logs. Sans -d, le fichier présentera par exemple 15 errors, avec une taille globale de ces erreurs de 61440 octets, soit 4096 octets par erreur. La logique voudrait que la taille globale des erreurs soit de 15*512=7680 octets. En ajoutant cette option, on permet à ddrescue un “accès direct” au disque et de tenter de récupérer plus finement les données présentes.

une fois cette commande finie, le fichier de logs doit présenter des positions soient marquées + “finished” ou - “bad”:

0x38684000 +
# pos size status
0x00000000 0x32B77800 +
0x32B77800 0x00000200 -
<snip>
0x38684000 0x00000200 -
0x38684200 0x14013E00 +

Cet extrait montre l'état final des secteurs, et surtout, la size des positions est bien de 512 octets (0x00000200).

pour finir, il est possible de définir à ddrescue avec quel caractère il doit remplacer les erreurs, cela permet de discriminer les zéros normaux des zéros mis pour remplacer les erreurs.


à travers le réseau

Peu importe l'outil utilisé, le principe est le même. Une image disque sera faite à partir d'un OS embarqué sur le pc à analyser. L'image, au lieu d'être enregistré localement, sera envoyé svia le réseau dans un fichier ouvert sur un pc tiers. Le pc considéré comme client est le pc à analyser. Le pc qui acueillera l'image sera le serveur. Le transfert de l'image sera faite via l'outil netcat (nc).

Côté serveur: On place ce poste en écoute:

nc -l -p 2525 | dd of=/net_image.dd
  • -l: place nc en écoute
  • -p 2525: port TCP en écoute

La commande nc est pipé à dd, cela implique que tout ce qui arrive dans nc via le réseau sera renvoyé dans dd.

Côté client:

dd if=/dev/sda | nc 192.168.55.20 2525

La commande dd est pipé à nc, tout ce que dd va lire, il va le renvoyer à nc.

Au final, on retrouve notre commande dd, la seule différence est qu'elle passe par un tunnel nc.


La gestion des secteurs défectueux

Lors de la copie octet par octet d'un disque, il est possible de tomber sur une erreur. Il faut garder à l'esprit qu'à chaque tentative d'accès à un secteur défectueux, il y a des chances de corrompre ceux alentours. Ceci dit, dd, dcfldd proposent l'option conv=noerror,sync. Elle permet à la commande de ne pas s'interrompre quand elle rencontre une erreur. De ce fait, il y a un risque d'abîmer encore un peu plus un disque déjà défectueux et cela autant de fois qu'il va rencontrer une nouvelle erreur. dc3dd, en cas d'erreur, essaie de la corriger et continue même en cas d'échec.

Il est conseillé d'utiliser ces trois commandes sans ces options et ainsi de l'interrompre en cas d'erreurs. Par la suite, il conviendra d'utiliser ddrescue pour, dans un premier temps récupérer le plus de données possibles et seulement après se concentrer sur les erreurs.

Les erreurs sur disque vont également modifier la gestion des hashs calculés.

md5sum /dev/sdx

Cette commande retournera certainement une erreur à cause des blocs défectueux présents sur la source. Il faudra donc calculer le hash en entrée et en sortie de commande.

De plus, l'image obtenue ne sera pas la copie exacte de la source à cause des erreurs qui seront remplacées par des zéros ou autres caractères.

Ré-assembler une image splittée

cat image.split.0* > image.dd

C'est utile si on souhaite calculer le md5 de l'image splittée obtenue.

cat image.split.0* | md5sum

Hash:

Le calcul du hash d'un disque en analyse et la partie la plus délicate et la plus sensible. Dans une logique forensic, il est indispensable de conserver l'intégrité de la preuve. Pour cela, le calcul du hash permetra à posteriori de prouver qu'aucune modification n'ait été apportée au support confié.

Plusieurs cas se posent alors:

  • Le cas où le support est sain et la calcul du hash est réalisable sur le support.
  • Le deuxième cas abordé plus haut, et celui où le support est défectueux, auquel cas un calcul sur le support sera impossible. De plus, un trop grand nombre de lectures sur ce support risquerait de l'endommager encore.

La commande dc3dd (et aussi les autres) propose le calcul du hash en entrée de processus ET en sortie de processus. De plus, une dernière comparaison du hash en le calculant sur l'image obtenue permet un suivi et une preuve “suffisante” pour des autorités. Cependant, peut-on considérer que le calcul d'un hash en entrée et sortie de process puisse certifier la non-modification des données traitées, je n'ai rien trouvé la dessus.

Calcul du hash sur support sain

Le hash du fichier disque /dev/sdx
md5sum /dev/sdx

x: étant la lettre du disque en cours

  • Le disque ne DOIT pas être monté car dans ce cas, on perd le bénéfice de la preuve, et la pièce est corrompue.
  • Ne marchera pas si le disque présente des blocks défectueux.
Calcul du hash pendant la copie
dc3dd hif=/dev/sdx hof=image.111 split=10G verb=on hash=md5 log=dc3dd.log hlog=md5.log
Vérification du hash
cat image.* | md5sum

Ces trois commandes devraient donner le même résultat.

Calcul du hash sur support défectueux

Le hash du fichier disque /dev/sdx
md5sum /dev/sdx

x: étant la lettre du disque en cours

Cette commande retournera une erreur d'entrée/sortie.

Pour la création de l'image, soit on utilise dc3dd avec les options conv=noerror,sync, soit on utilise ddrescue. Le choix de l'une ou l'autre dépendra des prérogatives de chacun en termes de finalités (forensics ou récupération de données).

cat image.* | md5sum

Les deux dernières commandes devraient donner le même résultat.

Dues aux erreurs présentes sur le disque, la copie n'est plus conforme au support, il est indispensable de le notifier dans tout rapport.

Le hash des fichiers présents sur l'image

Montage du disque:

  mount -o ro,loop,noexec,noatime image.dd /mnt/disque

Calculer le hash de ses fichiers:

find . -type f -exec md5sum {} \; > /filelist.md5

En sortie:

root@machine:/mnt/disque # cat /filelist.md5
md5checksum ./nomfichier.ext

Vérifier les hash

md5sum -c filelist.md5 

Résultat de la commande:

root@machine:/mnt/disque # cat /filelist.md5
./nomfichier.ext:  OK

Monter une image disque

Sur une loop:

  mount -t vfat -o ro,noexec,loop image.dd /mnt/disque

Cette commande est applicable si image.dd est l'image d'une partition, et non d'un disque entier.

  • -t: type du système de fichiers, -t auto permet à mount de détecter automatiquement le type de fs.
  • -o: options: ro:read-only, noexec: pas d'éxécution de binaires en provenance de l'image, loop: montage sur une loop, option intéressante:noatime: ne met pas à jour les dates d'accès aux fichiers

Pour monter une partition contenue dans l'image du disque, il faudra, au préalable calculer l'offset à partir duquel la partition débute. L'exemple d'un disque contenant une MBR. Il faut indiquer à la commande mount que la partition commence après la MBR grâce à l'option offset.

La MBR fait 63 secteurs, chacun faisant une taille de 512 bytes. L'offset sera donc de 32256, et mount commencera sa lecture au 64ème secteur.

mount -o offset=32256,ro,noexec,loop image.dd /mnt/disque

Pour connaître le secteur de début d'une partition, il faudra utiliser fdisk -l par exemple. Cette commande indique aussi la taille des secteurs.

Liveview

Non encore testé.

copie_support.1397477763.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)