Page cover

Hell Code Loader

Injeção de Shellcode com VEH, HWBP e NTAPI no Windows

Tinha um bom tempo que eu não reservava um momento para escrever algo para meu blog, então aproveitei que estou usando um novo tema e decidi publicar este artigo sobre um loader intermediário.

O link desse projeto está aqui: Hell Code Loader

O objetivo é demonstrar como esse loader pode contornar alguns antivírus e, possivelmente, até alguns EDRs mais simples.

Neste post, vamos explorar técnicas avançadas para evadir mecanismos de segurança do Windows, combinando múltiplas abordagens para alcançar a execução de código com baixa detecção.

As técnicas abordadas incluem:

  • VEH (Vectored Exception Handling)

  • Chamadas indiretas (NTAPI para operações de memória)

  • HalosGate para obtenção de SSNs (System Service Numbers)

  • Carregamento de DLLs via Thread Pool Callback


Fluxo de Injeção e Execução

  1. Verificar status do ETW antes de alterações.

  2. Remover HWBPs pré-existentes.

  3. Carregar DLLs via callback.

  4. Definir HWBPs em AmsiScanBuffer e NtTraceEvent.

  5. Registrar handler de exceção vetorizada (VEH).

  6. Execução de shellcode:

    1. NtAllocateVirtualMemory → aloca região PAGE_READWRITE.

    2. NtWriteVirtualMemory → grava o shellcode criptografado.

    3. Descriptografia via RC4DEC.

    4. Gatilho de EXCEPTION_ACCESS_VIOLATION: ( (void(*)()) shellcodeMemory)();


Implementando o HWBP Engine

Neste projeto, vamos utilizar breakpoints de hardware para aplicar um patch na AMSI e ETW. Na minha experiência, essa técnica ainda é eficaz contra a maioria dos mecanismos de detecção usados por soluções AV/EDR.

Nota! No entanto, é importante destacar que isso pode mudar a qualquer momento com o surgimento de novas abordagens de detecção.

Recentemente, alguns fornecedores começaram a implementar detecções baseadas em ETWti, utilizando chamadas como SetThreadContext, conforme detalhado neste artigo.

O Hardware Breakpoint Engine (HWBP) permite definir breakpoints de hardware em pontos de interesse (por exemplo, AmsiScanBuffer e NtTraceEvent). Utilizamos:

  • Dr0–Dr3: endereços de breakpoint.

  • Dr7: controle de habilitação.


Evasão de AMSI/ETW via Breakpoints de Hardware

Ao definir breakpoints em:

  • AmsiScanBuffer (função em amsi.dll)

  • NtTraceEvent (função em ntdll.dll)

podemos interceptar o EXCEPTION_SINGLE_STEP e forçar um retorno de sucesso:

Exemplo de uso:


HalosGate: Obtendo SSNs (Syscall Service Number)

Para obter Syscall Service Numbers (SSNs) mesmo quando as APIs da NTDLL estão hookadas vamos utilizar de base o projeto AsmHalosGate que implementa:

  1. Resolução de Endereços:

    • Obtém o endereço base da NTDLL

    • Localiza a tabela de exportação

    • Encontra os endereços das APIs necessárias

  2. Obtenção de SSNs:

    • Usa halosGateUp e halosGateDown para encontrar SSNs válidos

    • Mantém os SSNs em variáveis globais para uso posterior

Nota! Embora o código não seja perfeito e possa, ocasionalmente, ocorrer erros na obtenção de SSNs, esses problemas podem ser rapidamente solucionados.


Carregamento de DLL via Thread Pool Callback (TpAllocWork)

