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 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 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 :

bash

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

bash

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

bash

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 :

bash

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 :

bash

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

Liens cools

Hacktricks

Write up de Smyler