Quando analisamos um pedaço de malware, ele pode ser feito em diferentes linguagens de programação, pode ser um script, pode ser um downloader ou pode ser um arquivo executável para Windows, Linux ou outro sistema operacional.

Por estas razões, vamos mencionar diferentes ferramentas livres para Linux que nos permitem analisar diferentes pedaços de malware que têm como alvo diferentes sistemas operacionais. É importante ter em mente que quando formos realizar a análise, ela deverá ser feita em uma máquina virtual. Se for necessário executar o malware, use uma máquina virtual que possa executar o sistema operacional visado pelo malware. Por exemplo, no caso de malware desenvolvido para Windows, é aconselhável ter outra máquina virtual rodando Windows.

Por outro lado, também é importante lembrar os dois tipos mais populares de análise que podem ser realizados sobre malware: análise estática e análise dinâmica.

A análise estática é baseada na obtenção do máximo de informações possíveis de um malware sem a sua execução. Desta forma, conseguimos coletar todas as informações que podem ser úteis para ter uma melhor compreensão da ameaça e realizar outros tipos de análise; por exemplo, análise de código, onde é realizada engenharia reversa, ou análise dinâmica, onde a amostra em questão é executada.

Na análise dinâmica ou análise comportamental, o objetivo é executar a amostra de malware para ver como ele interage com a máquina e coletar informações a partir desta interação. Por exemplo, onde ele realiza a persistência, se ele se comunica contra um servidor, capturando o tráfego da rede, entre outras coisas. Em alguns casos, a depuração é considerada parte da análise dinâmica, uma vez que a amostra está sendo executada enquanto analisamos seu código.

Primeiros passos e comandos úteis no Linux

Quando começamos a analisar um fragmento de malware que podemos ou não ter conhecimento prévio, é aconselhável começar com uma coleta básica das informações que podemos obter a partir dele e depois usar uma ferramenta que nos permitirá fazer uma análise mais extensa. Portanto, vamos mencionar diferentes comandos fornecidos pelo Linux, que podem ser muito úteis nesta primeira etapa.

Comando file

Este comando, nativo do sistema operacional, nos permitirá determinar o formato e tipo de um arquivo, além da extensão que ele possa ter. Por exemplo, às vezes acontece que os desenvolvedores de malware modificam as extensões de arquivos para enganar suas vítimas.

A maneira de executá-lo é file name_archive.

Ilustração 1. obtenção de informações básicas de diferentes arquivos usando o comando file.

Comando objdump

Ilustração 1. obtenção de informações básicas de diferentes arquivos usando o comando file.

Algumas das opções com as quais este comando pode ser executado são:

  • -x, --all-headers - Exibe o conteúdo dos headers de um arquivo.
  • -d, --disassemble - Exibe o conteúdo do código assembler da seção executável de um arquivo.
  • -T, --dynamic-syms - Exibe o conteúdo da tabela de símbolos dinâmicos para um arquivo ELF.
  • -M, --disassembler-options=OPT - Suportado apenas para alguns arquivos, ele passa informações específicas para objdump sobre como exibir o código do assembler. Algumas das opções podem ser:
    • x86-64
    • att (AT&T)
    • intel
    • i386

Ilustração 2: Obtenção dos headers de um arquivo com o comando objdump.

Ilustração 3. Visualização do código do assembler utilizando a ferramenta objdump.

Comando xxd

Este comando nos permitirá ver a representação hexadecimal, entre outros, de um arquivo. Algo semelhante ao que poderíamos fazer com a ferramenta HxD no Windows.

Algumas opções com as quais ele pode ser executado são:

  • -C - Exibe os bytes de um arquivo e sua respectiva representação ASCII, se houver.
  • -l - Exibe as informações do arquivo até o tamanho desejado.

Ilustração 4: Obtenção apenas dos primeiros 200 bytes de um arquivo com sua representação ASCII.

Comando strings

Similar à ferramenta Windows Sysinternals, este comando nos permitirá obter as cadeias de um arquivo. Embora esta ferramenta possa obter as strings que não fornecem informações importantes, o laboratório da ESET desenvolveu uma ferramenta chamada LOTS para extrair as strings mais relevantes de um arquivo que pode ser usado durante uma análise.

Ilustração 5: Exemplo de uso do comando Strings.

Comando hexedit

