
uma ferramenta para ajudar a operar nos pontos cegos dos EDRs
Pyramid é composto por:
Pyramid é útil para realizar tarefas de pós-exploração de forma evasiva, executando ferramentas ofensivas a partir de um binário assinado (ex.: python.exe) importando suas dependências em memória. Isso é possível porque:
Para mais informações, consulte o slide deck da palestra "Python vs Modern Defenses" do DEFCON30 - Adversary Village e este post no meu blog.
Esta ferramenta foi criada para demonstrar uma estratégia de bypass contra EDRs baseada em algumas suposições de pontos cegos. É uma combinação de técnicas e ferramentas já existentes de uma maneira (até onde sei) inovadora que pode ajudar a evadir defesas. A única intenção da ferramenta é ajudar a comunidade a aumentar a conscientização sobre esse tipo de uso e acelerar uma resolução. Não é um 0day, não é um C2 completo e brilhante; Pyramid explora o que podem ser pontos cegos de EDRs e a ferramenta foi tornada pública para lançar luz sobre eles. Um parágrafo sobre defesa foi incluído, na esperança de que experientes blue-teamers possam contribuir e fornecer uma melhor resolução possível para o problema que Pyramid visa destacar. Todas as informações são fornecidas apenas para fins educacionais. Siga as instruções por sua própria conta e risco. Nem o autor nem seu empregador são responsáveis por qualquer dano ou perda direta ou consequente resultante de qualquer pessoa ou organização.
O carregamento em memória do Pyramid foi inicialmente inspirado e expandido a partir do Empyre - Finder Class de xorrior
snovvcrash construiu os módulos mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
As capacidades dos módulos do Pyramid podem ser executadas diretamente de um interpretador Python e atualmente são:
Principais funcionalidades do servidor HTTP Pyramid:
Principais funcionalidades do Cradle:
Pyramid pode ser usado com um Interpretador Python já existente em uma máquina alvo, ou descompactando um pacote Python embeddable oficial e então executando python.exe para executar um cradle de download Python. Esta é uma maneira simples de evitar criar um padrão de árvore de processos incomum e parecer com um uso normal de aplicativo Python.
No Pyramid, o cradle de download é usado para alcançar um Servidor Pyramid via HTTP/S para buscar módulos e dependências.
Os módulos são específicos para a funcionalidade que você deseja usar e contêm:
As dependências Python já foram corrigidas e modificadas para serem importadas em memória sem conflitos.
Atualmente existem 8 módulos Pyramid disponíveis:
git clone https://github.com/naksyn/Pyramid
Gerar certificados SSL para o Servidor HTTP:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
Se você quiser usar seu próprio certificado SSL assinado, certifique-se de:
Como exemplo, se você quiser usar pythonmemorymodule com Pyramid, coloque seu payload na pasta Delivery_files, depois abra pythonmemorymodule.py e configure os parâmetros necessários no topo do script, como o nome do arquivo de payload e o procedimento que você deseja chamar após o PE ter sido carregado.
Assim que o servidor Pyramid estiver em execução e o script Base estiver pronto, você pode definir a variável pyramid_module no arquivo Agent/cradle.py e executá-lo no alvo.
O cradle foi construído para ser executado com as bibliotecas padrão do Python.
Exemplo de execução do Servidor HTTP Pyramid usando certificado SSL fornecendo Autenticação Básica, criptografando arquivos de entrega usando ChaCha e gerando automaticamente a configuração do servidor nos módulos e imprimindo um cradle copiável para pythonmemorymodule:
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
Ao iniciar, pyramid.py analisará sua própria estrutura de pastas para procurar key.pem, cert.pem e entregará arquivos da pasta Server.
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
Para executar Pyramid sem exibir um prompt python.exe visível, você pode usar pythonw.exe, que não abrirá uma janela de console na execução e está contido no mesmo Pacote Windows Embeddable. A imagem a seguir ilustra um exemplo de uso do pythonw.exe para executar base-tunnel-socks5.py em uma máquina remota sem abrir uma janela de console do python.exe.

Carregar dinamicamente módulos Python não suporta nativamente a importação de arquivos *.pyd que são essencialmente dlls. A única solução pública que conheço que resolve esse problema é fornecida pela Scythe (execução em memória) ao reengenharia do interpretador CPython. Para não perder a assinatura digital, uma solução que permitiria usar o pacote Python embeddable nativo envolve descartar em disco os arquivos pyd ou wheels necessários. Isso não deve ter implicações significativas de OPSEC na maioria dos casos, no entanto, lembre-se de que os seguintes wheels contendo arquivos pyd são descartados em disco para permitir a conclusão do carregamento dinâmico: *. Cryptodome - necessário para Bloodhound-Python, Impacket, DonPAPI e LaZagne *. bcrypt, cryptography, nacl, cffi - necessário para paramiko
Python.exe é um binário assinado com boa reputação e não fornece visibilidade sobre código Python dinâmico. Pyramid explora essas propriedades de evasão realizando tarefas ofensivas dentro do mesmo processo python.exe.
Por esse motivo, uma das soluções mais eficientes seria bloquear por padrão binários e dlls assinados pela Python Foundation, criando exceções apenas para usuários que realmente precisam usar binários Python.
Alertas sobre downloads de pacotes embeddable também podem ser levantados.
Implantar PEP-578 também é viável, embora complexo; esta é uma implementação de exemplo. No entanto, implantar PEP-578 sem bloquear o uso de binários Python padrão pode tornar essa contramedida inútil.