Was macht MFT-Analyse zur Wiederherstellung gelöschter Dateien?
Überblick
Die NTFS-Master-File-Table ($MFT) ist das zentrale Metadaten-Repository für jede Datei und jedes Verzeichnis auf einem NTFS-Volume. Jede Datei wird durch mindestens einen 1024-Byte-MFT-Eintrag repräsentiert, der Attribute wie $STANDARD_INFORMATION (Zeitstempel, Berechtigungen), $FILE_NAME (Name, übergeordnetes Verzeichnis, Zeitstempel) und $DATA (Dateiinhalt oder Cluster-Run-Pointer) enthält. Wenn eine Datei gelöscht wird, wird ihr MFT-Eintrag als inaktiv markiert (InUse-Flag gelöscht), aber die Metadaten bleiben erhalten, bis der Eintrag von einer neuen Datei neu zugewiesen wird. Diese Beständigkeit macht die MFT-Analyse zu einer primären Technik zur Wiederherstellung von Beweisen gelöschter Dateien, zur Rekonstruktion von Dateisystem-Zeitlinien und zur Erkennung von anti-forensischen Aktivitäten wie Timestomping.
Verwendung
- Bei der Untersuchung von Sicherheitsvorfällen, die eine Analyse der MFT zur Wiederherstellung gelöschter Dateien erfordern
- Beim Erstellen von Erkennungsregeln oder Threat-Hunting-Abfragen für diesen Bereich
- Wenn SOC-Analysten strukturierte Verfahren für diesen Analysetyp benötigen
- Bei der Validierung der Sicherheitsüberwachungsabdeckung für verwandte Angriffstechniken
Voraussetzungen
- Forensisches Datenträgerabbild (E01, raw/dd, VMDK oder VHDX-Format)
- MFTECmd (Eric Zimmerman) oder analyzeMFT (Python-basiert)
- FTK Imager, Arsenal Image Mounter oder ähnliches zum Einhängen von Images
- Timeline Explorer oder Excel für die CSV-Analyse
- Python 3.8+ für benutzerdefinierte Analysescripte
- Verständnis der NTFS-Dateisystem-Interna
MFT-Struktur und Datensatzlayout
MFT-Datensatzkopf
Jeder MFT-Datensatz beginnt mit der Signatur „FILE“ (0x46494C45) und enthält:
| Offset | Größe | Feld |
|---|---|---|
| 0x00 | 4 Bytes | Signatur („FILE“) |
| 0x04 | 2 Bytes | Offset zur Update-Sequenz |
| 0x06 | 2 Bytes | Größe der Update-Sequenz |
| 0x08 | 8 Bytes | $LogFile-Sequenznummer |
| 0x10 | 2 Bytes | Sequenznummer |
| 0x12 | 2 Bytes | Anzahl der Hard-Links |
| 0x14 | 2 Bytes | Offset zum ersten Attribut |
| 0x16 | 2 Bytes | Flags (0x01 = InUse, 0x02 = Verzeichnis) |
| 0x18 | 4 Bytes | Verwendete Größe des MFT-Datensatzes |
| 0x1C | 4 Bytes | Zugewiesene Größe des MFT-Datensatzes |
| 0x20 | 8 Bytes | Referenz auf den Basis-Dateidatensatz |
| 0x28 | 2 Bytes | Nächste Attribut-ID |
Wichtige MFT-Attribute
| Typ-ID | Name | Beschreibung |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION | Zeitstempel, Flags, Besitzer-ID, Sicherheits-ID |
| 0x30 | $FILE_NAME | Dateiname, übergeordnete MFT-Referenz, Zeitstempel |
| 0x40 | $OBJECT_ID | Eindeutige GUID für die Datei |
| 0x50 | $SECURITY_DESCRIPTOR | ACL-Berechtigungen |
| 0x60 | $VOLUME_NAME | Datenträgerbezeichnung (nur Volume-Metadatendateien) |
| 0x80 | $DATA | Dateiinhalt (resident bei < 700 Bytes) oder Cluster-Run-Liste |
| 0x90 | $INDEX_ROOT | B-Baum-Indexwurzel für Verzeichnisse |
| 0xA0 | $INDEX_ALLOCATION | B-Baum-Indexeinträge für große Verzeichnisse |
| 0xB0 | $BITMAP | Zuweisungs-Bitmap für Index oder MFT |
Techniken zur Wiederherstellung gelöschter Dateien
Technik 1: MFT-Datensatzanalyse mit MFTECmd
# $MFT aus forensischem Image extrahieren mit KAPE oder FTK Imager
# $MFT mit MFTECmd parsen
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# In Timeline Explorer nach gelöschten Dateien filtern (InUse = FALSE)
# Nach Einträgen suchen, bei denen die Spalte InUse den Wert False hat
Identifizieren gelöschter Dateien in der CSV-Ausgabe:
InUse= False zeigt einen gelöschten oder neu zugewiesenen Datensatz anParentPathzeigt den ursprünglichen Dateipfad vor dem LöschenFileSizezeigt die ursprüngliche Größe (möglicherweise wiederherstellbar)- Zeitstempel in den Attributen
$STANDARD_INFORMATIONund$FILE_NAMEbleiben erhalten
Technik 2: USN-Journal-($UsnJrnl:$J)-Analyse
Das USN-Journal zeichnet alle Änderungen an Dateien auf einem NTFS-Volume auf, einschließlich Erstellung, Löschung, Umbenennung und Datenänderungsereignisse.
# USN-Journal mit MFTECmd parsen
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# Wichtige USN-Reason-Codes für Löschbeweise:
# USN_REASON_FILE_DELETE = 0x00000200
# USN_REASON_CLOSE = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000
Technik 3: $LogFile-Transaktionsanalyse
Die $LogFile speichert NTFS-Transaktionsdatensätze, die Dateivorgänge aufdecken können, selbst nachdem das USN-Journal zyklisch überschrieben wurde.
# $LogFile mit LogFileParser parsen
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# Nach REDO- und UNDO-Operationen suchen, die auf das Löschen von Dateien hinweisen:
# - DeallocateFileRecordSegment
# - DeleteAttribute
# - UpdateResidentValue (Löschen des InUse-Flags)
Technik 4: MFT-Slack-Space-Analyse
MFT-Slack-Space existiert zwischen dem Ende des verwendeten Teils eines MFT-Datensatzes und dem Ende der zugewiesenen 1024 Bytes. Dieser Bereich kann Überreste früherer Dateidatensätze enthalten.
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""MFT-Slack-Space extrahieren und analysieren für Überreste gelöschter Dateien."""
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
# FILE-Signatur überprüfen
if record[:4] != b"FILE":
record_num += 1
continue
# Verwendete Größe von Offset 0x18 holen
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# Prüfen, ob Slack lesbare Zeichenfolgen oder Attribut-Header enthält
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
Korrelation mit unterstützenden Artefakten
Querverweis MFT mit $Recycle.Bin
# Papierkorb mit RBCmd parsen
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# Korrelieren: $I-Dateien enthalten den ursprünglichen Pfad und den Löschzeitstempel
# MFT-Eintragsnummern aus $R-Dateien mit ursprünglichen MFT-Datensätzen abgleichen
Querverweis MFT mit Volumenschattenkopien
# Volumenschattenkopien auflisten
vssadmin list shadows
# Schattenkopien einhängen und $MFT aus jeder extrahieren
# MFT-Datensätze über Schattenkopien hinweg vergleichen, um Dateiänderungen über die Zeit zu verfolgen
Forensischer Wert
- Wiederherstellung von Metadaten gelöschter Dateien: Originalname, Pfad, Größe und Zeitstempel
- Zeitlinienrekonstruktion: Ereignisse zur Dateierstellung, -änderung, -zugriff und -löschung
- Timestomping-Erkennung: Vergleich von $SI- und $FN-Zeitstempeln
- Anleitung für Data Carving: MFT-Cluster-Runs zeigen auf Dateiinhalte auf dem Datenträger
- Anti-Forensik-Erkennung: Identifizieren gelöschter oder manipulierter MFT-Datensätze
Referenzen
- 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/
- MFTECmd-Dokumentation: https://ericzimmerman.github.io/
- SANS FOR500: Windows Forensic Analysis
Beispielausgabe
$ MFTECmd.exe -f "C:\Evidence\$MFT" --csv /analysis/mft_output
MFTECmd v1.2.2 - MFT-Parser
==============================
Eingabe: C:\Evidence\$MFT (Größe: 384 MB)
Gesamt MFT-Einträge: 395.264
MFT-Einträge werden geparst... Erledigt (12,4 Sekunden)
--- Zusammenfassung der Wiederherstellung gelöschter Dateien ---
Gesamt Einträge: 395.264
Aktive Dateien: 245.832
Gelöschte Dateien: 149.432
Wiederherstellbar: 87.234 (residente Daten oder nicht neu zugewiesene Cluster)
Teilweise wiederherstellbar: 31.456 (einige Cluster überschrieben)
Nicht wiederherstellbar: 30.742 (alle Cluster neu zugewiesen)
--- Kürzlich gelöschte Dateien (Vorfallfenster: 2024-01-15 bis 2024-01-18) ---
MFT-Eintrag | Dateiname | Pfad | Größe | Gelöscht (UTC) | Wiederherstellbar
----------|-----------------------------------|------------------------------------|-----------|-----------------------|------------
148923 | exfil_tool.exe | C:\ProgramData\Updates\ | 1.258.496 | 2024-01-17 02:45:12 | JA
148924 | exfil_tool.log | C:\ProgramData\Updates\ | 45.312 | 2024-01-17 02:45:14 | JA
149001 | passwords.txt | C:\Users\jsmith\Desktop\ | 2.048 | 2024-01-17 02:50:33 | JA
149150 | scan_results.csv | C:\Users\jsmith\AppData\Local\Temp | 892.416 | 2024-01-17 03:00:01 | TEILWEISE
149200 | mimikatz.exe | C:\Windows\Temp\ | 1.250.816 | 2024-01-18 01:15:22 | JA
149201 | sekurlsa.log | C:\Windows\Temp\ | 32.768 | 2024-01-18 01:15:25 | JA
149302 | .bash_history | C:\Users\jsmith\ | 4.096 | 2024-01-18 03:00:00 | NEIN
149400 | ClearEventLogs.ps1 | C:\Windows\Temp\ | 1.536 | 2024-01-18 03:01:12 | JA
--- $STANDARD_INFORMATION vs $FILE_NAME Zeitstempelanalyse (Timestomping-Erkennung) ---
MFT-Eintrag | Dateiname | $SI Erstellt | $FN Erstellt | Delta | Urteil
----------|---------------------|----------------------|----------------------|-----------|----------
148923 | exfil_tool.exe | 2023-06-15 10:00:00 | 2024-01-15 14:34:02 | -214 Tage | TIMESTOMPED
149200 | mimikatz.exe | 2022-01-01 00:00:00 | 2024-01-16 02:30:15 | -745 Tage | TIMESTOMPED
Wiederhergestellte Dateien exportiert nach: /analysis/mft_output/recovered/
Vollständiger CSV-Bericht: /analysis/mft_output/mft_analysis.csv (395.264 Zeilen)
Zeitlinien-CSV: /analysis/mft_output/mft_timeline.csv