Imprimer

Libewf

.

Une question se pose souvent lorsque l'on réalise la copie d'un support informatique (typiquement un disque dur) : comment stocker la dite copie. Une solution classique, aussi simple qu'efficace, est de créer un simple fichier dont le contenu sera identique, bit à bit, avec celui du support copié. C'est ce que fait la commande dd (et d'autres similaires) : une copie fidèle, de même taille que l'original. Cela suppose de disposer d'un espace de stockage libre au moins égal à la taille du support copié.

Une autre solution est de passer par un format de stockage compressé adapté. Parmi ceux-ci, le format EWF (Expert Witness Format), popularisé par Encase, fait figure de standard. Dans les environnements de type Linux, cela signifie d'utiliser libewf.


Acquisition d'un fichier EWF

La commande ewfacquire permet de copier un support vers un format EWF, donc en ajoutant diverses informations et en compressant le fichier résultat. Les options les plus intéressantes sont

  • -c : mode de compression du résultat. Par défaut, deflate:none. L'option deflate:fast ne ralentit pas la copie (test réalisé avec un bloqueur d'écritures en USB2). Par contre, dans les mêmes conditions, l'option deflate:best divise par deux la vitesse de copie
  • -C : identification du dossier
  • -d : fonction de hachage à utiliser, en plus de MD5
  • -e : nom de l'opérateur
  • -E : identification du support copié
  • -t : racine (sans extension) du résultat
  • -q : mode silencieux
  • -S : taille maximale des fichiers produits

L'option -S permet de définir la taille des différents fichiers qui vont contenir la copie. Par défaut, cette taille est de 1,4 Go, ce qui fait que la copie d'un disque de 1,5 To sera répartie sur plusieurs centaines de fichiers... Les performances d'accès au contenu du répertoire vont s'en ressentir.

La commande ewfacquire pose de nombreuses questions afin de déterminer la valeur de tous les paramètres nécessaires. L'option -u fait que les paramètres pour lesquels une valeur n'a pas été indiquée sur la ligne de commande prennent leur valeur par défaut.

$ ewfacquire -c deflate:fast -t USB /dev/sdc
ewfacquire 20170703

Device information:
Bus type:                USB
Vendor:                  Generic
Model:                   lash Disk
Serial:                  9

Storage media information:
Type:                    Device
Media type:              Removable
Media size:              8.2 GB (8242855936 bytes)
Bytes per sector:        512

Acquiry parameters required, please provide the necessary input
Case number: Test
Description: Utilisation de ewfacquire
Evidence number:
Examiner name: B&A Consultants
Notes:
Media type (fixed, removable, optical, memory) [removable]:
Media characteristics (logical, physical) [logical]:
Use EWF file format (ewf, smart, ftk, encase1, encase2, encase3, encase4, encase5, encase6, encase7, encase7-v2, linen5, linen6, linen7, ewfx) [encase6]:
Start to acquire at offset (0 <= value <= 8242855936) [0]:
The number of bytes to acquire (0 <= value <= 8242855936) [8242855936]:
Evidence segment file size in bytes (1.0 MiB <= value <= 7.9 EiB) [1.4 GiB]: 3G
The number of bytes per sector (1 <= value <= 4294967295) [512]:
The number of sectors to read at once (16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768) [64]:
The number of sectors to be used as error granularity (1 <= value <= 64) [64]:
The number of retries when a read error occurs (0 <= value <= 255) [2]:
Wipe sectors on read error (mimic EnCase like behavior) (yes, no) [no]:

The following acquiry parameters were provided:
Image path and filename:    USB.E01
Case number:                Test
Description:                Utilisation de ewfacquire
Evidence number:           
Examiner name:              B&A Consultants
Notes:                   
Media type:                 removable disk
Is physical:                yes
EWF file format:            EnCase 6 (.E01)
Compression method:         deflate
Compression level:          fast
Acquiry start offset:       0
Number of bytes to acquire: 7.6 GiB (8242855936 bytes)
Evidence segment file size: 3.0 GiB (3221225472 bytes)
Bytes per sector:           512
Block size:                 64 sectors
Error granularity:          64 sectors
Retries on read error:      2
Zero sectors on read error: no

