Forensique | Générer un profile linux – Volatility

L’analyse de dump de mémoire windows ne pose généralement pas de problèmes avec volatility. Mais lorsqu’il s’agit d’analyser les dump de mémoire linux c’est une toute autre affaire. Pour analyser le dump mémoire volatility a besoin d’un profil. Volatility intègre par défaut plusieurs profils windows mais ce n’est pas le cas pour linux. En effet il existe un trop grand nombre de versions différente du noyau. Ce qui rend impossible leur integration par défaut dans l’outil volatility. Il est donc nécessaire de créer les profils linux nous même. Une erreur qui semble courante en matière d’analyse de mémoire sous Linux la création d’un profil pour un système autre que la machine l’on souhaite analyser. En effet le profil doit correspondre parfaitement à la distribution Linux, à la version exacte du noyau et à l’architecture du processeur (32 bits, 64 bits).

Mais dis-moi Jami, qu’est ce qu’un profil ?

Un profil Linux est essentiellement un fichier contenant des informations sur les structures de données et les symboles de débogage du noyau. C’est ce que Volatility utilise pour localiser les informations importantes et savoir comment les analyser une fois trouvées. C’est une sorte de carte permettant à volatility de se repérer. Attention, les profils n’ont pas les même formats sur Volatility 2 et Volatility 3.

Sur Volatility 2, le profil est un fichier zip :

Linux-<version-noyau><x86/x64>.zip
|-- System.map-<version-noyau>.<x86/x64>
|-- module.dwarf
Le fichier System.map (i.e. System.map-3.5.2-3.fc17.x86_64) contient les symboles du noyau que vous voulez analyser.
Le fichier module.dwarf contient les structures de données du noyau.

Sur Volatility 3, le profil est un fichier zip générer par dwarf2json :

Linux-<x86/x64><version-noyau>.json

Si vous ne connaissez pas la version du noyau de l’image mémoire :

  • Volatility 3 : vol.py -f dumpmem.raw banners.Banners

Profils pré-construits

La première chose à faire et de regarder si le profil dont vous avez besoin n’existe pas déjà sur internet :

Si un profil pré-construit n’existe pas on doit alors le construire.

Volatility 3

Dans Volatility 3 les symboles windows qui ne peuvent être trouvés seront recherchés, téléchargés, générés et mis en cache. Mais pourt Mac et Linux, ils doivent être produits manuellement par un outil tel que dwarf2json.

Les fichiers zip des tables de symboles doivent être placés, dans le répertoire volatility3/symbols (ou simplement le répertoire symbols à côté du fichier exécutable).
Générer le profil depuis une VM

Il faut d’abord installer une version debug du noyau. Pour installer une version debug du noyau, on peut notamment ajouter une nouvelle entrée dans la list de dépôts.

Ajout du dépot (exemple pour Ubuntu) :

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ddebs.list
wget -O - http://ddebs.ubuntu.com/dbgsym-release-key.asc | sudo apt-key add -
sudo apt-get update

Recherche de l’image noyau souhaité :

yasan@Arcane:~/Bureau/volatility/tools/linux$ sudo apt search linux-image-5.4.0-107-generic
En train de trier... Fait
Recherche en texte intégral... Fait
linux-image-5.4.0-107-generic/bionic-updates,bionic-security,now 5.4.0-107.121~18.04.1 amd64  [installé]
  Signed kernel image generic

linux-image-5.4.0-107-generic-dbgsym/bionic-updates,now 5.4.0-107.121~18.04.1 amd64  [installé]
  Signed kernel image generic

Installation de l’image noyau :

sudo apt-get install linux-image-5.4.0-107-generic-dbgsym

En cas de succès de l’installation, l’image du noyau mode debug se trouvera dans /usr/lib/debug/boot/vmlinux-5.4.0-107-generic

Création du profil
sudo ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.4.0-107-generic > ./Ubuntu-5.4.0-107-amd64.json
Générer un profil depuis un fichier image debug

Si vous parvenez à trouver une image debug du noyau sur internet alors vous pouvez également générer le profil.

Trouver sur internet une image debug du noyau (ddeb):

linux-image-unsigned-5.4.0-42-generic-dbgsym_5.4.0-42.46_amd64.ddeb

Extraire le package :

sudo dpkg -x linux-image-unsigned-5.4.0-107-generic-dbgsym_5.4.0-107.121_amd64.ddeb /tmp/

Création du profil :

sudo ./dwarf2json linux --elf /tmp/usr/lib/debug/boot/vmlinux-5.4.0-107-generic > ./Ubuntu-5.4.0-107-amd64.json
Tester le fonctionnement

Déplacer le profil générer dans le dossier suivant :

volatility3/volatility3/symbols/linux/

Puis vérifier son fonctionnement avec la commande suivante :

python3 ./volatility3/vol.py isfinfo.IsfInfo

| Volatility 3 Framework 2.2.0
| Progress:  100.00               PDB scanning finished  
| URI     Valid   Number of base_types    Number of types Number of symbols       Number of | enums Windows info    Linux banner    Mac banner
| file:///lab/volatility3/volatility3/symbols/linux/LinuxUbuntu_5_4_0-107-amd64.json       Unknown 18      10117   159124  1727    -       Linux version 5.4.0-107-generic (buildd@lcy02-amd64-070) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #121~18.04.1-Ubuntu SMP Thu Mar 24 17:21:33 UTC 2022 (Ubuntu 5.4.0-107.121~18.04.1-generic 5.4.174)

