Come estrarre $UsnJrnl:$J da un'immagine disco (o da un sistema vivo)

Una guida pratica per tirar fuori il USN Journal NTFS da un'immagine forense, un volume montato o un host Windows vivo, con FTK Imager, X-Ways, The Sleuth Kit, fsutil e PowerShell.

Di 6 min di lettura

La parte più dura di lavorare con il USN journal di solito non è parsarlo. È mettere le mani sul file in primo luogo. $UsnJrnl:$J è un flusso di dati alternativo, non un file regolare, quindi non appare in Explorer, non sopravvive a un copy ingenuo, e robocopy ti mentirà silenziosamente sul fatto di averlo tirato giù. Questa è la guida sul campo per ottenere davvero i byte dal disco, suddivisa per i tre posti dove tipicamente li incontri: un'immagine forense, un volume montato e una macchina viva.

Cosa stai cercando

Il journal vive in:

\$Extend\$UsnJrnl:$J

$Extend è una directory di metadati NTFS nascosta e $J è uno dei due flussi alternativi sul file di metadati $UsnJrnl. L'altro flusso è $Max, che contiene solo la dimensione massima configurata del journal e il delta di allocazione — nessun record. Se per errore estrai $Max ottieni pochi byte di config inutile. Scegli sempre $J.

Microsoft documenta il layout nella reference Change Journals e nella reference della struttura USN_RECORD_V2. Un $J tipico va da 30 MB a diversi GB a seconda di come fsutil usn è stato configurato al momento dell'installazione. Il default sui client Windows è intorno ai 32 MB; i server sono spesso dimensionati a 1 GB o più.

Mentre tiri $J, tira anche $MFT dallo stesso volume. Senza, il parser può solo mostrarti nomi foglia: ogni record è legato a un numero di entry MFT padre, non a un percorso. Con entrambi i file ottieni i percorsi completi gratis.

Da un'immagine disco forense (E01, dd, AFF4)

Il caso più comune in DFIR. Scegli lo strumento per cui hai già una licenza.

FTK Imager (gratuito, GUI)

  1. File → Add Evidence Item, apri l'immagine.
  2. Scendi in [root]/$Extend/$UsnJrnl.
  3. Il pannello mostra $J e $Max come righe fratelle. Clic destro su $J e scegli Export Files.

Il dettaglio "riga fratella" è ciò che i neofiti sbagliano: è facile fare clic destro sul file padre ed esportare il flusso predefinito, che è vuoto. Scegli specificamente la riga $J.

X-Ways Forensics (commerciale)

Espandi Root directory → $Extend → $UsnJrnl. Il flusso $J appare sotto. Recover/Copy lo scrive fuori. Stesso percorso, stessa trappola di FTK.

The Sleuth Kit (gratuito, CLI, multipiattaforma)

A cui ricorrono la maggior parte degli analisti Mac/Linux. icat di TSK è lo strumento standard:

# Trovare l'entry MFT per $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'

# Supponiamo riporti inode 81 e che il flusso $J sia l'attributo 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin

La tripla <inode>-<type>-<id> è il modo in cui TSK indirizza i flussi alternativi. L'attributo il cui nome finisce in :$J è quello che vuoi; fls lo mostra nel suo output lungo.

Velociraptor e KAPE

Per la raccolta di triage ampia, il pacchetto di artefatti Windows.NTFS.MFT di Velociraptor e KAPE di Kroll tirano giù il journal automaticamente. KAPE usa file target (!ALL o USNJournal); Velociraptor usa il plugin parse_ntfs. Entrambi prendono anche $MFT e $LogFile nella stessa passata, che è ciò che vuoi davvero.

Da un volume montato

Se l'immagine è montata in sola lettura via ntfs-3g su Linux o Arsenal Image Mounter su Windows, il percorso di metadati appare come un file regolare ma la maggior parte degli strumenti si rifiuta di leggere i flussi alternativi in modo trasparente.

Su Linux con ntfs-3g, il flusso è leggibile direttamente:

sudo cat '/mnt/image/$Extend/$UsnJrnl:$J' > UsnJrnl-J.bin

A seconda dell'opzione di mount streams_interface, :$J può apparire come un componente di percorso separato. Controlla prima ls -la /mnt/image/\$Extend/.

Da un host Windows vivo

