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)
File → Add Evidence Item, apri l'immagine.- Scendi in
[root]/$Extend/$UsnJrnl. - Il pannello mostra
$Je$Maxcome righe fratelle. Clic destro su$Je 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, l'artefatto Windows.Forensics.Usn di Velociraptor e KAPE di Kroll tirano giù il journal automaticamente. KAPE usa file target (FileSystem o KapeTriage, che includono entrambi il target $J); Velociraptor usa il plugin parse_usn. Il target FileSystem di KAPE prende 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
RawCopy di Joakim Schicht è disponibile come RawCopy.exe (e RawCopy64.exe) e bypassa l'API file standard:
RawCopy.exe /FileNamePath:'C:\$Extend\$UsnJrnl:$J' /OutputPath:'D:\Out'
KAPE non richiama RawCopy, ma esegue internamente lo stesso tipo di lettura NTFS raw quando il suo target $J incontra lo stream bloccato.
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.
- RawCopy di Joakim Schicht — il readme documenta ogni opzione, inclusa l'estrazione da file immagine e shadow copy.
- Le man page di
flseicatdi The Sleuth Kit — la reference CLI canonica per l'estrazione a livello di immagine. - Documentazione KAPE — Kroll pubblica file target inclusi
$J,FileSystemeKapeTriage; leggere l'XML del target è il modo più veloce per imparare com'è fatta un'acquisizione di triage curata.