
Uma técnica avançada de evasão em memória que alterna a proteção de memória do shellcode entre RW/NoAccess e RX e, em seguida, criptografa/descriptografa seu conteúdo.
Uma implementação de PoC para mais uma técnica de evasão em memória que criptografa e descriptografa ciclicamente o conteúdo do shellcode para então fazê-lo flutuar entre as proteções de memória RW (ou NoAccess) e RX.
Quando nosso shellcode reside em páginas de memória RW ou NoAccess, scanners como Moneta ou pe-sieve não conseguirão rastreá-lo e despejá-lo para análises adicionais.
Após lançar o ThreadStackSpoofer, recebi algumas perguntas sobre o seguinte ponto do README:
Altere a proteção das páginas de memória do seu Beacon para RW (de RX/RWX) e criptografe seu conteúdo antes de dormir (isso poderia evadir scanners como Moneta ou pe-sieve)
Antes, eu tinha quase certeza de que a comunidade já sabia como criptografar/descriptografar seus payloads e alterar suas proteções de memória para simplesmente evadir scanners de memória que procuram regiões executáveis anômalas. As perguntas provaram o contrário, então decidi lançar este PoC não armamentado para documentar mais uma estratégia de evasão e oferecer uma implementação de exemplo para a comunidade trabalhar.
Este PoC é uma demonstração de uma técnica bastante simples, já conhecida pela comunidade ofensiva (então não estou trazendo nada de novo aqui, na verdade), na esperança de revelar o segredo por trás da mágica mostrada por alguns frameworks comerciais que demonstram suas capacidades de evasão mirando ambos os scanners de memória mencionados.
Aqui está uma comparação ao flutuar para RW (outra opção é flutuar para PAGE_NOACCESS - descrito abaixo):

Esta implementação, juntamente com meu ThreadStackSpoofer, traz à comunidade de Segurança Ofensiva implementações de exemplo para acompanhar o que é oferecido pelos produtos C2 comerciais, para que possamos não fazer pior em nossas ferramentas de Red Team. 💪
Este programa realiza auto-injeção de shellcode (aproximadamente via clássico VirtualAlloc + memcpy + CreateThread).
Quando o shellcode é executado (esta implementação visa especificamente implantes Cobalt Strike Beacon), uma função do Windows será hookada interceptando o momento em que o Beacon adormece, kernel32!Sleep.
Sempre que a função hookada MySleep é invocada, ela localiza os limites de sua alocação de memória, altera a proteção para RW e aplica xor32 em todos os bytes armazenados ali.
Após aguardar o tempo esperado, quando o shellcode retorna ao nosso handler MySleep, descriptografamos os dados do shellcode e revertemos a proteção para RX.
PAGE_READWRITE funciona da seguinte formakernel32!Sleep apontando de volta para o nosso callback.VirtualAlloc + memcpy + CreateThread. Ao contrário do que tínhamos no ThreadStackSpoofer, aqui não estamos hookando nada na ntdll para executar nosso shellcode, mas sim saltando para ele a partir de nossa própria função. Isso tenta evitar deixar IOCs simples na memória apontando para memória modificada da ntdll.MySleep é invocado.RWkernel32!Sleep original para evitar deixar um IOC simples na memória indicando que Sleep foi trampolinada (hookada in-line).::Sleep original é feita para deixar o Beacon dormir enquanto aguarda novas comunicações.RX e então re-hookamos kernel32!Sleep para garantir a interceptação dos sleeps seguintes.PAGE_NOACCESS funciona da seguinte formakernel32!Sleep apontando de volta para o nosso callback.VirtualAlloc + memcpy + CreateThread ...MySleep é invocado.PAGE_NOACCESSkernel32!Sleep original para evitar deixar um IOC simples na memória indicando que Sleep foi trampolinada (hookada in-line).::Sleep original é feita para deixar o Beacon dormir enquanto aguarda novas comunicações.kernel32!Sleep para garantir a interceptação dos sleeps seguintes.RX, e o shellcode é retomado.A técnica não é nova, nem algo que eu tenha criado. É apenas uma implementação mostrando o conceito e sua utilização prática para permitir que nossa comunidade de Segurança Ofensiva acompanhe o que é oferecido pelos frameworks C2 comerciais.
Na verdade, fui apresentado à ideia de alternar a proteção de memória do shellcode há alguns anos, através do trabalho de Josh Lospinoso em seu incrível Gargoyle.
Aqui está mais contexto:
Gargoyle leva o conceito de shellcode autoconsciente e autoflutuante um passo adiante, utilizando uma sequência de ROP que chama VirtualProtect.
No entanto, por mais impressionante que seja a técnica, é igualmente difícil utilizá-la com o Beacon do Cobalt Strike sem ter que matar sua thread e ficar reinicializando o Beacon na memória.
Isso está longe de ser perfeito; no entanto, como já operamos a partir da base do nosso próprio processo loader de auto-injeção, podemos fazer o que quisermos com o ambiente no qual o shellcode opera e ocultá-lo como preferirmos. Esta técnica (e a anterior, o ThreadStackSpoofer) mostra as vantagens de executar nossos shellcodes dessa forma.
A implementação da flutuação para PAGE_NOACCESS é inspirada no trabalho de ORCA666 apresentado em seu injetor https://github.com/ORCA666/0x41.
Ele mostrou que:
Esta implementação contém essa ideia implementada, disponível com a opção 2 em <fluctuate>.
Não deixe de conferir também os outros projetos dele.