Visão Geral da Abordagem

  1. Resolver o endereço de LoadLibraryA em kernel32.dll usando GetProcAddress.

  2. Recuperar os ponteiros para TpAllocWork, TpPostWork e TpReleaseWork em ntdll.dll.

  3. Alocar um trabalho (TP_WORK) na thread pool com TpAllocWork, passando um callback em assembly que fará um tail-call para LoadLibraryA, usando o nome da DLL como Context.

  4. Publicar o trabalho com TpPostWork e liberar o objeto com TpReleaseWork.

  5. Aguardar a execução do callback para garantir que a DLL foi carregada.

Nota! Para saber mais sobre o Thread Pool do Windows, consulte a documentação oficial: MSDN Thread Pools.


Implementação em C/C++

Callback em Assembly (x64)


Descriptografia RC4

Bom, quem já viu minhas postagens anteriores sabe que não adianta, vou continuar utilizando essa bomba, por isso, acho que não tenho mais nada a acrescentar. 😂

Ofuscação de Strings básico

Para evitar detecção por assinaturas de strings, implementamos:

  1. Strings "Fragmentadas":

Dica! Esta técnica "ajuda" a evitar detecção por scanners de strings estáticas, mas não é infalível! ainda mais contra uma análise dinâmica.


Mecanismo de Descriptografia RC4 básico

O shellcode é descriptografado usando RC4 básico para evitar detecção estática. O processo de descriptografia envolve:

  1. Primeira Camada de Descriptografia:

  1. Dupla Camada de Descriptografia:

  1. Descriptografia:

  • O shellcode só é descriptografado em memória


Configurando o VEH Handler

Vamos utilizar o mecanismo de VEH para iniciar a thread do nosso shellcode.

Evitando assim o uso de métodos mais tradicionais, como NtCreateThreadEx ou Queue/APC.

O VEH (Vectored Exception Handler) será configurado para capturar exceções do tipo EXCEPTION_ACCESS_VIOLATION, que vai ocorrer ao tentar executar uma região de memória marcada como não-executável.

Quando a exceção for gerada, redirecionamos manualmente o registrador RIP para o endereço onde o shellcode foi previamente alocado.

Essa abordagem permite executar o shellcode de forma mais "furtiva", explorando o fluxo "natural" de exceções do processo:

msg

E registramos:


Testes do loader contra AV/EDR

Vou realizar a execução do mimikatz convertido para shellcode, utilizando o projeto donut.

Lembre-se de desativar o bypass AMSI/WLDP/ETW do donut caso queira fazer uso desse projeto, senão ele será facilmente detectado!"

Antivírus
Ranking dos "Melhores"
Prêmios e Reconhecimentos 2024

🥇 1º lugar

🏆 Produto do Ano 2024 pela AV-Comparatives

🥈 2º lugar

🏆 Approved Enterprise & Business Security Product 2024 pela AV-Comparatives

🥉 3º lugar

🏆 Approved Enterprise & Business Security Product 2024 pela AV-Comparatives

4º lugar

🏆 Top-Rated Product 2024 pela AV-Comparatives

5º lugar

🏆 Top-Rated Product 2024 pela AV-Comparatives

6º lugar

🏆 Approved Security Product 2024 pela AV-Comparatives

7º lugar

🏆 Approved Security Product 2024 pela AV-Comparatives

8º lugar

🏆 Approved Security Product 2024 pela AV-Comparatives

9º lugar

🏆 Approved Security Product 2024 pela AV-Comparatives


Loader + Dll Proxy

Bom, quando executei o loader no Bitdefender Total Security e no Bitdefender Endpoint Security, ele foi detectado. Então, decidi tentar realizar o proxy de DLL no Notepad++ como mostrei em outras postagens. Fiz apenas isso e contornou a detecção.


Código para realizar o proxy de dll no Notepad++


Finalização

Bom, gostei bastante de fazer esse projetinho no meu tempo livre. Acho que ainda não perdi o jeito de escrever esses “papers” pouco profissionais e documentados, mas não ligo. continuo gostando de fazer isso. Então, é isso. nos vemos na próxima postagem, espero que seja melhor do que essa.

Last updated