Cómo extraer $UsnJrnl:$J de una imagen de disco (o de un sistema en vivo)

Una guía práctica para sacar el USN Journal NTFS de una imagen forense, un volumen montado o un host Windows en vivo, con FTK Imager, X-Ways, The Sleuth Kit, fsutil y PowerShell.

Por 6 min de lectura

La parte más difícil de trabajar con el USN journal no suele ser parsearlo. Es poner las manos sobre el archivo en primer lugar. $UsnJrnl:$J es un flujo de datos alternativo, no un archivo regular, así que no aparece en el Explorer, no sobrevive a un copy ingenuo, y robocopy te mentirá silenciosamente sobre haberlo extraído. Esta es la guía de campo para sacar de verdad los bytes del disco, desglosada por los tres lugares donde típicamente te los encuentras: una imagen forense, un volumen montado y una máquina viva.

Lo que buscas

El journal vive en:

\$Extend\$UsnJrnl:$J

$Extend es un directorio de metadatos NTFS oculto y $J es uno de los dos flujos alternativos en el archivo de metadatos $UsnJrnl. El otro flujo es $Max, que solo contiene el tamaño máximo configurado del journal y el delta de asignación, sin registros. Si por error extraes $Max obtienes unos pocos bytes de configuración inútil. Elige siempre $J.

Microsoft documenta el layout en la referencia Change Journals y la referencia de estructura USN_RECORD_V2. Un $J típico va de 30 MB a varios GB según cómo se configurase fsutil usn en el momento de la instalación. El default en clientes Windows ronda los 32 MB; los servidores suelen estar dimensionados a 1 GB o más.

Mientras sacas $J, saca también $MFT del mismo volumen. Sin ella el parser solo puede enseñarte nombres hoja: cada registro está atado a un número de entrada MFT padre, no a una ruta. Con ambos archivos consigues rutas completas gratis.

Desde una imagen de disco forense (E01, dd, AFF4)

El caso más común en DFIR. Elige la herramienta de la que ya tienes licencia.

FTK Imager (gratis, GUI)

  1. File → Add Evidence Item, abre la imagen.
  2. Navega a [root]/$Extend/$UsnJrnl.
  3. El panel muestra $J y $Max como filas hermanas. Clic derecho en $J y elige Export Files.

El detalle de "fila hermana" es lo que los recién llegados confunden: es fácil hacer clic derecho en el archivo padre y exportar el flujo predeterminado, que está vacío. Selecciona la fila $J específicamente.

X-Ways Forensics (comercial)

Expande Root directory → $Extend → $UsnJrnl. El flujo $J aparece debajo. Recover/Copy lo escribe fuera. Misma ruta, misma trampa que en FTK.

The Sleuth Kit (gratis, CLI, multiplataforma)

A lo que recurren la mayoría de analistas Mac/Linux. icat de TSK es la herramienta estándar:

# Encontrar la entrada MFT para $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'

# Supongamos que informa inode 81 y el flujo $J es atributo 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin

El triple <inode>-<type>-<id> es cómo TSK direcciona los flujos alternativos. El atributo cuyo nombre acabe en :$J es el que quieres; fls lo muestra en su salida larga.

Velociraptor y KAPE

Para recolección amplia de triage, el paquete de artefactos Windows.NTFS.MFT de Velociraptor y KAPE de Kroll sacan el journal automáticamente. KAPE usa archivos target (!ALL o USNJournal); Velociraptor usa el plugin parse_ntfs. Ambos también cogen $MFT y $LogFile en la misma pasada, que es lo que realmente quieres.

Desde un volumen montado

Si la imagen está montada en solo lectura vía ntfs-3g en Linux o Arsenal Image Mounter en Windows, la ruta de metadatos aparece como un archivo regular pero la mayoría de herramientas se niegan a leer flujos alternativos de forma transparente.

En Linux con ntfs-3g, el flujo es leíble directamente:

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

Dependiendo de la opción de montaje streams_interface, :$J puede aparecer como un componente de ruta separado en su lugar. Comprueba ls -la /mnt/image/\$Extend/ primero.

