Como extrair $UsnJrnl:$J de uma imagem de disco (ou de um sistema activo)

Guia prático para retirar o journal USN do NTFS de uma imagem forense, de um volume montado ou de um host Windows activo — com FTK Imager, X-Ways, The Sleuth Kit, fsutil e PowerShell.

Por 6 min de leitura

A parte mais difícil de trabalhar com o journal USN normalmente não é fazer-lhe parse. É pôr-lhe as mãos em cima logo de início. $UsnJrnl:$J é um fluxo de dados alternativo, não um ficheiro normal, pelo que não aparece no Explorador, não sobrevive a uma copy ingénua e o robocopy mente silenciosamente sobre o ter copiado. Este é o guia prático para tirar mesmo os bytes do disco, organizado pelos três locais onde normalmente se encontra: uma imagem forense, um volume montado e uma máquina activa.

O que está à procura

O journal vive em:

\$Extend\$UsnJrnl:$J

$Extend é um directório de metadados NTFS oculto e $J é um de dois fluxos alternativos no ficheiro de metadados $UsnJrnl. O outro fluxo é $Max, que apenas guarda o tamanho máximo configurado do journal e o allocation delta — nenhuns registos. Se extrair $Max por engano, fica com alguns bytes de configuração inútil. Escolha sempre $J.

A Microsoft documenta o layout na referência Change Journals e na referência da estrutura USN_RECORD_V2. Um $J típico tem entre 30 MB e vários GB, dependendo da configuração feita pelo fsutil usn no momento da instalação. O padrão em clientes Windows é cerca de 32 MB; servidores costumam ser dimensionados em 1 GB ou mais.

Enquanto extrai $J, extraia também o $MFT do mesmo volume. Sem ele, o parser só consegue mostrar nomes de ficheiro folha — cada registo está ligado a um número de entrada MFT do pai, não a um caminho. Com ambos os ficheiros obtém caminhos completos gratuitamente.

A partir de uma imagem de disco forense (E01, dd, AFF4)

O caso mais comum em DFIR. Escolha a ferramenta para a qual já tem licença.

FTK Imager (gratuito, GUI)

  1. File → Add Evidence Item, abra a imagem.
  2. Navegue até [root]/$Extend/$UsnJrnl.
  3. O painel mostra $J e $Max como linhas irmãs. Clique com o botão direito em $J e escolha Export Files.

O pormenor das «linhas irmãs» é o que os recém-chegados costumam errar: é fácil clicar com o botão direito no ficheiro pai e exportar o fluxo predefinido, que está vazio. Escolha especificamente a linha de $J.

X-Ways Forensics (comercial)

Expanda Root directory → $Extend → $UsnJrnl. O fluxo $J aparece por baixo. Recover/Copy escreve-o para um ficheiro. Mesmo caminho, mesma armadilha que no FTK.

The Sleuth Kit (gratuito, CLI, cross-platform)

A escolha da maior parte dos analistas em Mac/Linux. O icat do TSK é a ferramenta padrão:

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

# Suponha que reporta o inode 81 e o fluxo $J é o atributo 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin

O triplo <inode>-<type>-<id> é a forma como o TSK endereça fluxos alternativos. Aquele cujo nome de atributo termina em :$J é o que pretende; o fls mostra-o na sua saída longa.

Velociraptor e KAPE

Para colheita ampla de triagem, o pacote de artefactos Windows.NTFS.MFT do Velociraptor e o KAPE da Kroll puxam o journal automaticamente. O KAPE usa targets (!ALL ou USNJournal); o Velociraptor usa o plugin parse_ntfs. Ambos também recolhem $MFT e $LogFile na mesma varredura, que é o que efectivamente quer.

A partir de um volume montado

Se a imagem estiver montada em só-leitura via ntfs-3g no Linux ou Arsenal Image Mounter no Windows, o caminho dos metadados aparece como ficheiro normal, mas a maioria das ferramentas recusa-se a ler fluxos alternativos de forma transparente.

No Linux com ntfs-3g, o fluxo é legível directamente:

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

