
Pyramid
O que é
Pyramid é composto por:
- um servidor HTTP/S Python que pode entregar arquivos criptografados (chacha, xor)
- módulos Python que podem carregar dependências em memória de ferramentas ofensivas como Bloodhound-py, secretsdump, LaZagne, Pythonnet, DonPAPI, pythonmemorymodule, paramiko, pproxy.
- dependências Python fixas (arquivos zip) que podem ser importadas em memória
- cradle Python que pode baixar, descriptografar e executar em memória módulos do Pyramid
Por que é útil
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:
- o Python Embeddable package fornece um interpretador Python assinado com boa reputação;
- Python tem muitas aplicações legítimas, então há uma grande quantidade de telemetria diferente vindo do binário python.exe, já que o interpretador executa as APIs nativamente. Isso pode ser abusado operando dentro do processo do Python.exe e tentando se misturar na enorme "impressão digital de telemetria" do binário python.exe.
- Há uma falta de auditoria para execução de código Python - PEP-578 tentou resolver isso, mas o binário padrão do python.exe não possui capacidades de auditoria habilitadas por padrão.
- As operações podem ser feitas nativamente a partir do python.exe usando a linguagem Python para realizar tarefas de pós-exploração, como importar dinamicamente módulos Python para executar ferramentas ofensivas e executar Beacon Object Files (após algumas modificações no BOF) diretamente dentro do python.exe.
Para mais informações, consulte o slide deck da palestra "Python vs Modern Defenses" do DEFCON30 - Adversary Village e este post no meu blog.
Aviso Legal
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.
Créditos
O carregamento em memória do Pyramid foi inicialmente inspirado e expandido a partir do Empyre - Finder Class de xorrior
Contribuidores
snovvcrash construiu os módulos mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Funcionalidades Atuais
As capacidades dos módulos do Pyramid podem ser executadas diretamente de um interpretador Python e atualmente são:
- Download, descriptografia e carregamento em memória de dependências Python.
- Carregamento dinâmico e execução de BloodHound Python, impacket secretsdump, DonPAPI, LaZagne.
- Carregamento em memória de uma dll ou exe buscada remotamente via PythonMemoryModule
- Proxy SOCKS5 através de túnel reverso SSH de encaminhamento de porta.
- Carregamento de assembly .NET em memória via Pythonnet
Principais funcionalidades do servidor HTTP Pyramid:
- criptografia sob demanda (chacha, xor) de arquivos a serem entregues
- geração automática de configurações do Servidor com base na linha de comando do pyramid
- decodificação e descriptografia de parâmetros HTTP (URL)
- Autenticação HTTP Básica
Principais funcionalidades do Cradle:
- Download, descriptografia e execução em memória de módulos do Pyramid.
- Dependência apenas de bibliotecas padrão do Python
Descrição
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:
- Classe Finder personalizada para importar em memória as dependências necessárias (arquivos zip).
- Código para baixar as dependências necessárias.
- Lógica principal para o programa que você deseja executar (bloodhound, secretsdump, paramiko, etc.).
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:
- bh.py importará em memória e executará python-BloodHound.
- secretsdump.py importará em memória e executará Impacket secretsdump.
- shellcode.py é um injetor de shellcode simples em memória.
- DonPAPI.py importará em memória e executará DonPAPI. Os resultados e credenciais extraídos são salvos em disco no Diretório do Pacote Python Embeddable.
- LaZagne.py importará em memória e executará LaZagne
- tunnel-socks5 importa e executa paramiko em uma nova Thread para criar um encaminhamento de porta remoto SSH para um servidor SSH, em seguida, um servidor proxy socks5 é executado localmente no alvo e tornado acessível remotamente através do túnel SSH.
- clr importa Pythonnet para carregar e executar um assembly .NET em memória.
- pythonmemorymodule importa PythonMemoryModule para carregar uma dll da memória.
Uso
Iniciando o servidor
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:
- usar o formato pem
- renomear os arquivos para key.pem e cert.pem
- colocar ambos os arquivos na pasta Server.
Configurando o módulo
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.
Descompactar o pacote embeddable e executar o cradle de download no alvo