Analisando a MFT para Recuperação de Arquivos Excluídos
Visão Geral
A Tabela Mestre de Arquivos ($MFT) do NTFS é o repositório central de metadados para cada arquivo e diretório em um volume NTFS. Cada arquivo é representado por pelo menos um registro MFT de 1024 bytes contendo atributos como $STANDARD_INFORMATION (timestamps, permissões), $FILE_NAME (nome, diretório pai, timestamps) e $DATA (conteúdo do arquivo ou ponteiros de execução de cluster). Quando um arquivo é excluído, seu registro MFT é marcado como inativo (flag InUse limpa) mas os metadados permanecem até que a entrada seja realocada por um novo arquivo. Essa persistência torna a análise da MFT uma técnica primária para recuperar evidências de arquivos excluídos, reconstruir linhas do tempo do sistema de arquivos e detectar atividades antiforenses como timestomping.
Quando Usar
- Ao investigar incidentes de segurança que exigem análise da MFT para recuperação de arquivos excluídos
- Ao construir regras de detecção ou consultas de caça a ameaças para este domínio
- Quando analistas de SOC precisam de procedimentos estruturados para este tipo de análise
- Ao validar a cobertura de monitoramento de segurança para técnicas de ataque relacionadas
Pré-requisitos
- Imagem de disco forense (formato E01, raw/dd, VMDK ou VHDX)
- MFTECmd (Eric Zimmerman) ou analyzeMFT (baseado em Python)
- FTK Imager, Arsenal Image Mounter ou similar para montagem de imagem
- Timeline Explorer ou Excel para análise CSV
- Python 3.8+ para scripts de análise personalizados
- Compreensão da estrutura interna do sistema de arquivos NTFS
Estrutura da MFT e Layout do Registro
Cabeçalho do Registro MFT
Cada registro MFT começa com a assinatura "FILE" (0x46494C45) e contém:
| Offset | Tamanho | Campo |
|---|---|---|
| 0x00 | 4 bytes | Assinatura ("FILE") |
| 0x04 | 2 bytes | Offset para sequência de atualização |
| 0x06 | 2 bytes | Tamanho da sequência de atualização |
| 0x08 | 8 bytes | Número de sequência do $LogFile |
| 0x10 | 2 bytes | Número de sequência |
| 0x12 | 2 bytes | Contagem de hard links |
| 0x14 | 2 bytes | Offset para o primeiro atributo |
| 0x16 | 2 bytes | Flags (0x01 = InUse, 0x02 = Diretório) |
| 0x18 | 4 bytes | Tamanho usado do registro MFT |
| 0x1C | 4 bytes | Tamanho alocado do registro MFT |
| 0x20 | 8 bytes | Referência ao registro base do arquivo |
| 0x28 | 2 bytes | Próximo ID de atributo |
Principais Atributos da MFT
| ID do Tipo | Nome | Descrição |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION | Timestamps, flags, ID do proprietário, ID de segurança |
| 0x30 | $FILE_NAME | Nome do arquivo, referência MFT do pai, timestamps |
| 0x40 | $OBJECT_ID | GUID único para o arquivo |
| 0x50 | $SECURITY_DESCRIPTOR | Permissões ACL |
| 0x60 | $VOLUME_NAME | Rótulo do volume (apenas arquivos de metadados do volume) |
| 0x80 | $DATA | Conteúdo do arquivo (residente se <700 bytes) ou lista de execução de cluster |
| 0x90 | $INDEX_ROOT | Raiz do índice B-tree para diretórios |
| 0xA0 | $INDEX_ALLOCATION | Entradas do índice B-tree para diretórios grandes |
| 0xB0 | $BITMAP | Bitmap de alocação para índice ou MFT |
Técnicas de Recuperação de Arquivos Excluídos
Técnica 1: Análise de Registro MFT com MFTECmd
# Extrair $MFT da imagem forense usando KAPE ou FTK Imager
# Analisar o $MFT com MFTECmd
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# Filtrar por arquivos excluídos (InUse = FALSE) no Timeline Explorer
# Procurar entradas onde a coluna InUse é False
Identificando Arquivos Excluídos na Saída CSV:
InUse= False indica um registro excluído ou realocadoParentPathmostra o local original do arquivo antes da exclusãoFileSizemostra o tamanho original (pode ainda ser recuperável)- Os timestamps nos atributos
$STANDARD_INFORMATIONe$FILE_NAMEpersistem
Técnica 2: Análise do Journal USN ($UsnJrnl:$J)
O Journal USN registra todas as alterações em arquivos em um volume NTFS, incluindo criação, exclusão, renomeação e eventos de modificação de dados.
# Analisar Journal USN com MFTECmd
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# Códigos de motivo USN chave para evidência de exclusão:
# USN_REASON_FILE_DELETE = 0x00000200
# USN_REASON_CLOSE = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000
Técnica 3: Análise de Transações do $LogFile
O $LogFile armazena registros de transações NTFS que podem revelar operações de arquivo mesmo após o Journal USN ter sido ciclado.
# Analisar $LogFile com LogFileParser
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# Procurar operações REDO e UNDO indicando exclusão de arquivo:
# - DeallocateFileRecordSegment
# - DeleteAttribute
# - UpdateResidentValue (limpando a flag InUse)
Técnica 4: Análise de Espaço Slack da MFT
O espaço slack da MFT existe entre o final da porção usada de um registro MFT e o final dos 1024 bytes alocados. Esta área pode conter resquícios de registros de arquivos anteriores.
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""Extrair e analisar o espaço slack da MFT em busca de resquícios de arquivos excluídos."""
with open(mft_path, "rb") as f:
record_size = 1024
record_num = 0
slack_findings = []
while True:
record = f.read(record_size)
if len(record) < record_size:
break
# Verificar assinatura FILE
if record[:4] != b"FILE":
record_num += 1
continue
# Obter tamanho usado do offset 0x18
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# Verificar se o slack contém strings legíveis ou cabeçalhos de atributo
if any(c > 0x20 and c < 0x7F for c in slack[:50]):
slack_findings.append({
"record": record_num,
"used_size": used_size,
"slack_size": record_size - used_size,
"slack_preview": slack[:100].hex()
})
record_num += 1
return slack_findings
Correlação com Artefatos de Suporte
Referência Cruzada da MFT com $Recycle.Bin
# Analisar Lixeira com RBCmd
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# Correlacionar: Arquivos $I contêm o caminho original e timestamp de exclusão
# Corresponder números de entrada MFT de arquivos $R de volta aos registros MFT originais
Referência Cruzada da MFT com Cópias de Sombra de Volume
# Listar cópias de sombra de volume
vssadmin list shadows
# Montar cópias de sombra e extrair $MFT de cada uma
# Comparar registros MFT entre cópias de sombra para rastrear alterações de arquivos ao longo do tempo
Valor Forense
- Recuperação de metadados de arquivos excluídos: Nome original, caminho, tamanho e timestamps
- Reconstrução de linha do tempo: Eventos de criação, modificação, acesso e exclusão de arquivos
- Detecção de timestomping: Comparação de timestamps $SI vs $FN
- Orientação para carving de dados: Execuções de cluster da MFT apontam para o conteúdo do arquivo no disco
- Detecção antiforense: Identificação de registros MFT apagados ou manipulados
Referências
- Análise Forense Avançada da MFT NTFS: https://www.deaddisk.com/posts/ntfs-mft-advanced-forensic-analysis-guide/
- Valor Forense do Espaço Slack da MFT: https://www.sygnia.co/blog/the-forensic-value-of-mft-slack-space/
- Documentação do MFTECmd: https://ericzimmerman.github.io/
- SANS FOR500: Análise Forense Windows
Exemplo de Saída
$ MFTECmd.exe -f "C:\Evidence\$MFT" --csv /analysis/mft_output
MFTECmd v1.2.2 - Analisador MFT
==============================
Entrada: C:\Evidence\$MFT (Tamanho: 384 MB)
Total de Entradas MFT: 395.264
Analisando entradas MFT... Concluído (12,4 segundos)
--- Resumo de Recuperação de Arquivos Excluídos ---
Total de Entradas: 395.264
Arquivos Ativos: 245.832
Arquivos Excluídos: 149.432
Recuperáveis: 87.234 (dados residentes ou clusters não realocados)
Parcialmente Recuperáveis: 31.456 (alguns clusters sobrescritos)
Irrecuperáveis: 30.742 (todos os clusters realocados)
--- Arquivos Excluídos Recentemente (Janela do Incidente: 2024-01-15 a 2024-01-18) ---
Entrada MFT | Nome do Arquivo | Caminho | Tamanho | Excluído (UTC) | Recuperável
------------|----------------------------------|-----------------------------------|------------|------------------------|------------
148923 | exfil_tool.exe | C:\ProgramData\Updates\ | 1.258.496 | 2024-01-17 02:45:12 | SIM
148924 | exfil_tool.log | C:\ProgramData\Updates\ | 45.312 | 2024-01-17 02:45:14 | SIM
149001 | passwords.txt | C:\Users\jsmith\Desktop\ | 2.048 | 2024-01-17 02:50:33 | SIM
149150 | scan_results.csv | C:\Users\jsmith\AppData\Local\Temp | 892.416 | 2024-01-17 03:00:01 | PARCIAL
149200 | mimikatz.exe | C:\Windows\Temp\ | 1.250.816 | 2024-01-18 01:15:22 | SIM
149201 | sekurlsa.log | C:\Windows\Temp\ | 32.768 | 2024-01-18 01:15:25 | SIM
149302 | .bash_history | C:\Users\jsmith\ | 4.096 | 2024-01-18 03:00:00 | NÃO
149400 | ClearEventLogs.ps1 | C:\Windows\Temp\ | 1.536 | 2024-01-18 03:01:12 | SIM
--- Análise de Timestamps $STANDARD_INFORMATION vs $FILE_NAME (Detecção de Timestomping) ---
Entrada MFT | Nome do Arquivo | $SI Criado | $FN Criado | Delta | Veredito
------------|--------------------|---------------------|---------------------|-----------|----------
148923 | exfil_tool.exe | 2023-06-15 10:00:00 | 2024-01-15 14:34:02 | -214 dias | TIMESTOMPED
149200 | mimikatz.exe | 2022-01-01 00:00:00 | 2024-01-16 02:30:15 | -745 dias | TIMESTOMPED
Arquivos recuperados exportados para: /analysis/mft_output/recovered/
Relatório CSV completo: /analysis/mft_output/mft_analysis.csv (395.264 linhas)
CSV de linha do tempo: /analysis/mft_output/mft_timeline.csv