Este comando não só permite visualizar um arquivo em sua representação hexadecimal, como o comando xxd pode fazer, mas também editar o arquivo. Ele pode ser útil quando estamos analisando malware e precisamos fazer alterações em seu código, por exemplo, alterar um salto condicional, modificar a chamada para uma função que torna o programa inativo por um certo tempo, entre outras.

É importante ter uma cópia do arquivo antes de fazer qualquer modificação no mesmo.

Algumas opções para o uso deste comando são:

  • F2 – Salvar o arquivo.
  • F3 – Carregar um arquivo.
  • Ctrl+G – Mover para a posição X no arquivo.
  • Tab – Movendo-se entre a visão hexadecimal e sua representação ASCII.

Ilustração 6. Visualização de um arquivo com a ferramenta hexedit.

Engenharia reversa e análise dinâmica

Com as ferramentas acima mencionadas, podemos coletar informações básicas de um arquivo, que podem ser muito úteis para engenharia reversa, análise dinâmica ou outras análises mais exaustivas. Portanto, nesta parte, vamos nos concentrar em diferentes ferramentas que nos permitem realizar engenharia reversa, depuração e análise dinâmica.

No caso da engenharia reversa, há muitas ferramentas que são utilizadas tanto no Windows quanto no Linux, como a IDA ou a Ghidra, entre outras. Neste caso, vamos falar do radare2, pois ele oferece algumas características interessantes.

Radare2

O Radare2 é um framework de código aberto que é usado via linha de comando e nos permite realizar análises estáticas, engenharia reversa ou depuração no arquivo que queremos analisar.

Algumas características interessantes do Radare2 que podemos mencionar são:

  • Suporte para arquiteturas múltiplas, tais como x86-64, ARM, MIPS, SPARC, Gameboy, entre outras.
  • Suporte para diferentes tipos de arquivos, tais como ELF, PE, MZ, Java, Android, Nintendo DS ROM, entre outros.
  • Suporte a diferentes sistemas operacionais, como Windows, Linux, SerenityOS, entre outros.
  • Oferece diferentes plugins, como o r2ghidra, que integra a ferramenta descompilador Ghidra no topo do radare2.

Alguns comandos que podemos usar nesta estrutura são:

  • aaa – Análise de todas as funções do arquivo.
  • afl – Liste as funções detectadas no arquivo.
  • pdf @ nome_função – Mostrar o código de montagem de uma função pontual.
  • iS –Mostrar as seções do arquivo.
  • izz – Encontrar e exibir strings dentro de todo o arquivo.
  • s <address> – Procura por um endereço e se posiciona no mesmo.
  • V –Exibe a visualização hexadecimal semelhante ao comando xxd anteriormente.
  • VV – Ativa a visualização gráfica onde estamos localizados no arquivo.
  • ? – Comando de ajuda utilizado para exibir mais informações sobre os comandos a serem utilizados.

Ilustração 7: Carregamento e análise de uma amostra na estrutura do Radare2.

Ilustração 8. representação hexadecimal de um arquivo de Radare2.

Ilustração 9. diferentes opções para usar no comando pd no Radare2.

Ilustração 10. visão gráfica do IDA Freeware vs. visão gráfica do Radare2.

Comandos ltrace e strace

Para análise dinâmica, dois comandos a serem considerados são ltrace e strace. Estes são usados para acompanhar as chamadas para funções de biblioteca (ltrace ) ou funções de sistema (strace) durante a execução de um arquivo.

Estes comandos são para arquivos que podem ser executados pelo sistema operacional Linux, por exemplo, um arquivo ELF.

Algumas opções com as quais o comando ltrace pode ser executado são:

-o nombre_archivo – Salvar as informações em um arquivo.

-s – Também mostra as chamadas ao sistema (system calls).

-c – Mostra o número de vezes que cada função foi chamada.

Algumas opções com as quais o comando strace pode ser executado são:

  • -o nombre_archivo - Guarda a informação para um arquivo.
  • -e trace=syscall - Permite especificar que tipo de sistema chama que deseja ver. Algumas destas opções podem ser:
    • Network
    • Process
    • Memory

Ilustração 11. Exemplo do ltrace.

Ilustração 12. Exemplo do strace.

GNU Debugger (GDB)

GDB ou GNU Debugger é um  debugger que nos dá a possibilidade de executar um programa, instrução por instrução para analisar o seu comportamento, semelhante a x64dbg para Windows. Suporta diferentes tipos de linguagens tais como Assembly, C++, Go, Rust, entre outras, e está disponível para diferentes plataformas Unix, bem como para algumas variantes de Windows e Mac OS.

