
Use regras YARA em rastros (traces) de Time Travel Debugging
Use regras YARA em rastros de Time Travel Debugging
Um binário simples que executa calc.exe, empacotado com UPX.
o yara-ttd encontra a string calc.exe na memória do módulo, durante a criação de uma thread.
calc.exeO binário testado descriptografa um shellcode e o executa em uma nova thread.
o yara-ttd consegue encontrar a string calc.exe no heap ao fazer hook na função ntdll!NtCreateThreadEx.
YARA é uma poderosa ferramenta de correspondência de padrões para binários.
YARA é uma ferramenta voltada a (mas não limitada a) ajudar pesquisadores de malware a identificar e classificar amostras de malware. Com YARA, você pode criar descrições de famílias de malware (ou o que você quiser descrever) com base em padrões textuais ou binários.
Graças ao YARA, podemos economizar muito tempo ao classificar automaticamente amostras de malware em um pipeline antes de analisá-las.
Infelizmente, a maioria das amostras de malware é protegida por diferentes tipos de packers. Um esquema clássico de runtime-packer, como UPX ou VMProtect, consiste em autoextrair e executar código ofuscado e às vezes criptografado. Portanto, o YARA não consegue lidar com binários empacotados, pois não encontrará correspondências no código empacotado.
Time Travel Debugging - ou TTD - é um recurso do depurador nativo do Windows, o WinDbg.
Time Travel Debugging é uma ferramenta que permite capturar um rastro do seu processo enquanto ele executa e, depois, reproduzi-lo tanto para frente quanto para trás. O Time Travel Debugging (TTD) pode ajudar você a depurar problemas com mais facilidade, permitindo "rebobinar" a sessão do depurador, em vez de ter que reproduzir o problema até encontrar o bug.
Para a análise de malware, o TTD é uma ferramenta poderosa, pois permite gravar o rastro de um malware em uma sandbox. Assim, podemos reproduzir e compartilhar com segurança o arquivo gravado fora da sandbox para analisar o malware. Além disso, o TTD não é um depurador, portanto não será detectado por técnicas clássicas de anti-debug, como PEB.BeingDebugged. Para uma análise mais aprofundada do TTD sob o ponto de vista da segurança, confira este artigo: Deep dive no ecossistema TTD
É claro que o TTD é um software proprietário, e este trabalho não poderia existir sem os ttd-bindings desenvolvidos por commial.
A ideia por trás do yara-ttd é usar os arquivos de rastro gravados pelo TTD com o próprio yara para derrotar os packers.
Como o yara não consegue escanear o binário empacotado em si, o yara-ttd oferece uma maneira de analisar o arquivo de rastro que contém todas as informações de tempo de execução, incluindo o processo de desempacotamento.
Com o yara-ttd, você pode selecionar um conjunto de posições no arquivo de rastro onde deseja escanear a memória com suas regras yara. Assim, você pode fazer hook no binário empacotado onde quiser com suas regras yara!
O yara-ttd fornece várias estratégias de escaneamento de memória, como quando módulos são carregados ou quando memória virtual é alocada, que costumam ser usadas para armazenar o código do malware depois de desempacotado.
Por enquanto, o yara-ttd só oferece suporte ao Windows, pois precisa interagir com a API do TTD.
Primeiro, compile o projeto:
mkdir build
cd build
cmake ..
cmake --build .
Em seguida, adicione os arquivos TTDReplay.dll e TTDReplayCPU.dll no mesmo diretório do executável. Você encontrará esses arquivos DLL em %LocalAppData%\Microsoft\WindowsApps\Microsoft.WinDbg_X\TTD
Primeiro, você precisa gravar um rastro (arquivo .run) do seu programa. Para obter ajuda detalhada sobre como gravar um rastro TTD, consulte este tutorial.
Em seguida, basta executar:
.\yara-ttd path\to\rule path\to\trace\file
Há três modos para escanear memória:
Você pode selecionar o modo com -m:
.\yara-ttd -m 1 path\to\rule path\to\trace\file
Como na CLI oficial do yara, você pode usar a flag -s para imprimir os detalhes das correspondências, como o endereço de memória e a sub-regra exata que correspondeu.
Como o TTD não armazena a estrutura da memória, o yara-ttd calcula antes do escaneamento a estrutura dos endereços do heap para cada posição de tempo. Ele criará um arquivo de cache com a extensão .tmp no mesmo caminho do arquivo de rastro para armazenar a estrutura do heap. Se você quiser executar o yara-ttd novamente em um rastro e carregar a estrutura do heap do arquivo de cache gerado, basta fazer:
.\yara-ttd -m 1 --cache=path\to\cache\file path\to\rule path\to\trace\file
Com o TTD, podemos acessar toda a faixa de memória de um processo, que corresponde aos endereços mínimo e máximo retornados por GetSystemInfo. No entanto, na maioria das vezes, essa faixa é extensa demais para ser escaneada sem qualquer otimização.
As posições de tempo padrão que serão escaneadas são:
Com as flags -t e -f, você pode selecionar outras posições ou chamadas de função 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
A flag -t espera posições TTD no formato major:minor (ambas em hexadecimal, sem 0x). A flag -f espera uma string no formato module_name!function_name.
Você também pode adicionar todas as funções que deseja interceptar em um arquivo:
> cat .\functions.txt
ntdll!FreeVirtualMemory
ntdll!NtCreateThreadEx
> .\yara-ttd -m 1 -F functions.txt path\to\rule path\to\trace\file
Se você tiver vários arquivos para escanear com yara-ttd, também pode escanear um diretório inteiro. O yara-ttd ignorará todas as seguintes extensões na pasta:
.tmp (arquivos de cache gerados por yara-ttd).idx (arquivos de índice gerados por ttd).err (arquivos de erro gerados por ttd).out (arquivos de log gerados por ttd)No exemplo a seguir, o yara-ttd escaneará apenas os arquivos trace01.run e trace02.run.
> dir .\traces
trace01.run
trace01.out
trace01.idx
trace02.run
trace01.run.err
trace01.tmp
> .\yara-ttd path\to\rule .\traces
Alternativamente, você pode especificar todos os rastros que deseja escanear em um arquivo e usar a flag --scan-list ou -l. Ele escaneará os arquivos listados, um por linha:
> cat .\scan_me.txt
.\traces\trace01.run
.\traces\trace02.run
> .\yara-ttd -l path\to\rule .\scan_me.txt
Ao escanear vários arquivos, o
yara-ttdexecuta os escaneamentos um após o outro, e não simultaneamente com threading como a CLI original doyara.