Servono privilegi amministrativi e un reader NTFS-aware, perché Windows blocca l'accesso ordinario ai file di metadati anche da processi amministratore.

RawCopy

La tool suite di Eric Zimmerman include RawCopy.exe (e RawCopy64.exe), che bypassa l'API file standard:

RawCopy.exe /FileNamePath:"C:\$Extend\$UsnJrnl:$J" /OutputPath:"D:\Out"

Questo è ciò che KAPE usa sotto il cofano quando gira il suo target USNJournal.

PowerForensics (PowerShell puro)

Se non puoi lasciar cadere un binario, PowerForensics legge strutture NTFS grezze in PowerShell puro:

Import-Module PowerForensics
Get-ForensicFileRecord -Path 'C:\$Extend\$UsnJrnl' |
  ForEach-Object { $_.GetContent() } |
  Set-Content -Path 'C:\Out\UsnJrnl-J.bin' -Encoding Byte

fsutil integrato (verifica, non estrazione)

fsutil usn è la superficie di controllo supportata per il journal ma non è uno strumento di estrazione. Può leggere, interrogare e cancellare record, non streammare il blob $J completo. A cui serve davvero è verificare che il journal sia abilitato e dimensionato prima di tentare l'estrazione:

fsutil usn queryjournal C:

Status: 0x00000000 con una Maximum Size diversa da zero significa che il journal è attivo. 0x80000005 significa che è disabilitato e non c'è nulla da estrarre finché non viene creato via fsutil usn createjournal. Vedi la reference fsutil usn per i comandi del ciclo di vita e i loro requisiti di privilegi.

Dopo l'estrazione

Una volta che hai il file $J, mettilo nel parser in cima a questa pagina, o passalo allo strumento offline di cui ti fidi: usnrs, PoorBillionaire/USN-Journal-Parser o MFTECmd di Eric Zimmerman (che parsa $J nonostante il nome).

Prendi $MFT (entry 0, stessa posizione adiacente a $Extend) nello stesso momento. Con entrambi i file forniti, qualsiasi dei parser sopra cammina la catena di riferimento del padre per risolvere percorsi completi per ogni record del journal. Senza $MFT stai leggendo nomi di file in isolamento.

Mentre acquisisci metadati NTFS, prendi anche $LogFile se puoi. È piccolo, ruota velocemente, e su incidenti in cui il journal da solo non arriva indietro abbastanza, $LogFile è la rete di sicurezza. Il post USN journal vs MFT vs LogFile copre quando ciascuno si guadagna il posto.

Insidie comuni

Copia Explorer. Il drag-and-drop di $UsnJrnl copia il flusso predefinito senza nome, che è vuoto. Non ti darà avvisi. Usa uno degli strumenti sopra.

Journal disabilitato. Le macchine workgroup e le build aggressivamente snellite a volte hanno il journal spento. fsutil usn queryjournal è il check pre-volo più economico.

Zeri iniziali sparsi. Il journal è un flusso sparso. I primi qualche centinaio di megabyte di un $J appena estratto possono essere tutti zeri prima del primo record reale. usnrs, il parser di questa pagina e la maggior parte degli altri saltano automaticamente. Se scrivi un parser da zero, cerca la prima parola non-zero e un valore RecordLength plausibile.

Wrap del ring buffer. A seconda dell'attività, il journal può aver girato — le voci più vecchie sono andate. L'USN più piccolo nel file ti dice fino a dove arriva davvero la storia del volume. Trattalo come il tuo pavimento duro.

Prendere $Max per sbaglio. Stesso file padre, ma senza record. Se la tua estrazione produce un file minuscolo (qualche byte a qualche KB), quasi certamente hai preso il flusso sbagliato.

Letture aggiuntive

  • Microsoft Learn — Change Journals per la superficie API e il ciclo di vita.
  • Documentazione degli strumenti di Eric Zimmerman — RawCopy e il resto della suite coprono l'acquisizione su host vivo end-to-end.
  • Le man page di fls e icat di The Sleuth Kit — la reference CLI canonica per l'estrazione a livello di immagine.
  • Documentazione KAPE — Kroll pubblica file target inclusi USNJournal e !BasicCollection; leggere l'XML del target è il modo più veloce per imparare com'è fatta un'acquisizione di triage curata.