Profil Linux avec Volatility2 & Volatility3
Dans le cadre d’une investigation forensic, nous sommes parfois confrontĂ©s Ă devoir crĂ©er un profil Volatilty2 ou Volatility3 pour analyser un dump Linux selon nos besoins. Ici nous verrons plusieurs maniĂšres de crĂ©er un profil, d’abord avec un docker dans une machine virtuelle Linux quelconque, puis sur la machine possĂ©dant la mĂȘme version de noyau que le dump auquel nous devons faire face.
Les besoins pour créer un profil Linux
Volatility a besoin de deux types de fichiers pour créer un profil :
- Le fichier System.map
- L’image de noyau compilĂ©e (incluant les informations de dĂ©bogage)
Le fichier System.map
Le fichier System.map contient les adresses mémoire des symboles de noyau. Il est important pour Volatility afin de mapper les adresses dans la mémoire virtuelle à des fonctions ou variables spécifiques.
Si vous avez installĂ© les en-tĂȘtes du noyau, il se situe dans /boot/System-map-*
Le fichier Module Dwarf
Le fichier contenant les symboles de dĂ©bogage, aussi appelĂ© fichier DWARF (Debug With Arbitrary Record Format), permet d’extraire et d’interprĂ©ter correctement les structures de donnĂ©es en mĂ©moire (comme les processus, les threads, etc…..). Il est construit Ă partir du fichier vmlinux
.
recon
Pour trouver la version du noyau, nous pouvons executer la commande suivante :
python3 /opt/volatility3/vol.py -f dump.elf banners.Banners
# ou bien
strings dump.elf | grep "Linux version" | uniq | sort
docker & volatility2
Pour faire un profil volatility2 depuis un docker, voici un Dockerfile pour créer un profil. La distribution est Alpine en version 3.14 et le noyau Linux est en version 5.10.180-0-virt
FROM alpine:3.14
# check pour la version de l'OS
RUN cat /etc/alpine-release
# ajoute les sources pour Alpine
RUN echo "http://dl-cdn.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/main" >> /etc/apk/repositories
RUN echo "http://dl-cdn.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/community" >> /etc/apk/repositories
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
# update ls sources
RUN apk update
# installation des paquets nécessaires pour créer le profil car Alpine est trÚs légÚre de base
RUN apk add zip git gcc libgcc make libdwarf-dev linux-lts linux-virt linux-virt-dev linux-headers dwarf-tools libdwarf
RUN git clone https://github.com/volatilityfoundation/volatility.git
# rajoute la version du kernel dans le Makefile Volatility
RUN sed -i 's/$(shell uname -r)/5.10.180-0-virt/' volatility/tools/linux/Makefile
#on compile
RUN cd volatility/tools/linux/ && make
RUN zip /profile.zip volatility/tools/linux/module.dwarf /boot/System.map-virt
RUN cp /profile.zip /volatility/
Ensuite on execute les commandes pour extraite le fichier .zip qui correspond Ă notre fichier profil pour Volatility2
sudo docker build -t volatility:3.14 .
docker create --name temp_container volatility:3.14
docker cp temp_container:/volatility/profile.zip ./profile.zip
Ensuite on unzip, on les met Ă la racine tous les deux et on zip Ă nouveau.
On dépose le zip dans <répertoire de volatility 2>/volatility/plugins/overlays/linux/Alpine.5.10.180-0-virt.zip
Pour vérifier si le profil est bien interprété : python2 /opt/volatility/vol.py -f dump.elf --info | grep -i "profile"
Il faudra spĂ©cifier l’option --profile=Alpine.5.10.180-0-virt.zip
lors de la prochaine commande pour spécifier avec quel profil analyser le dump.
volatility2
Dans une machine virtuelle possĂ©dant la mĂȘme version du kernel ainsi que le mĂȘme systĂšme d’exploitation :
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility/tools/linux/ && make
cd ../../../
zip $(lsb_release -i -s)_$(uname -r)_profile.zip ./volatility/tools/linux/module.dwarf /boot/System.map-$(uname -r)
rm -rf ./volatility
On dépose le zip dans <répertoire de volatility 2>/volatility/plugins/overlays/linux/MonProfil.zip
volatility3
Dans une machine virtuelle possĂ©dant la mĂȘme version du kernel ainsi que le mĂȘme systĂšme d’exploitation :
git clone https://github.com/volatilityfoundation/dwarf2json
cd dwarf2json/go mod download github.com/spf13/pflag
go build
./dwarf2json linux --elf /usr/lib/debug/vmlinux-5.10.0-21-amd64 > ~/vmlinux-5.10.180-0-virt.json
Il faudra déposer le profil dans <répertoire de volatility 3>/symbols/vmlinux-5.10.180.0-virt.json