Que fait Analyse de la MFT pour la récupération de fichiers supprimés ?
Vue d’ensemble
La Master File Table ($MFT) NTFS est le référentiel central des métadonnées de chaque fichier et répertoire sur un volume NTFS. Chaque fichier est représenté par au moins un enregistrement MFT de 1024 octets contenant des attributs tels que $STANDARD_INFORMATION (horodatages, permissions), $FILE_NAME (nom, répertoire parent, horodatages) et $DATA (contenu du fichier ou pointeurs vers les clusters). Lorsqu'un fichier est supprimé, son enregistrement MFT est marqué comme inactif (le flag InUse est effacé), mais les métadonnées persistent jusqu'à ce que l'entrée soit réallouée par un nouveau fichier. Cette persistance fait de l'analyse MFT une technique primordiale pour la récupération de fichiers supprimés, la reconstruction de timelines du système de fichiers et la détection d'activités anti-forensiques comme le timestomping.
Quand utiliser
- Lors d’investigations d’incidents de sécurité nécessitant l’analyse de la MFT pour la récupération de fichiers supprimés.
- Pour la création de règles de détection ou de requêtes de Threat Hunting dans ce domaine.
- Lorsque les analystes SOC ont besoin de procédures structurées pour ce type d’analyse.
- Pour valider la couverture de la surveillance de sécurité vis-à-vis des techniques d’attaque associées.
Prérequis
- Image disque forensique (format E01, raw/dd, VMDK ou VHDX)
- MFTECmd (Eric Zimmerman) ou analyzeMFT (basé sur Python)
- FTK Imager, Arsenal Image Mounter ou équivalent pour le montage d’images
- Timeline Explorer ou Excel pour l’analyse CSV
- Python 3.8+ pour les scripts d’analyse personnalisés
- Compréhension des mécanismes internes du système de fichiers NTFS
Structure de la MFT et disposition des enregistrements
En-tête d’un enregistrement MFT
Chaque enregistrement MFT commence par la signature « FILE » (0x46494C45) et contient :
| Offset | Taille | Champ |
|---|---|---|
| 0x00 | 4 octets | Signature (« FILE ») |
| 0x04 | 2 octets | Offset vers la séquence de mise à jour |
| 0x06 | 2 octets | Taille de la séquence de mise à jour |
| 0x08 | 8 octets | Numéro de séquence $LogFile |
| 0x10 | 2 octets | Numéro de séquence |
| 0x12 | 2 octets | Nombre de liens physiques |
| 0x14 | 2 octets | Offset vers le premier attribut |
| 0x16 | 2 octets | Flags (0x01 = InUse, 0x02 = Répertoire) |
| 0x18 | 4 octets | Taille utilisée de l’enregistrement MFT |
| 0x1C | 4 octets | Taille allouée de l’enregistrement MFT |
| 0x20 | 8 octets | Référence à l’enregistrement de base |
| 0x28 | 2 octets | ID du prochain attribut |
Attributs MFT clés
| ID type | Nom | Description |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION | Horodatages, flags, ID propriétaire, ID sécurité |
| 0x30 | $FILE_NAME | Nom de fichier, référence MFT parent, horodatages |
| 0x40 | $OBJECT_ID | GUID unique du fichier |
| 0x50 | $SECURITY_DESCRIPTOR | Permissions ACL |
| 0x60 | $VOLUME_NAME | Étiquette du volume (fichiers de métadonnées volume uniquement) |
| 0x80 | $DATA | Contenu du fichier (résident si < 700 octets) ou liste de clusters |
| 0x90 | $INDEX_ROOT | Racine d’index B-tree pour les répertoires |
| 0xA0 | $INDEX_ALLOCATION | Entrées d’index B-tree pour les grands répertoires |
| 0xB0 | $BITMAP | Bitmap d’allocation pour l’index ou la MFT |
Techniques de récupération de fichiers supprimés
Technique 1 : Analyse des enregistrements MFT avec MFTECmd
# Extraire $MFT de l’image forensique via KAPE ou FTK Imager
# Analyser $MFT avec MFTECmd
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# Filtrer les fichiers supprimés (InUse = FALSE) dans Timeline Explorer
# Chercher les entrées où la colonne InUse est False
Identifier les fichiers supprimés dans le CSV de sortie :
InUse= False indique un enregistrement supprimé ou réallouéParentPathmontre le chemin d’origine avant suppressionFileSizeaffiche la taille originale (potentiellement récupérable)- Les horodatages dans les attributs
$STANDARD_INFORMATIONet$FILE_NAMEpersistent
Technique 2 : Analyse du journal USN ($UsnJrnl:$J)
Le journal USN enregistre toutes les modifications apportées aux fichiers d’un volume NTFS, y compris la création, la suppression, le renommage et les modifications de données.
# Analyser le journal USN avec MFTECmd
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# Codes de raison USN clés pour les preuves de suppression :
# USN_REASON_FILE_DELETE = 0x00000200
# USN_REASON_CLOSE = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000
Technique 3 : Analyse transactionnelle du $LogFile
Le $LogFile stocke les enregistrements de transactions NTFS qui peuvent révéler des opérations sur les fichiers, même après que le journal USN ait été recyclé.
# Analyser $LogFile avec LogFileParser
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# Chercher les opérations REDO et UNDO indiquant une suppression :
# - DeallocateFileRecordSegment
# - DeleteAttribute
# - UpdateResidentValue (effacement du flag InUse)
Technique 4 : Analyse de l’espace libre des enregistrements MFT (MFT Slack Space)
L’espace libre dans la MFT (slack space) se situe entre la fin de la partie utilisée d’un enregistrement MFT et la fin des 1024 octets alloués. Cette zone peut contenir des vestiges d’enregistrements de fichiers précédents.
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""Extract and analyze MFT slack space for deleted file remnants."""
with open(mft_path, "rb") as f:
record_size = 1024
record_num = 0
slack_findings = []
while True:
record = f.read(record_size)
if len(record) < record_size:
break
# Verify FILE signature
if record[:4] != b"FILE":
record_num += 1
continue
# Get used size from offset 0x18
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# Check if slack contains readable strings or attribute headers
if any(c > 0x20 and c < 0x7F for c in slack[:50]):
slack_findings.append({
"record": record_num,
"used_size": used_size,
"slack_size": record_size - used_size,
"slack_preview": slack[:100].hex()
})
record_num += 1
return slack_findings
Corrélation avec les artefacts complémentaires
Mise en relation MFT et $Recycle.Bin
# Analyser la corbeille avec RBCmd
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# Corrélation : les fichiers $I contiennent le chemin d’origine et l’horodatage de suppression
# Faire correspondre les numéros d’entrée MFT des fichiers $R aux enregistrements MFT d’origine
Mise en relation MFT et clichés instantanés (Volume Shadow Copies)
# Lister les clichés instantanés
vssadmin list shadows
# Monter les clichés et extraire $MFT de chacun
# Comparer les enregistrements MFT entre les clichés pour suivre les changements au fil du temps
Valeur forensique
- Récupération des métadonnées de fichiers supprimés : nom d’origine, chemin, taille et horodatages
- Reconstruction de timeline : événements de création, modification, accès et suppression
- Détection de timestomping : comparaison des horodatages $SI vs $FN
- Guidage pour le data carving : les clusters pointés par les enregistrements MFT indiquent l’emplacement du contenu sur le disque
- Détection anti-forensique : identification d’enregistrements MFT effacés ou manipulés
Références
- NTFS MFT Advanced Forensic Analysis : https://www.deaddisk.com/posts/ntfs-mft-advanced-forensic-analysis-guide/
- MFT Slack Space Forensic Value : https://www.sygnia.co/blog/the-forensic-value-of-mft-slack-space/
- Documentation MFTECmd : https://ericzimmerman.github.io/
- SANS FOR500 : Windows Forensic Analysis
Exemple de sortie
$ MFTECmd.exe -f "C:\Evidence\$MFT" --csv /analysis/mft_output
MFTECmd v1.2.2 - MFT Parser
==============================
Entrée : C:\Evidence\$MFT (Taille : 384 Mo)
Nombre total d’enregistrements MFT : 395 264
Analyse des enregistrements MFT... Terminée (12,4 secondes)
--- Résumé de la récupération de fichiers supprimés ---
Total des entrées : 395 264
Fichiers actifs : 245 832
Fichiers supprimés : 149 432
Récupérables : 87 234 (données résidentes ou clusters non réalloués)
Partiellement récupérables : 31 456 (certains clusters écrasés)
Non récupérables : 30 742 (tous les clusters réalloués)
--- Fichiers récemment supprimés (Fenêtre d’incident : 2024-01-15 à 2024-01-18) ---
Entrée MFT | Nom du fichier | Chemin | Taille | Supprimé (UTC) | Récupérable
-----------|-------------------------------|-----------------------------------|-----------|-----------------------|------------
148923 | exfil_tool.exe | C:\ProgramData\Updates\ | 1 258 496 | 2024-01-17 02:45:12 | OUI
148924 | exfil_tool.log | C:\ProgramData\Updates\ | 45 312 | 2024-01-17 02:45:14 | OUI
149001 | passwords.txt | C:\Users\jsmith\Desktop\ | 2 048 | 2024-01-17 02:50:33 | OUI
149150 | scan_results.csv | C:\Users\jsmith\AppData\Local\Temp | 892 416 | 2024-01-17 03:00:01 | PARTIEL
149200 | mimikatz.exe | C:\Windows\Temp\ | 1 250 816 | 2024-01-18 01:15:22 | OUI
149201 | sekurlsa.log | C:\Windows\Temp\ | 32 768 | 2024-01-18 01:15:25 | OUI
149302 | .bash_history | C:\Users\jsmith\ | 4 096 | 2024-01-18 03:00:00 | NON
149400 | ClearEventLogs.ps1 | C:\Windows\Temp\ | 1 536 | 2024-01-18 03:01:12 | OUI
--- Analyse des horodatages $STANDARD_INFORMATION vs $FILE_NAME (Détection de timestomping) ---
Entrée MFT | Nom du fichier | $SI Créé | $FN Créé | Écart | Verdict
-----------|-------------------|---------------------|---------------------|------------|----------
148923 | exfil_tool.exe | 2023-06-15 10:00:00 | 2024-01-15 14:34:02 | -214 jours | TIMESTOMPÉ
149200 | mimikatz.exe | 2022-01-01 00:00:00 | 2024-01-16 02:30:15 | -745 jours | TIMESTOMPÉ
Fichiers récupérés exportés vers : /analysis/mft_output/recovered/
Rapport CSV complet : /analysis/mft_output/mft_analysis.csv (395 264 lignes)
CSV de timeline : /analysis/mft_output/mft_timeline.csv