Conforme a opção de montagem streams_interface, :$J pode aparecer como um componente de caminho separado. Verifique primeiro com ls -la /mnt/image/\$Extend/.

A partir de um host Windows activo

Precisa de privilégios administrativos e de um leitor que perceba NTFS, porque o Windows bloqueia o acesso normal a ficheiros de metadados mesmo a partir de processos de administrador.

RawCopy

A suite de ferramentas do Eric Zimmerman inclui o RawCopy.exe (e RawCopy64.exe), que contorna a API de ficheiros padrão:

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

É o que o KAPE usa por baixo quando o seu target USNJournal corre.

PowerForensics (pure PowerShell)

Se não puder largar um binário, o PowerForensics lê estruturas NTFS em bruto em 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 embutido (verificação, não extracção)

fsutil usn é a superfície de controlo suportada para o journal, mas não é uma ferramenta de extracção. Consegue ler, consultar e apagar registos, mas não fazer stream do blob completo de $J. Para o que serve é para verificar se o journal está activado e dimensionado antes de tentar a extracção:

fsutil usn queryjournal C:

Status: 0x00000000 com Maximum Size diferente de zero significa que o journal está activo. 0x80000005 significa que está desactivado e não há nada para extrair até ser criado via fsutil usn createjournal. Veja a referência fsutil usn para os comandos de ciclo de vida e os requisitos de privilégios.

Após a extracção

Quando tiver o ficheiro $J, largue-o no parser no topo desta página, ou alimente-o a qualquer ferramenta offline em que confie: usnrs, PoorBillionaire/USN-Journal-Parser, ou o MFTECmd do Eric Zimmerman (que parseia $J apesar do nome).

Apanhe o $MFT (entrada 0, mesma localização adjacente a $Extend) ao mesmo tempo. Com ambos os ficheiros fornecidos, qualquer dos parsers acima percorre a cadeia de referências parentais para resolver caminhos completos para cada registo do journal. Sem $MFT está a ler nomes de ficheiros isolados.

Enquanto adquire metadados NTFS, apanhe também o $LogFile se puder. É pequeno, roda depressa, e em incidentes em que apenas o journal não recua o suficiente, o $LogFile é a rede de segurança. O artigo USN journal vs MFT vs LogFile explica quando cada um justifica o seu peso.

Armadilhas comuns

Cópia pelo Explorador. Arrastar-e-largar de $UsnJrnl copia o fluxo predefinido sem nome, que está vazio. Não recebe um aviso. Use uma das ferramentas acima.

Journal desactivado. Máquinas em workgroup e builds agressivamente debloated têm por vezes o journal desligado. fsutil usn queryjournal é o pré-voo mais barato.

Zeros esparsos iniciais. O journal é um fluxo esparso. Os primeiros muitos megabytes de um $J recém-extraído podem ser todos zeros antes do primeiro registo real. usnrs, o parser desta página e a maioria dos outros saltam-nos automaticamente. Se está a escrever um parser do zero, faça scan da primeira palavra não-zero e procure um valor RecordLength plausível.

Volta do buffer circular. Conforme a actividade, o journal pode ter dado a volta — entradas mais antigas desapareceram. O menor USN no ficheiro diz-lhe até onde recua de facto o histórico do volume. Trate isso como o seu chão rígido.

Apanhar $Max por engano. Mesmo ficheiro pai, mas sem registos. Se a sua extracção produz um ficheiro minúsculo (alguns bytes a alguns KB), quase de certeza apanhou o fluxo errado.

Leituras adicionais

  • Microsoft Learn — Change Journals para a superfície de API e o ciclo de vida.
  • Documentação das ferramentas do Eric Zimmerman — RawCopy e o resto da suite cobrem aquisição em host activo ponto a ponto.
  • Páginas man do fls e do icat do The Sleuth Kit — a referência CLI canónica para extracção ao nível da imagem.
  • Documentação do KAPE — a Kroll publica target files incluindo USNJournal e !BasicCollection; ler os XML dos targets é a forma mais rápida de aprender com o que se parece uma aquisição de triagem completa.