← Volver al blog

Extraer $MFT de un host Windows en vivo sin romperlo

· 6 min de lectura

$MFT vive al inicio de cada volumen NTFS y Windows mantiene un bloqueo exclusivo sobre él mientras el volumen esté montado. xcopy fallará. Robocopy fallará. Un Copy-Item ingenuo de PowerShell fallará o, en ciertas configuraciones, producirá silenciosamente una copia truncada que parece correcta en tamaño y está internamente rota. Necesitas una herramienta que lea el volumen crudo, sortee el bloqueo del sistema de archivos y reensamble $MFT a partir de sus cluster runs.

Hay tres opciones en las que confío en la práctica. Cubren los casos de triage de hosts en vivo que veo semana tras semana.

Opción 1: KAPE, el predeterminado para IR

Si haces respuesta a incidentes y estás en un host Windows, la respuesta es KAPE con el target MFT. Saca $MFT, $MFTMirr, $LogFile, $UsnJrnl:$J, $Boot, $Secure:$SDS y un puñado de archivos relacionados de una pasada, preserva las marcas de tiempo originales de los archivos recolectados y escribe un árbol de directorios ordenado que puedes llevar al análisis.

kape.exe --tsource C: --target MFT --tdest C:\triage --vss

--vss es la flag que la gente olvida. Le dice a KAPE que también tire $MFT (y el resto del target) de cada Volume Shadow Copy de la fuente. Las instantáneas más antiguas son independientemente útiles y deberías recolectarlas por defecto. Mira Volume Shadow Copy y $MFT sobre qué hacer con ellas.

KAPE maneja el problema del archivo bloqueado usando el lector de volumen crudo de RawCopy.exe bajo el capó. El archivo recolectado es idéntico bit a bit a lo que una imagen forense produciría. Úsalo a menos que tengas una razón específica para no hacerlo.

Opción 2: FTK Imager, el fallback GUI

FTK Imager sigue siendo la herramienta GUI gratuita estándar para la adquisición. Es a lo que recurres cuando KAPE no está en el host y necesitas agarrar $MFT una vez y marcharte. El flujo:

  1. FileAdd Evidence ItemPhysical Drive (usa Logical Drive solo si trabajas desde una compartición remota o una imagen montada).
  2. Elige el disco y deja que enumere volúmenes.
  3. Expande la raíz del volumen NTFS en el árbol de la izquierda. $MFT, $MFTMirr, $LogFile, $Volume, $AttrDef, $Bitmap y el resto de los archivos de metadatos están visibles ahí aunque Explorer los oculte.
  4. Clic derecho en $MFTExport Files. Hashéalo (SHA-256) inmediatamente.

FTK Imager lee el volumen bloqueado mapeando el dispositivo físico y parseando NTFS él mismo. La exportación es el archivo real en disco, con arrays de fixup y todo.

El mismo flujo lee imágenes .dd, .E01 y .AFF4. Si tienes una imagen offline, móntala como evidencia y usa la misma ruta de exportación.

Opción 3: fsutil y una lectura cruda, cuando no puedes instalar nada

En un host endurecido donde no puedes dejar caer KAPE o FTK Imager, el comando integrado fsutil te dirá dónde vive $MFT:

fsutil file queryextents C:\$Mft

La salida es una lista de triplas (Virtual Cluster Number, Logical Cluster Number, longitud). Para convertir eso en un archivo lees el volumen crudo en cada LCN y ensamblas. PowerShell con un P/Invoke a CreateFile(\\.\C:, GENERIC_READ) hace el trabajo; también cualquiera de los pequeños módulos de lectura cruda de PowerShell en GitHub. RawCopy.exe de Joakim Schicht (el mismo código que usa KAPE bajo el capó) es el standalone más simple.

Es un componente, no una respuesta final. Úsalo cuando la política prohíba cargar otra herramienta.

Lo que la gente se equivoca

Copiar con Copy-Item -Force. A veces tiene éxito y obtienes un archivo. Ese archivo es lo que Windows devolvió de una llamada ReadFile normal contra el handle abierto, que en la mayoría de builds no es la $MFT real. Verifica siempre con fsutil file queryextents que el tamaño coincida.

