Der schwierigste Teil bei der Arbeit mit dem USN Journal ist normalerweise nicht das Parsen. Es ist, die Datei überhaupt erst in die Hände zu bekommen. $UsnJrnl:$J ist ein alternativer Datenstrom, keine reguläre Datei, also taucht es nicht im Explorer auf, überlebt nicht ein naives copy, und robocopy wird Sie stillschweigend belügen, was das Abrufen angeht. Dies ist der Feldführer dafür, die Bytes tatsächlich von der Festplatte zu bekommen, aufgeschlüsselt nach den drei Orten, an denen man ihnen typischerweise begegnet: ein forensisches Image, ein gemountetes Volume und eine Live-Maschine.
Was Sie suchen
Das Journal liegt unter:
\$Extend\$UsnJrnl:$J
$Extend ist ein verstecktes NTFS-Metadatenverzeichnis, und $J ist einer von zwei alternativen Streams auf der $UsnJrnl-Metadatendatei. Der andere Stream ist $Max, der nur die konfigurierte Maximalgröße und das Allocation Delta des Journals enthält — keine Einträge. Wenn Sie versehentlich $Max extrahieren, erhalten Sie ein paar Bytes nutzloser Konfiguration. Wählen Sie immer $J.
Microsoft dokumentiert das Layout in der Change-Journals-Referenz und der USN_RECORD_V2-Strukturreferenz. Ein typisches $J ist 30 MB bis mehrere GB groß, je nachdem, wie fsutil usn zum Installationszeitpunkt konfiguriert wurde. Der Standard auf Windows-Clients liegt bei etwa 32 MB; Server sind oft auf 1 GB oder mehr dimensioniert.
Während Sie $J ziehen, ziehen Sie auch $MFT vom selben Volume. Ohne sie kann der Parser Ihnen nur Blattdateinamen zeigen — jeder Eintrag ist an eine übergeordnete MFT-Eintragsnummer gebunden, nicht an einen Pfad. Mit beiden Dateien erhalten Sie vollständige Pfade gratis.
Aus einem forensischen Festplatten-Image (E01, dd, AFF4)
Der häufigste Fall in DFIR. Wählen Sie das Werkzeug, für das Sie bereits eine Lizenz haben.
FTK Imager (kostenlos, GUI)
File → Add Evidence Item, das Image öffnen.- Zu
[root]/$Extend/$UsnJrnlnavigieren. - Das Fenster zeigt
$Jund$Maxals Geschwisterzeilen. Rechtsklick auf$Jund Export Files wählen.
Das "Geschwisterzeilen"-Detail ist das, was Anfänger falsch machen: Es ist leicht, mit Rechtsklick die Elterndatei anzuklicken und den Standard-Stream zu exportieren, der leer ist. Wählen Sie speziell die $J-Zeile.
X-Ways Forensics (kommerziell)
Erweitern Sie Root directory → $Extend → $UsnJrnl. Der $J-Stream erscheint darunter. Recover/Copy schreibt ihn heraus. Gleicher Pfad, gleiche Falle wie bei FTK.
The Sleuth Kit (kostenlos, CLI, plattformübergreifend)
Wonach die meisten Mac/Linux-Analysten greifen. icat aus TSK ist das Standardwerkzeug:
# Den MFT-Eintrag für $UsnJrnl finden
fls -r -p image.dd | grep '\$UsnJrnl'
# Angenommen, es meldet Inode 81 und der $J-Stream ist Attribut 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin
Das <inode>-<type>-<id>-Tripel ist die Art, wie TSK alternative Streams adressiert. Welches Attribut auch immer mit :$J endet, ist das, was Sie wollen; fls zeigt das in seiner langen Ausgabe.
Velociraptor und KAPE
Für breite Triage-Sammlung ziehen sowohl Velociraptors Windows.NTFS.MFT-Artefaktpaket als auch Krolls KAPE das Journal automatisch. KAPE verwendet Target-Dateien (!ALL oder USNJournal); Velociraptor verwendet das parse_ntfs-Plugin. Beide greifen außerdem im selben Durchlauf $MFT und $LogFile, was Sie tatsächlich wollen.
Aus einem gemounteten Volume
Wenn das Image über ntfs-3g auf Linux oder Arsenal Image Mounter auf Windows schreibgeschützt gemountet ist, erscheint der Metadatenpfad als reguläre Datei, aber die meisten Werkzeuge weigern sich, alternative Streams transparent zu lesen.
Auf Linux mit ntfs-3g ist der Stream direkt lesbar:
sudo cat '/mnt/image/$Extend/$UsnJrnl:$J' > UsnJrnl-J.bin
Abhängig von der Mount-Option streams_interface kann :$J stattdessen als separate Pfadkomponente erscheinen. Prüfen Sie zuerst ls -la /mnt/image/\$Extend/.
Von einem Live-Windows-Host
Sie benötigen administrative Privilegien und einen NTFS-fähigen Reader, weil Windows den gewöhnlichen Zugriff auf Metadatendateien selbst von Administratorprozessen blockiert.
RawCopy
Eric Zimmermans Tool-Suite enthält RawCopy.exe (und RawCopy64.exe), das die Standard-Datei-API umgeht:
RawCopy.exe /FileNamePath:"C:\$Extend\$UsnJrnl:$J" /OutputPath:"D:\Out"
Das ist das, was KAPE unter der Haube verwendet, wenn sein USNJournal-Target läuft.
PowerForensics (reines PowerShell)
Wenn Sie keine Binärdatei ablegen können, liest PowerForensics rohe NTFS-Strukturen in reinem PowerShell:
Import-Module PowerForensics
Get-ForensicFileRecord -Path 'C:\$Extend\$UsnJrnl' |
ForEach-Object { $_.GetContent() } |
Set-Content -Path 'C:\Out\UsnJrnl-J.bin' -Encoding Byte
Eingebautes fsutil (Verifikation, keine Extraktion)
fsutil usn ist die unterstützte Steuerungsoberfläche für das Journal, aber es ist kein Extraktionswerkzeug. Es kann Einträge lesen, abfragen und löschen, nicht den vollständigen $J-Blob streamen. Wofür es nützlich ist, ist die Verifikation, dass das Journal aktiviert und dimensioniert ist, bevor Sie die Extraktion versuchen:
fsutil usn queryjournal C:
Status: 0x00000000 mit einer Maximum Size ungleich null bedeutet, dass das Journal aktiv ist. 0x80000005 bedeutet, dass es deaktiviert ist und es nichts zu extrahieren gibt, bis es über fsutil usn createjournal erstellt wird. Siehe die fsutil-usn-Referenz für die Lebenszyklus-Befehle und ihre Privilegienanforderungen.
Nach der Extraktion
Sobald Sie die $J-Datei haben, lassen Sie sie in den Parser oben auf dieser Seite fallen, oder füttern Sie sie in welches Offline-Tool auch immer Sie vertrauen: usnrs, PoorBillionaire/USN-Journal-Parser oder Eric Zimmermans MFTECmd (das $J trotz des Namens parst).
Greifen Sie gleichzeitig $MFT (Eintrag 0, gleicher $Extend-angrenzender Ort). Wenn beide Dateien bereitgestellt werden, läuft jeder der oben genannten Parser durch die Eltern-Referenzkette, um vollständige Pfade für jeden Journal-Eintrag aufzulösen. Ohne $MFT lesen Sie Dateinamen isoliert.
Während Sie NTFS-Metadaten erfassen, greifen Sie auch $LogFile, wenn Sie können. Es ist klein, es rotiert schnell, und bei Vorfällen, bei denen das Journal alleine nicht weit genug zurückreicht, ist $LogFile das Sicherheitsnetz. Der USN journal vs MFT vs LogFile-Beitrag deckt ab, wann jedes seinen Wert beweist.
Häufige Fallstricke
Explorer-Kopie. Drag-and-Drop von $UsnJrnl kopiert den unbenannten Standard-Stream, der leer ist. Sie erhalten keine Warnung. Verwenden Sie eines der obigen Werkzeuge.
Journal deaktiviert. Workgroup-Maschinen und aggressiv entschlackte Builds haben das Journal manchmal ausgeschaltet. fsutil usn queryjournal ist die günstigste Vorflug-Prüfung.
Sparse-Führende-Nullen. Das Journal ist ein Sparse-Stream. Die ersten paar hundert Megabyte einer frisch extrahierten $J können alle Nullen sein, bevor der erste echte Eintrag kommt. usnrs, der Parser auf dieser Seite und die meisten anderen überspringen automatisch. Wenn Sie einen Parser von Grund auf schreiben, scannen Sie nach dem ersten nicht-null Wort und suchen Sie nach einem plausiblen RecordLength-Wert.
Ringpuffer-Wrap. Je nach Aktivität kann das Journal umgelaufen sein — ältere Einträge sind weg. Der kleinste USN in der Datei sagt Ihnen, wie weit die Historie des Volumes tatsächlich zurückreicht. Behandeln Sie das als Ihren harten Boden.
Versehentliches Greifen von $Max. Gleiche Elterndatei, aber keine Einträge. Wenn Ihre Extraktion eine winzige Datei produziert (ein paar Bytes bis ein paar KB), haben Sie mit ziemlicher Sicherheit den falschen Stream gegriffen.
Weiterführende Literatur
- Microsoft Learn — Change Journals für die API-Oberfläche und den Lebenszyklus.
- Eric Zimmermans Tool-Dokumentation — RawCopy und der Rest der Suite decken die Live-Host-Erfassung von Anfang bis Ende ab.
- The Sleuth Kits
fls- undicat-Manpages — die kanonische CLI-Referenz für die Image-Level-Extraktion. - KAPE-Dokumentation — Kroll veröffentlicht Target-Dateien einschließlich
USNJournalund!BasicCollection; das Lesen des Target-XML ist der schnellste Weg zu lernen, wie eine gründliche Triage-Erfassung aussieht.