
Usa reglas YARA en trazas de Time Travel Debugging
Usa reglas YARA en trazas de Time Travel Debugging
Un binario simple que lanza calc.exe, empaquetado con UPX.
yara-ttd encuentra la cadena calc.exe en la memoria del módulo durante la creación de un hilo.
calc.exeEl binario probado descifra un shellcode y lo ejecuta en un nuevo hilo.
yara-ttd logra encontrar la cadena calc.exe en el heap al enganchar la función ntdll!NtCreateThreadEx.
YARA es una potente herramienta de coincidencia de patrones para binarios.
YARA es una herramienta destinada (aunque no limitada) a ayudar a los investigadores de malware a identificar y clasificar muestras de malware. Con YARA puedes crear descripciones de familias de malware (o lo que quieras describir) basadas en patrones textuales o binarios.
Gracias a YARA, podemos ahorrar mucho tiempo clasificando automáticamente muestras de malware en un pipeline antes de analizarlas.
Desafortunadamente, la mayoría de las muestras de malware están protegidas con diferentes tipos de empaquetadores. Un esquema clásico de empaquetado en tiempo de ejecución como UPX o VMProtect consiste en extraerse a sí mismo y ejecutar código ofuscado y a veces cifrado. Por lo tanto, YARA no puede tratar con binarios empaquetados porque no encontrará ninguna coincidencia en el código empaquetado.
Time Travel Debugging - o TTD - es una característica del depurador nativo de Windows, WinDbg.
Time Travel Debugging es una herramienta que te permite capturar una traza de tu proceso mientras se ejecuta y luego reproducirla más tarde tanto hacia adelante como hacia atrás. Time Travel Debugging (TTD) puede ayudarte a depurar problemas más fácilmente al permitirte "rebobinar" la sesión de tu depurador, en lugar de tener que reproducir el problema hasta encontrar el error.
Para el análisis de malware, TTD es una herramienta poderosa porque permite grabar la traza de un malware en una sandbox. Por lo tanto, podemos reproducir y compartir de forma segura el archivo grabado fuera de la sandbox para analizar el malware.
Además, TTD no es un depurador, por lo que no será detectado por técnicas clásicas anti-depuración como PEB.BeingDebugged.
Para un análisis más profundo de TTD desde el punto de vista de la seguridad, consulta este artículo: Inmersión profunda en el ecosistema TTD
Por supuesto, TTD es un software propietario, y este trabajo no podría existir sin ttd-bindings desarrollado por commial.
La idea detrás de yara-ttd es usar los archivos de traza grabados por TTD con el propio yara para derrotar a los empaquetadores.
Dado que yara no puede escanear el binario empaquetado por sí mismo, yara-ttd proporciona una forma de analizar el archivo de traza que contiene toda la información de tiempo de ejecución, incluido el proceso de desempaquetado.
Con yara-ttd, puedes seleccionar un conjunto de posiciones en el archivo de traza donde quieras escanear la memoria con tus reglas de yara.
Por lo tanto, ¡puedes enganchar el binario empaquetado donde quieras con tus reglas de yara!
yara-ttd ofrece varias estrategias de escaneo de memoria, como cuando se cargan módulos o cuando se asigna memoria virtual, que suelen usarse para almacenar el código del malware una vez desempaquetado.
Por ahora, yara-ttd solo es compatible con Windows, porque necesita interactuar con la API de TTD.
Primero, compila el proyecto:
mkdir build
cd build
cmake ..
cmake --build .
Luego, añade los archivos TTDReplay.dll y TTDReplayCPU.dll en el mismo directorio que el ejecutable.
Encontrarás estos archivos DLL en %LocalAppData%\Microsoft\WindowsApps\Microsoft.WinDbg_X\TTD
Primero necesitas grabar una traza (archivo .run) de tu programa.
Para obtener ayuda detallada sobre cómo grabar una traza TTD, consulta este tutorial.
Luego simplemente ejecuta:
.\yara-ttd path\to\rule path\to\trace\file
Hay tres modos para escanear memoria:
Puedes seleccionar el modo con -m:
.\yara-ttd -m 1 path\to\rule path\to\trace\file
Al igual que la CLI oficial de yara, puedes usar la opción -s para imprimir los detalles de las coincidencias, como la dirección de memoria y la subregla exacta que coincidió.
Debido a que TTD no almacena la estructura de la memoria, yara-ttd calcula antes del escaneo la estructura de las direcciones del heap para cada posición temporal.
Creará un archivo de caché con la extensión .tmp en la misma ruta que el archivo de traza para almacenar la estructura del heap.
Si quieres volver a ejecutar yara-ttd sobre una traza y cargar la estructura del heap desde el archivo de caché generado, puedes hacer simplemente:
.\yara-ttd -m 1 --cache=path\to\cache\file path\to\rule path\to\trace\file
Podemos acceder al rango completo de memoria de un proceso con TTD, que corresponde a las direcciones mínima y máxima devueltas por GetSystemInfo. Sin embargo, la mayoría de las veces, este rango es demasiado grande para ser escaneado sin ninguna optimización.
Las posiciones temporales predeterminadas que se escanearán son:
Con las opciones -t y -f, puedes seleccionar otras posiciones o llamadas a funciones para escanear:
.\yara-ttd -m 1 -t 3C1:A -t 5FF:22 -f ntdll!FreeVirtualMemory -f ntdll!NtCreateThreadEx path\to\rule path\to\trace\file
La opción -t espera posiciones TTD en el formato major:minor (ambas en hexadecimal, sin 0x).
La opción -f espera una cadena en el formato module_name!function_name.
También puedes añadir todas las funciones que quieras enganchar en un archivo:
> cat .\functions.txt
ntdll!FreeVirtualMemory
ntdll!NtCreateThreadEx
> .\yara-ttd -m 1 -F functions.txt path\to\rule path\to\trace\file
Si tienes varios archivos para escanear con yara-ttd, también puedes escanear un directorio completo.
yara-ttd ignorará todas las siguientes extensiones en la carpeta:
.tmp (archivos de caché generados por yara-ttd).idx (archivos de índice generados por ttd).err (archivos de error generados por ttd).out (archivos de registro generados por ttd)En el siguiente ejemplo, yara-ttd escaneará únicamente los archivos trace01.run y trace02.run.
> dir .\traces
trace01.run
trace01.out
trace01.idx
trace02.run
trace01.run.err
trace01.tmp
> .\yara-ttd path\to\rule .\traces
Alternativamente, puedes especificar todas las trazas que quieras escanear en un archivo y usar la opción --scan-list o -l. Escaneará los archivos listados, uno por línea:
> cat .\scan_me.txt
.\traces\trace01.run
.\traces\trace02.run
> .\yara-ttd -l path\to\rule .\scan_me.txt
Cuando se escanean múltiples archivos,
yara-ttdejecuta los escaneos uno tras otro, y no simultáneamente con hilos como la CLI original deyara.