Volatility2

La stratégie ici va être de créer une machine vituelle linux sur lequel vous allez installer la version du noyau souhaité afin de récupérer les fichiers nécessaires à la création du profil. Pour l’exemple, nous souhaitons générer un profile pour le noyau 5.4.0-107-generic.

Création System.map

Le fichier System.map (i.e. System.map-3.5.2-3.fc17) contient les symboles du noyau que vous voulez analyser. Ce fichier peut presque toujours être trouvé dans le répertoire /boot d’une machine ou d’une VM possédant le noyau recherché. Vous pouvez également générer ce fichier vous-même en exécutant nm sur le fichier vmlinux du noyau. Le répertoire /boot peut contenir plusieurs fichiers System.map à cause des différentes mise à jour du noyau, il faut donc veiller à prendre le bon.

sudo apt-get install linux-headers-5.4.0-107-generic
ls /boot/

| config-5.3.0-28-generic       memtest86+.elf
| config-5.4.0-107-generic      memtest86+_multiboot.bin
| config-5.4.0-109-generic      System.map-5.3.0-28-generic
| efi			      System.map-5.4.0-107-generic
| grub			      System.map-5.4.0-109-generic
| initrd.img-5.3.0-28-generic   vmlinuz-5.3.0-28-generic
| initrd.img-5.4.0-107-generic  vmlinuz-5.4.0-107-generic
| initrd.img-5.4.0-109-generic  vmlinuz-5.4.0-109-generic
| memtest86+.bin
Création module.dwarf

La méthode recommandé par volatility pour créer le fichier contenant la structures de données du noyau est de compiler ‘module.c’ se trouvant sur le repository git. Bien sur cette compilation doit se faire sur une machine possédant les en-têtes pour la construction des modules du noyau que vous voulez analyser.

Téléchargement du repository git :

git clone https://github.com/volatilityfoundation/volatility.git

Se rendre dans tools/linux :

cd volatility/tools/linux 

Vérification de l’existence du dossier /lib/modules/<version-noyau>/ :

ls /lib/modules/5.4.0-107-generic/

| build	       modules.alias.bin	modules.dep	 modules.softdep
| initrd	       modules.builtin		modules.dep.bin  modules.symbols
| kernel	       modules.builtin.bin	modules.devname  modules.symbols.bin
| modules.alias  modules.builtin.modinfo	modules.order	 vdso

Compilation de module.c. Ici vous noterez qu’il faut fournir à la commande make le chemin vers le dossier contenant les modules du noyau :

sudo make -C /lib/modules/5.4.0-107-generic/build CONFIG_DEBUG_INFO=y M=$PWD modules

| make : on entre dans le répertoire « /usr/src/linux-headers-5.4.0-107-generic »
|   CC [M]  /home/yasan/Bureau/volatility/tools/linux/module.o
|   Building modules, stage 2.
|   MODPOST 1 modules
| WARNING: modpost: missing MODULE_LICENSE() in /home/yasan/Bureau/volatility/tools/linux/module.o
| see include/linux/module.h for more information
|   CC [M]  /home/yasan/Bureau/volatility/tools/linux/module.mod.o
|   LD [M]  /home/yasan/Bureau/volatility/tools/linux/module.ko
| make : on quitte le répertoire « /usr/src/linux-headers-5.4.0-107-generic »

Utilisez dwarfdump pour créer le fichier module.dwarf :

sudo apt install dwarfdump
dwarfdump -di ./module.o > module.dwarf

Vérification de la présence de module.dwarf :

ls 

| ..........      ............     ..........    ..........
| ..........      module.dwarf     ..........    ..........
| ..........      ............     ..........    ..........
Création du zip

Récupérer votre fichier System.map-5.4.0-107-generic et votre fichier module.dwarf dans un même répertoire et créez une archive zip.

sudo zip Ubuntu18.04-5.4.0-107-x64.zip ./module.dwarf ./System.map-5.4.0-107-generic 

|   adding: module.dwarf (deflated 91%)
|   adding: System.map-5.4.0-107-generic (deflated 79%) 
ls 

| ...........      ...........        ...........
| Ubuntu18.04-5.4.0-107-x64.zip

Mettez cette archive dans le dossier volatility/plugins/overlays/linux/ du répertoire d’installation de Volatility.

Tester le fonctionnement

On voit apparaître un nouveau profil LinuxUbuntu18_04-5_4_0-107-x64x64

python2 ./volatility/vol.py --info | grep Linux

| Volatility Foundation Volatility Framework 2.6.1
| LinuxUbuntu18_04-5_4_0-107-x64x64 - A Profile for Linux Ubuntu18.04-5.4.0-107-x64 x64
| LinuxAMD64PagedMemory          - Linux-specific AMD 64-bit address space.
| linux_aslr_shift           - Automatically detect the Linux ASLR shift
| linux_banner               - Prints the Linux banner information
| linux_yarascan             - A shell in the Linux memory image
1 reply on “ Forensique | Générer un profile linux – Volatility ”

Comments are closed.