Desde un host Windows en vivo

Necesitas privilegios administrativos y un lector NTFS-aware, porque Windows bloquea el acceso ordinario a archivos de metadatos incluso desde procesos administrador.

RawCopy

La suite de herramientas de Eric Zimmerman incluye RawCopy.exe (y RawCopy64.exe), que salta la API estándar de archivos:

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

Esto es lo que KAPE usa por debajo cuando corre su target USNJournal.

PowerForensics (PowerShell puro)

Si no puedes soltar un binario, PowerForensics lee estructuras NTFS en bruto en 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 integrado (verificación, no extracción)

fsutil usn es la superficie de control soportada para el journal, pero no es una herramienta de extracción. Puede leer, consultar y borrar registros, no streamear el blob completo de $J. Para lo que sí es útil es para verificar que el journal está habilitado y dimensionado antes de intentar la extracción:

fsutil usn queryjournal C:

Status: 0x00000000 con un Maximum Size distinto de cero significa que el journal está activo. 0x80000005 significa que está deshabilitado y no hay nada que extraer hasta que se cree vía fsutil usn createjournal. Mira la referencia fsutil usn para los comandos de ciclo de vida y sus requisitos de privilegios.

Tras la extracción

Una vez tengas el archivo $J, déjalo en el parser de arriba de esta página, o pásalo a la herramienta offline en la que confíes: usnrs, PoorBillionaire/USN-Journal-Parser o el MFTECmd de Eric Zimmerman (que parsea $J a pesar del nombre).

Coge $MFT (entrada 0, misma ubicación adyacente a $Extend) al mismo tiempo. Con ambos archivos suministrados, cualquiera de los parsers anteriores recorre la cadena de referencias padre para resolver rutas completas en cada registro del journal. Sin $MFT estás leyendo nombres de archivo en aislamiento.

Mientras adquieres metadatos NTFS, coge también $LogFile si puedes. Es pequeño, rota rápido, y en incidentes en los que el journal solo no llega lo bastante atrás, $LogFile es la red de seguridad. El post USN journal vs MFT vs LogFile cubre cuándo se gana su sitio cada uno.

Trampas comunes

Copia con Explorer. El arrastrar y soltar de $UsnJrnl copia el flujo predeterminado sin nombre, que está vacío. No recibirás advertencia. Usa una de las herramientas anteriores.

Journal deshabilitado. Las máquinas de workgroup y las builds agresivamente debloated a veces tienen el journal apagado. fsutil usn queryjournal es el chequeo pre-vuelo más barato.

Ceros iniciales sparse. El journal es un flujo sparse. Los primeros cientos de megabytes de un $J recién extraído pueden ser todos ceros antes del primer registro real. usnrs, el parser de esta página y la mayoría de los demás los saltan automáticamente. Si escribes un parser desde cero, escanea por la primera palabra distinta de cero y busca un valor RecordLength plausible.

Ring buffer wrap. Dependiendo de la actividad, el journal puede haber dado la vuelta: las entradas más antiguas se han ido. El USN más pequeño en el archivo te dice hasta dónde llega realmente la historia del volumen. Trátalo como tu suelo duro.

Coger $Max por error. Mismo archivo padre, pero sin registros. Si tu extracción produce un archivo diminuto (unos pocos bytes a unos pocos KB), casi seguro cogiste el flujo equivocado.

Lecturas adicionales

  • Microsoft Learn — Change Journals para la superficie de API y el ciclo de vida.
  • Documentación de las herramientas de Eric Zimmerman — RawCopy y el resto de la suite cubren la adquisición en host vivo de extremo a extremo.
  • Las man pages de fls e icat de The Sleuth Kit — la referencia CLI canónica para la extracción a nivel de imagen.
  • Documentación de KAPE — Kroll publica archivos target incluyendo USNJournal y !BasicCollection; leer el XML del target es la forma más rápida de aprender qué pinta tiene una adquisición de triage decente.