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 :
- Profils pré-construits pour Volatility : https://github.com/volatilityfoundation/profiles
- Volatility3 symbols : https://github.com/Abyss-W4tcher/volatility3-symbols/tree/master/
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.