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: TestDescription: 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 2018Operating system used: Linux
Software version used: 20170703
Password: N/A
Model: Flash DiskSerial 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
- ajouter, dans le fichier /etc/fuse.conf (ou tout autre chemin, selon votre installation) la directive user_allow_other
- 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