Continue acquiry with these values (yes, no) [yes]:

Acquiry started at: Jan 06, 2018 01:01:59
This could take a while.
[ ... nombreux messages supprimés ... ]
Acquiry completed at: Jan 06, 2018 01:06:38

Written: 7.6 GiB (8242857252 bytes) in 4 minute(s) and 39 second(s) with 28 MiB/s (29544291 bytes/second)
MD5 hash calculated over data:        d24a120e8a7e5cce8799749d5f1b6545
ewfacquire: SUCCESS
$ ll --block-size=G
total 2G
-rw-r--r-- 1 user user 2G Jan  6 01:06 USB.E01

Comme on peut le voir, un support de 8 Go rempli à 20% n'occupe plus que 2 Go après compression. Le gain n'est pas négligeable. Sur un disque de 1 Tio peu rempli, le gain peut se révéler encore plus impressionnant (un peu moins de 100 Gio au total).


Manipulation de fichiers EWF

Si le stockage des données est éclaté sur plusieurs fichiers, on n'utilise toujours que le premier fichier (extension E01). Les outils ouvriront automatiquement les autres fichiers, dans le bon ordre, sans que nous ayons à nous en soucier.

Ewfinfo

La commande ewfinfo permet d'afficher les métadonnées incluses dans le fichier E01 examiné :

$ ewfinfo USB.E01
ewfinfo 20170703

Acquiry information
    Case number:        Test
    Description:        Utilisation de ewfacquire
    Examiner name:      B&A Consultants
    Acquisition date:   Sat Jan  6 01:01:59 2018
    System date:        Sat Jan  6 01:01:59 2018
    Operating system used:    Linux
    Software version used:    20170703
    Password:           N/A
    Model:              Flash Disk
    Serial number:      9

EWF information
    File format:          EnCase 6
    Sectors per chunk:    64
    Error granularity:    64
    Compression method:   deflate
    Compression level:    good (fast) compression

Media information
    Media type:          removable disk
    Is physical:         yes
    Bytes per sector:    512
    Number of sectors:   16099328
    Media size:          7.6 GiB (8242855936 bytes)

Digest hash information
    MD5:            d24a120e8a7e5cce8799749d5f1b6545

Ewfverify

La commande ewfverify procède à la vérification du contenu, c'est-à-dire le contrôle des condensats. Selon la taille de la source, son exécution peut être longue.

$ ewfverify USB.E01 
ewfverify 20170703

Verify started at: Jan 06, 2018 14:34:54
This could take a while.
[ ... nombreux messages supprimés ... ]

Verify completed at: Jan 06, 2018 14:36:03

Read: 7.6 GiB (8242855936 bytes) in 1 minute(s) and 9 second(s) with 113 MiB/s (119461680 bytes/second)

MD5 hash stored in file:        d24a120e8a7e5cce8799749d5f1b6545
MD5 hash calculated over data:  d24a120e8a7e5cce8799749d5f1b6545

ewfverify: SUCCESS

Montage de fichiers avec ewfmount

La commande la plus intéressante est ewfmount. Elle permet de monter un fichier EWF sur l'ordinateur. Ewfmount se limite à créer, à l'aide de FUSE et juste en-dessous du point de montage, un fichier virtuel nommé ewf1 donnant accès au contenu du fichier EWF. Il est ensuite possible d'utiliser divers outils d'analyse sur l'image ainsi accessible.

Le démontage du fichier virtuel ewf1 se fait indifféremment avec umount ou fusermount -u.

Dans l'exemple suivant, nous utilisons l'image d'une clé USB de 8 Gio formattée en ext2, et nous nous servons des outils de Sleuthkit.

$ ewfmount USB.E01 /mnt/ici
$ ls -l /mnt/ici
-r--r--r-- 1 root root 8242855936 Jan  6 11:30 ewf1
$ fsstat /mnt/ici/ewf1
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext2
Volume Name:

Volume ID: 770b5c3e1382fe9fb44d85fd5aefb668

Last Written at: 2018-01-06 00:59:18 (CET)
Last Checked at: 2018-01-06 00:43:51 (CET)
Last Mounted at: empty
Unmounted properly

Source OS: Linux
Dynamic Structure
Compat Features: Ext Attributes, Resize Inode, Dir Index
InCompat Features: Filetype,
Read Only Compat Features: Sparse Super, Large File
$ fls /mnt/ici/ewf1
d/d 11: lost+found
r/r 12: Tokyo-01.jpg
r/r 13: Tokyo-02.jpg
r/r 14: Tokyo-03.jpg
r/r 15: Tokyo-04.jpg
r/r 16: Tokyo-05.jpg
r/r 17: Tokyo-06.jpg
r/r 18: Tokyo-07.jpg
r/r 19: Tokyo-08.jpg
r/r 20: Tokyo-09.jpg
r/r 21: Tokyo-10.jpg
r/r 22: Tokyo-11.jpg
r/r 23: Tokyo-12.jpg

Le montage fait par ewfmount peut ne pas  suffire. Il est souvent utile de monter les différentes partitions du disque afin d'en examiner le contenu avec des commandes et outils classiques. Cela suppose d'utiliser le fichier virtuel ewf1 comme source pour mount. Ceci nécessite que l'utilisateur root puisse accéder au fichier ewf1, ce qui est normalement interdit. Il faut donc

  1. ajouter, dans le fichier /etc/fuse.conf (ou tout autre chemin, selon votre installation) la directive user_allow_other
  2. transmettre à FUSE, via ewfmount, l'option allow_other
$ ewfmount -X allow_other Disque-1To.E01 /mnt/disque/EWF
ewfmount 20170703
$ ls -l /mnt/disque/EWF
-r--r--r-- 1 root root 1000204886016 Jan  6 21:31 ewf1

 Il est alors possible de monter l'une des partitions du disque

$ cd /mnt/disque
$ mmls EWF/ewf1
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Safety Table
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  Meta      0000000001   0000000001   0000000001   GPT Header
003:  Meta      0000000002   0000000033   0000000032   Partition Table
004:  000       0000002048   0000534527   0000532480   EFI system partition
005:  001       0000534528   0000796671   0000262144   Microsoft reserved partition
006:  002       0000796672   1920139263   1919342592   Basic data partition
007:  003       1920139264   1921662975   0001523712   Basic data partition
008:  004       1921662976   1953517567   0031854592   Basic data partition
009:  -------   1953517568   1953525167   0000007600   Unallocated
$ mount -o ro,loop,offset=$((512*796672)) EWF/ewf1 p3

$ ls p3
BOOTNXT                 pagefile.sys         SWSetup
Documents and Settings  PerfLogs             SYSTEM.SAV
$GetCurrent             ProgramData          System Volume Information
hiberfil.sys            Program Files        Users
hp                      Program Files (x86)  Windows
inetpub                 Recovery             Windows10Upgrade
Intel                   $Recycle.Bin         $WINDOWS.~BT
KVRT_Data               swapfile.sys

 Il reste un dernier point important à signaler. Si vous voulez monter plusieurs partitions du même disque, cela ne se passera probablement pas aussi bien que vous le souhaiteriez :

$ mount -o ro,loop,offset=$((512*1920139264)) EWF/ewf1 p4
mount: p4: overlapping loop device exists for /mnt/disque/EWF/ewf1.

Cela vient de ce que, sans autre information, mount considère que la partition que l'on monte va jusqu'à la fin du fichier source. Il faut utiliser l'option sizelimit en plus de offset pour monter les partitions :

$ umount p3
$ mount -o ro,loop,offset=$((512*796672)),sizelimit=$((512*1919342592)) EWF/ewf1 p3
$ mount -o ro,loop,offset=$((512*1920139264)),sizelimit=$((512*1523712)) EWF/ewf1 p4