Ilustração 13. Carregamento de um arquivo em gdb.

Abaixo, mencionamos diferentes comandos a executar em gdb que nos permitirão realizar diferentes ações:

  • starti - Executar o programa e colocar umbreakpoint na primeira instrução.
  • b/break - Colocar um breakpoint num determinado lugar do programa.
  • r/run - Executar o programa.
  • informação sobre a opção - Lista diferentes, informações com base na opção desejada, alguns exemplos são:
    • breakpoints
    • registers
    • functions
  • disassemble - Mostra o código de montagem de uma função ou fragmento de uma função, por exemplo: disassemble main.
  • set disassembly-flavor SINTAXIS - Permite-lhe alterar o tipo de sintaxe com que o código do assembler é exibido. Ex: set disassembly-flavor Intel.
  • ni - executar até à próxima instrução.
  • c/continue - continuar a execução do programa.

Ilustração 14: Exemplode um malware debuggeado com gdb.

A GDB também permite o uso de layouts, que nos permitem visualizar diferentes informações durante a depuração de um arquivo, como valores de registro ou código assembler, entre outros.

Ilustração 15: Configuração de layouts de linguagem assembler e sintaxes no GDB.

Por padrão, a GDB não oferece uma interface muito fácil de usar, embora o uso de layouts possa ser de grande ajuda. É por isso que existem vários plugins que podem ser integrados para tornar a ferramenta mais confortável de usar.

Um destes plugins é o pwndbg. Este plugin permite integrar diferentes dados na linha de comando ao depurar um arquivo, tais como valores de registros, a próxima instrução a ser executada, informações sobre stack de programas, entre outras coisas.

Ilustração 16. Plugin pwndbg integrado sobre gdb.

Análise do tráfego na rede

Nesta seção vamos falar sobre duas ferramentas que nos permitirão capturar e analisar o tráfego de rede gerado pelo malware que estamos analisando.

FakeNet-NG

FakeNet-NG é uma ferramenta freeware desenvolvida pela equipe FLARE para a captura de pacotes de tráfego de rede. Esta ferramenta nos ajudará a realizar algumas das seguintes ações:

  • Interceptar o tráfego de rede a partir da máquina.
  • Redirecionar todo o tráfego ou apenas um protocolo com a possibilidade de simular um serviço de rede.
  • Armazenar todo o tráfego capturado.
  • Executar automaticamente comandos com base no comportamento do malware.
  • Criar um proxy para detectar comunicações e ser capaz de redirecioná-las.
  • Gerar uma blacklist ou whitelist para ignorar o tráfego de qualquer serviço, por exemplo, porta 53 para TCP/UDP.

Para poder realizar qualquer uma ou todas as ações acima, a FakeNet-NG possui um arquivo de configuração no qual diferentes regras podem ser carregadas para realizar estas ações.

Ilustração17. Executando a FakeNet-NG onde é possível ver o caminho para o arquivo de configuração.

Ilustração 18. arquivo de configuração FakeNet-NG.

Todo o tráfego que é capturado pela ferramenta é armazenado em um arquivo com extensão .pcap, que pode ser aberto com diferentes ferramentas, tais como Wireshark ou NetworkMiner. Esta última será mencionada abaixo.

NetworkMiner

NetworkMiner é uma ferramenta de código aberto que permite capturar o tráfego gerado em uma máquina, de forma semelhante à Wireshark, para diferentes sistemas operacionais, tais como Windows, Linux, MAC OS ou FreeBSD.

Por outro lado, esta ferramenta pode abrir arquivos .pcap para análise. Após abrir um destes arquivos, as informações contidas são mostradas divididas em diferentes abas onde poderemos ver, por exemplo, os hosts detectados na captura de tráfego e diferentes informações sobre eles como endereço MAC, número de pacotes enviados e recebidos, hostname, entre outros.

Ilustração 19. NetworkMiner.

Conclusão

Revisamos várias ferramentas diferentes que podem ser usadas para realizar uma varredura de malware no Linux. Enquanto uma boa prática para alguém que está apenas começando é criar uma máquina virtual do zero e instalar e testar estas e outras ferramentas, uma alternativa pode ser usar remnux, uma máquina virtual que pode ser baixada gratuitamente e tem as ferramentas mencionadas acima e muitas outras. Por exemplo, a ferramenta ILspy, que permite analisar arquivos desenvolvidos na framework .NET.