
Pyramid
Cos'è
Pyramid è composto da:
- un server HTTP/S Python che può consegnare file crittografati (chacha, xor)
- moduli Python che possono caricare in memoria le dipendenze di strumenti offensivi come Bloodhound-py, secretsdump, LaZagne, Pythonnet, DonPAPI, pythonmemorymodule, paramiko, pproxy.
- dipendenze Python fisse (file zip) che possono essere importate in memoria
- cradle Python che può scaricare, decrittare ed eseguire in memoria i moduli di Pyramid
Perché è utile
Pyramid è utile per svolgere attività di post-exploitation in modo elusivo, eseguendo strumenti offensivi da un binario firmato (ad esempio python.exe) importando le loro dipendenze in memoria.
Ciò è possibile perché:
- il pacchetto Python Embeddable fornisce un interprete Python firmato con buona reputazione;
- Python ha molte applicazioni legittime, quindi c'è una grande quantità di telemetria diversa proveniente dal binario python.exe poiché l'interprete esegue nativamente le API. Ciò può essere abusato operando all'interno del processo Python.exe e cercando di confondersi nell'enorme "impronta di telemetria" del binario python.exe.
- Manca l'audit per l'esecuzione del codice Python - PEP-578 ha provato a risolvere questo problema, ma il binario python.exe standard non ha capacità di audit abilitate per impostazione predefinita.
- Le operazioni possono essere eseguite nativamente dall'interno di python.exe usando il linguaggio Python per svolgere attività di post-exploitation come importare dinamicamente moduli Python per eseguire strumenti offensivi ed eseguire Beacon Object Files (dopo alcune modifiche BOF) direttamente all'interno di python.exe.
Per maggiori informazioni, consulta la slide deck del talk "Python vs Modern Defenses" al DEFCON30 - Adversary village e questo post sul mio blog.
Disclaimer
Questo strumento è stato creato per dimostrare una strategia di bypass contro gli EDR basata su alcune ipotesi di punti ciechi. È una combinazione di tecniche e strumenti già esistenti in un modo (al meglio delle mie conoscenze) innovativo che può aiutare a eludere le difese. L'unico intento dello strumento è aiutare la comunità ad aumentare la consapevolezza su questo tipo di utilizzo e accelerare una risoluzione. Non è un 0day, non è un C2 completo e lucido, Pyramid sfrutta quelli che potrebbero essere punti ciechi degli EDR e lo strumento è stato reso pubblico per fare luce su di essi. È stato incluso un paragrafo sulla difesa, sperando che i blue-teamer esperti possano contribuire e fornire una migliore risoluzione possibile sul problema che Pyramid mira a evidenziare. Tutte le informazioni sono fornite solo a scopo educativo. Segui le istruzioni a tuo rischio. Né l'autore né il suo datore di lavoro sono responsabili per danni o perdite diretti o consequenziali derivanti da qualsiasi persona o organizzazione.
Crediti
Il caricamento in memoria di Pyramid è stato inizialmente ispirato ed espanso dal xorrior 's Empyre - Finder Class
Contributori
snovvcrash ha costruito i moduli mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Funzionalità attuali
Le capacità dei moduli di Pyramid possono essere eseguite direttamente da un interprete Python e sono attualmente:
- Scaricamento, decrittazione e caricamento in memoria delle dipendenze Python.
- Caricamento dinamico ed esecuzione di BloodHound Python, impacket secretsdump, DonPAPI, LaZagne.
- Caricamento in memoria di una dll o exe recuperata da remoto tramite PythonMemoryModule
- Proxy SOCKS5 attraverso un tunnel SSH di port forwarding inverso.
- Caricamento in memoria di assembly .NET tramite Pythonnet
Caratteristiche principali del server HTTP Pyramid:
- crittografia al volo (chacha,xor) dei file da consegnare
- generazione automatica delle configurazioni del server basata sulla riga di comando di pyramid
- decodifica e decrittazione dei parametri HTTP (URL)
- Autenticazione HTTP di base
Caratteristiche principali del Cradle:
- Scaricamento, decrittazione ed esecuzione in memoria dei moduli di Pyramid.
- Dipendenze solo dalle librerie standard di Python
Descrizione
Pyramid può essere utilizzato con un interprete Python già esistente su una macchina target, o decomprimendo un pacchetto Python embeddable ufficiale e poi eseguendo python.exe per eseguire un cradle di download Python. Questo è un modo semplice per evitare di creare pattern di alberi dei processi insoliti e assomigliare a un normale utilizzo di un'applicazione Python.
In Pyramid, il cradle di download viene utilizzato per raggiungere un server Pyramid tramite HTTP/S per recuperare moduli e dipendenze.
I moduli sono specifici per la funzionalità che si desidera utilizzare e contengono:
- Classe Finder personalizzata per importare in memoria le dipendenze richieste (file zip).
- Codice per scaricare le dipendenze richieste.
- Logica principale per il programma che si desidera eseguire (bloodhound, secretsdump, paramiko, ecc.).
Le dipendenze Python sono già state fissate e modificate per essere importate in memoria senza conflitti.
Attualmente sono disponibili 8 moduli di Pyramid:
- bh.py importerà ed eseguirà in memoria python-BloodHound.
- secretsdump.py importerà ed eseguirà in memoria Impacket secretsdump.
- shellcode.py è un semplice injector di shellcode in memoria.
- DonPAPI.py importerà ed eseguirà in memoria DonPAPI. I risultati e le credenziali estratte vengono salvati su disco nella directory del pacchetto Python Embeddable.
- LaZagne.py importerà ed eseguirà in memoria LaZagne
- tunnel-socks5 importa ed esegue paramiko in un nuovo thread per creare un port forwarding remoto SSH verso un server SSH, quindi un server proxy socks5 viene eseguito localmente sul target e reso accessibile da remoto attraverso il tunnel SSH.
- clr importa Pythonnet per caricare ed eseguire un assembly .NET in memoria.
- pythonmemorymodule importa PythonMemoryModule per caricare una dll dalla memoria.
Utilizzo
Avviare il server
git clone https://github.com/naksyn/Pyramid
Genera certificati SSL per il server HTTP:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
Se desideri utilizzare il tuo certificato SSL firmato, assicurati di:
- usare il formato pem
- rinominare i file in key.pem e cert.pem
- posizionare entrambi i file nella cartella Server.
Configurare il modulo
Ad esempio, se desideri utilizzare pythonmemorymodule con Pyramid, inserisci il tuo payload nella cartella Delivery_files, quindi apri pythonmemorymodule.py e configura i parametri necessari all'inizio dello script, come il nome del file del payload e la procedura che desideri chiamare dopo che il PE è stato caricato.