← Retour au blog

Comment extraire $UsnJrnl:$J d'une image disque (ou d'un système en production)

Guide pratique pour extraire le journal USN NTFS d'une image forensique, d'un volume monté ou d'un poste Windows en production — avec FTK Imager, X-Ways, The Sleuth Kit, fsutil et PowerShell.

4 min de lecture

Le plus dur, avec le journal USN, ce n'est souvent pas de le parser — c'est de mettre la main sur le fichier. $UsnJrnl:$J est un flux de données alternatif, pas un fichier ordinaire : il n'apparaît pas dans l'Explorateur et ne survit pas à un simple copy. Cet article passe en revue les façons réalistes de l'extraire dans les trois contextes où on le rencontre : image forensique, volume monté, machine en production.

Ce qu'on cherche

Le journal vit au chemin :

\$Extend\$UsnJrnl:$J

$Extend est un dossier de métadonnées NTFS caché, et $J est l'un des deux flux alternatifs du fichier de métadonnées $UsnJrnl (l'autre, $Max, ne contient que des métadonnées de taille). Microsoft décrit l'organisation dans la référence interne NTFS et la structure USN_RECORD_V2.

Un $J typique fait de 30 Mo à plusieurs Go selon la configuration de fsutil usn.

Depuis une image disque forensique (E01, dd, AFF4)

C'est le cas le plus fréquent en DFIR.

FTK Imager (gratuit, GUI)

  1. Ouvrir l'image (File → Add Evidence Item).
  2. Naviguer dans [root]/$Extend/$UsnJrnl.
  3. Clic droit sur le flux $JExport Files.

FTK Imager traite les flux alternatifs comme des entrées de premier niveau — ils apparaissent en lignes sœurs à côté du fichier. Bien sélectionner la ligne $J (pas $Max).

X-Ways Forensics (commercial)

X-Ways expose le même chemin. Dans l'arbre, déplier Root directory → $Extend → $UsnJrnl, sélectionner le flux $J et faire Recover/Copy.

The Sleuth Kit (gratuit, CLI, multi-plateforme)

C'est l'outil de référence côté Mac/Linux. L'utilitaire pertinent est icat de TSK :

# Trouver l'entrée MFT de $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'
# Supposons inode 81 et flux $J en attribut 128-2 :
icat image.dd 81-128-2 > UsnJrnl-J.bin

Le triplet <inode>-<type>-<id> est la manière TSK d'adresser un flux alternatif. Le type/id requis est celui dont le nom d'attribut se termine par :$Jfls l'affiche dans sa sortie longue.

Velociraptor / KAPE

Pour des collectes de triage à grande échelle, l'artefact Windows.NTFS.MFT de Velociraptor et KAPE savent récupérer le journal automatiquement. KAPE utilise des targets (!ALL ou USNJournal), Velociraptor utilise le plugin parse_ntfs.

Depuis un volume monté

Si l'image est montée (en lecture seule, via mount -t ntfs-3g ou Arsenal Image Mounter sur Windows), le chemin apparaît comme un fichier ordinaire mais la plupart des outils refusent de lire les flux alternatifs de façon transparente.

Sous Linux avec ntfs-3g, on peut lire le flux directement :

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

Selon l'option de montage streams_interface, :$J peut apparaître comme un chemin distinct au lieu d'un suffixe — vérifier avec ls -la /mnt/image/\$Extend/.

Depuis un poste Windows en production

Il faut les droits administrateur et un lecteur NTFS-aware, parce que Windows bloque l'accès ordinaire aux fichiers de métadonnées.

PowerShell avec lecture brute du volume

Les outils d'Eric Zimmerman incluent RawCopy.exe (ou RawCopy64.exe), qui contourne l'API fichier standard :

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

Si on ne peut pas déposer de binaire, PowerForensics fait la même chose en pur PowerShell :

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

fsutil natif

fsutil usn est la surface de contrôle supportée pour le journal, mais ce n'est pas un outil d'extraction — il sait lire, requêter et supprimer des enregistrements, pas streamer le blob complet $J. Il est en revanche utile pour vérifier que le journal est actif et bien dimensionné avant extraction :

fsutil usn queryjournal C:

Un Status: 0x00000000 avec une Maximum Size non nulle signale un journal actif. Un 0x80000005 ou équivalent signifie que le journal est désactivé et qu'il n'y a rien à extraire — voir la référence fsutil usn pour les commandes de cycle de vie.

Après l'extraction

Une fois le fichier $J en main, on le dépose sur ce site ou on le passe à l'outil de son choix. Les octets carvés sont exactement le format d'entrée attendu par usnrs, PoorBillionaire/USN-Journal-Parser, ou MFTECmd d'Eric Zimmerman.

Si on récupère aussi le $MFT (même voisinage $Extend, entrée MFT 0), on peut résoudre des chemins complets au lieu de simples noms de fichiers — voir la résolution de chemin dans usnrs et l'entrée $MFT de notre parseur.

Pièges classiques

  • Copier avec l'Explorateur : le glisser-déposer de $UsnJrnl copie silencieusement le flux par défaut (vide) et pas $J. Toujours utiliser un outil forensique.
  • Journal désactivé : sur des machines de workgroup, le journal est parfois désactivé. fsutil usn queryjournal est le check le moins coûteux.
  • $J commence par des zéros épars : le journal est un flux sparse — les premières centaines de Mo peuvent n'être que des zéros avant le premier vrai enregistrement. usnrs, notre parseur et la plupart des autres les sautent automatiquement. Pour écrire son propre parseur, Skip::find_first_record dans usnrs est la référence la plus courte.
  • Cycle du flux : selon l'activité du volume, le buffer circulaire du journal peut avoir tourné — les entrées les plus anciennes ont disparu. Le plus petit USN trouvé indique jusqu'où remonte l'historique disponible.