Análisis de MFT para Recuperación de Archivos Eliminados
Resumen
La Tabla Maestra de Archivos ($MFT) de NTFS es el repositorio central de metadatos para cada archivo y directorio en un volumen NTFS. Cada archivo está representado por al menos un registro MFT de 1024 bytes que contiene atributos como $STANDARD_INFORMATION (marcas de tiempo, permisos), $FILE_NAME (nombre, directorio padre, marcas de tiempo) y $DATA (contenido del archivo o punteros a clusters). Cuando un archivo se elimina, su registro MFT se marca como inactivo (bandera InUse eliminada), pero los metadatos permanecen hasta que la entrada sea reasignada por un nuevo archivo. Esta persistencia hace que el análisis de MFT sea una técnica principal para recuperar evidencia de archivos eliminados, reconstruir líneas de tiempo del sistema de archivos y detectar actividad antiforense como timestomping.
Cuándo Usar
- Al investigar incidentes de seguridad que requieren analizar MFT para recuperación de archivos eliminados
- Al construir reglas de detección o consultas de caza de amenazas para este dominio
- Cuando los analistas de SOC necesitan procedimientos estructurados para este tipo de análisis
- Al validar la cobertura de monitoreo de seguridad para técnicas de ataque relacionadas
Requisitos Previos
- Imagen de disco forense (formato E01, raw/dd, VMDK o VHDX)
- MFTECmd (Eric Zimmerman) o analyzeMFT (basado en Python)
- FTK Imager, Arsenal Image Mounter o similar para montar imágenes
- Timeline Explorer o Excel para análisis CSV
- Python 3.8+ para scripts de análisis personalizados
- Comprensión de los internos del sistema de archivos NTFS
Estructura del Registro MFT y su Diseño
Cabecera del Registro MFT
Cada registro MFT comienza con la firma "FILE" (0x46494C45) y contiene:
| Offset | Tamaño | Campo |
|---|---|---|
| 0x00 | 4 bytes | Firma ("FILE") |
| 0x04 | 2 bytes | Offset a la secuencia de actualización |
| 0x06 | 2 bytes | Tamaño de la secuencia de actualización |
| 0x08 | 8 bytes | Número de secuencia de $LogFile |
| 0x10 | 2 bytes | Número de secuencia |
| 0x12 | 2 bytes | Contador de enlaces duros |
| 0x14 | 2 bytes | Offset al primer atributo |
| 0x16 | 2 bytes | Banderas (0x01 = InUse, 0x02 = Directorio) |
| 0x18 | 4 bytes | Tamaño usado del registro MFT |
| 0x1C | 4 bytes | Tamaño asignado del registro MFT |
| 0x20 | 8 bytes | Referencia al registro base del archivo |
| 0x28 | 2 bytes | ID del siguiente atributo |
Atributos Clave de MFT
| ID de Tipo | Nombre | Descripción |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION | Marcas de tiempo, banderas, ID de propietario, ID de seguridad |
| 0x30 | $FILE_NAME | Nombre de archivo, referencia MFT padre, marcas de tiempo |
| 0x40 | $OBJECT_ID | GUID único para el archivo |
| 0x50 | $SECURITY_DESCRIPTOR | Permisos ACL |
| 0x60 | $VOLUME_NAME | Etiqueta del volumen (solo archivos de metadatos del volumen) |
| 0x80 | $DATA | Contenido del archivo (residente si <700 bytes) o lista de clusters |
| 0x90 | $INDEX_ROOT | Raíz del índice B-tree para directorios |
| 0xA0 | $INDEX_ALLOCATION | Entradas del índice B-tree para directorios grandes |
| 0xB0 | $BITMAP | Mapa de bits de asignación para el índice o MFT |
Técnicas de Recuperación de Archivos Eliminados
Técnica 1: Análisis de Registros MFT con MFTECmd
# Extraer $MFT de la imagen forense usando KAPE o FTK Imager
# Analizar el $MFT con MFTECmd
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# Filtrar archivos eliminados (InUse = FALSE) en Timeline Explorer
# Buscar entradas donde la columna InUse sea False
Identificación de Archivos Eliminados en la Salida CSV:
InUse= False indica un registro eliminado o reasignadoParentPathmuestra la ubicación original del archivo antes de la eliminaciónFileSizemuestra el tamaño original (aún puede ser recuperable)- Las marcas de tiempo en los atributos
$STANDARD_INFORMATIONy$FILE_NAMEpersisten
Técnica 2: Análisis del Diario USN ($UsnJrnl:$J)
El Diario USN registra todos los cambios en los archivos de un volumen NTFS, incluyendo creación, eliminación, renombrado y modificación de datos.
# Analizar el Diario USN con MFTECmd
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# Códigos de razón USN clave para evidencia de eliminación:
# 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álisis de Transacciones de $LogFile
El $LogFile almacena registros de transacciones NTFS que pueden revelar operaciones de archivos incluso después de que el Diario USN haya sido ciclado.
# Analizar $LogFile con LogFileParser
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# Buscar operaciones REDO y UNDO que indiquen eliminación de archivos:
# - DeallocateFileRecordSegment
# - DeleteAttribute
# - UpdateResidentValue (limpiando la bandera InUse)
Técnica 4: Análisis de Espacio Slack de MFT
El espacio slack de MFT existe entre el final de la porción usada de un registro MFT y el final de los 1024 bytes asignados. Esta área puede contener restos de registros de archivos anteriores.
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""Extraer y analizar el espacio slack de MFT en busca de restos de archivos eliminados."""
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 firma FILE
if record[:4] != b"FILE":
record_num += 1
continue
# Obtener tamaño usado desde el offset 0x18
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# Verificar si el slack contiene cadenas legibles o cabeceras de atributos
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
Correlación con Artefactos de Apoyo
Correlación MFT con $Recycle.Bin
# Analizar la Papelera de Reciclaje con RBCmd
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# Correlacionar: Los archivos $I contienen la ruta original y la marca de tiempo de eliminación
# Coincidir los números de entrada MFT de los archivos $R con los registros MFT originales
Correlación MFT con Copias Sombra de Volumen
# Listar copias sombra de volumen
vssadmin list shadows
# Montar copias sombra y extraer $MFT de cada una
# Comparar registros MFT entre copias sombra para rastrear cambios de archivos a lo largo del tiempo
Valor Forense
- Recuperación de metadatos de archivos eliminados: Nombre de archivo original, ruta, tamaño y marcas de tiempo
- Reconstrucción de líneas de tiempo: Eventos de creación, modificación, acceso y eliminación de archivos
- Detección de timestomping: Comparación de marcas de tiempo de $SI vs $FN
- Guía para carving de datos: Los clusters de MFT apuntan al contenido del archivo en el disco
- Detección antiforense: Identificación de registros MFT borrados o manipulados
Referencias
- Guía de Análisis Forense Avanzado de MFT de NTFS: https://www.deaddisk.com/posts/ntfs-mft-advanced-forensic-analysis-guide/
- Valor Forense del Espacio Slack de MFT: https://www.sygnia.co/blog/the-forensic-value-of-mft-slack-space/
- Documentación de MFTECmd: https://ericzimmerman.github.io/
- SANS FOR500: Análisis Forense de Windows
Ejemplo de Salida
$ MFTECmd.exe -f "C:\Evidence\$MFT" --csv /analysis/mft_output
MFTECmd v1.2.2 - Analizador de MFT
==============================
Entrada: C:\Evidence\$MFT (Tamaño: 384 MB)
Total de Entradas MFT: 395,264
Analizando entradas MFT... Hecho (12.4 segundos)
--- Resumen de Recuperación de Archivos Eliminados ---
Entradas Totales: 395,264
Archivos Activos: 245,832
Archivos Eliminados: 149,432
Recuperables: 87,234 (datos residentes o clusters no reasignados)
Parcialmente Recuperables: 31,456 (algunos clusters sobrescritos)
No Recuperables: 30,742 (todos los clusters reasignados)
--- Archivos Eliminados Recientemente (Ventana de Incidente: 2024-01-15 a 2024-01-18) ---
Entrada MFT | Nombre de Archivo | Ruta | Tamaño | Eliminado (UTC) | Recuperable
------------|-----------------------------------|------------------------------------|-----------|------------------------|------------
148923 | exfil_tool.exe | C:\ProgramData\Updates\ | 1,258,496 | 2024-01-17 02:45:12 | SÍ
148924 | exfil_tool.log | C:\ProgramData\Updates\ | 45,312 | 2024-01-17 02:45:14 | SÍ
149001 | passwords.txt | C:\Users\jsmith\Desktop\ | 2,048 | 2024-01-17 02:50:33 | SÍ
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 | SÍ
149201 | sekurlsa.log | C:\Windows\Temp\ | 32,768 | 2024-01-18 01:15:25 | SÍ
149302 | .bash_history | C:\Users\jsmith\ | 4,096 | 2024-01-18 03:00:00 | NO
149400 | ClearEventLogs.ps1 | C:\Windows\Temp\ | 1,536 | 2024-01-18 03:01:12 | SÍ
--- Análisis de Marcas de Tiempo $STANDARD_INFORMATION vs $FILE_NAME (Detección de Timestomping) ---
Entrada MFT | Nombre de Archivo | $SI Creado | $FN Creado | Delta | Veredicto
------------|--------------------|---------------------|---------------------|----------|-----------
148923 | exfil_tool.exe | 2023-06-15 10:00:00 | 2024-01-15 14:34:02 | -214 días | TIMESTOMPED
149200 | mimikatz.exe | 2022-01-01 00:00:00 | 2024-01-16 02:30:15 | -745 días | TIMESTOMPED
Archivos recuperados exportados a: /analysis/mft_output/recovered/
Reporte CSV completo: /analysis/mft_output/mft_analysis.csv (395,264 filas)
CSV de línea de tiempo: /analysis/mft_output/mft_timeline.csv