Olvidar $MFTMirr y los logs de transacciones. $MFTMirr son dieciséis registros de seguro. Los logs de transacciones ($LogFile, más los archivos $TxfLog por recurso bajo $Extend\$RmMetadata) llevan las operaciones que pueden no haber llegado a $MFT todavía en el momento de la adquisición. Adquiérelos juntos. KAPE lo hace gratis.

No tirar el diario USN. $UsnJrnl:$J es esencial para la reconstrucción de la línea temporal (mira emparejar el diario con la tabla de archivos). Rota, lo que significa que esperar dos días para volver pierde evidencia. Cógelo a la primera.

Recolectar de un sistema vivo sin VSS. La MFT viva es consistente a nivel de volumen (NTFS es journaled), pero si el host está ocupado puedes recolectar una $MFT y un $UsnJrnl que difieran decenas de segundos porque la MFT se leyó primero. Toma una instantánea VSS y luego lee ambos desde la instantánea. La instantánea los congela.

Confiar en la marca de tiempo equivocada del archivo recolectado. La hora "modified" de la $MFT exportada es lo que tu herramienta de recolección configuró. Hashea los bytes, escribe el hash y la hora de adquisición en un log separado, y referencia ese log en todas partes.

Una adquisición basada en VSS que uso de verdad

Cuando estoy en un host en vivo y quiero una $MFT limpia en un instante específico más el diario más el log, este es el snippet:

vssadmin create shadow /for=C:

Lee el Shadow Copy Volume Name de la salida y luego usa esa ruta como fuente para la herramienta que prefieras:

robocopy "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN" "D:\triage" "$MFT" "$MFTMirr" "$LogFile" "$Extend\$UsnJrnl:$J" /R:1 /W:1

Robocopy puede leer desde una ruta de dispositivo VSS porque la instantánea está montada como un volumen separado sin el bloqueo exclusivo vivo. Hashea todo cuando aterrice, borra la instantánea si es tuya (vssadmin delete shadows /shadow={GUID}) y márchate.

Esta es la adquisición en vivo más limpia que conozco que no requiere instalar nada más allá de lo que viene en Windows.

Leer desde una imagen de disco

Si ya tienes una imagen .dd o .E01, te saltas el bloqueo por completo. Monta la imagen en solo lectura (xmount, ewfmount, vshadowmount para imágenes con VSS) o usa un parser que consuma imágenes directamente. $MFT siempre se sitúa en LCN MftStartLcn del sector de arranque en el offset 0 de la partición. icat -o <partition_offset> image.dd 0 del Sleuth Kit extrae el archivo. El inodo 0 es siempre $MFT.

Verificación antes del análisis

Hashea el archivo (SHA-256) inmediatamente tras la adquisición. Hashéalo de nuevo antes del parseo. Las discrepancias pasan más a menudo de lo que la gente admite, normalmente por presión de disco a mitad de adquisición o herramientas de copia que reintentan lecturas parciales en silencio.

Luego ejecuta una comprobación estructural. Parsea los primeros diez registros, confirma la firma FILE en cada uno, confirma que el registro 0 sea $MFT con una runlist $DATA autoreferencial, confirma que el registro 1 sea $MFTMirr, confirma que el registro 5 sea el directorio raíz con un atributo $INDEX_ROOT. Si algo de eso falla, la adquisición es mala y necesitas repetirla. MFTECmd y mft_dump lanzarán advertencias sobre un archivo corrupto; no las suprimas.

Lecturas adicionales

  • Eric Zimmerman, MFTECmd y KAPE. El repo KapeFiles define el target MFT canónico y vale la pena leerlo para entender qué se recolecta.
  • Joakim Schicht, RawCopy. El lector de volumen crudo bajo la mayoría de herramientas de adquisición MFT en vivo.
  • Microsoft, Volume Shadow Copy Service. Referencia de la semántica de instantáneas en la que te apoyas para adquisiciones limpias.

Recursos externos