
Pyramid
Qu'est-ce que c'est
Pyramid est composé de :
- un serveur HTTP/S Python pouvant délivrer des fichiers chiffrés (chacha, xor)
- des modules Python pouvant charger en mémoire les dépendances d'outils offensifs tels que Bloodhound-py, secretsdump, LaZagne, Pythonnet, DonPAPI, pythonmemorymodule, paramiko, pproxy.
- des dépendances Python fixes (fichiers zip) pouvant être importées en mémoire
- un loader Python capable de télécharger, déchiffrer et exécuter en mémoire les modules Pyramid
Pourquoi est-ce utile
Pyramid est utile pour effectuer des tâches de post-exploitation de manière furtive, en exécutant des outils offensifs depuis un binaire signé (par exemple python.exe) grâce à l'importation en mémoire de leurs dépendances.
Ceci est possible car :
- le package Python Embeddable fournit un interpréteur Python signé avec bonne réputation ;
- Python a de nombreuses applications légitimes, donc il existe une grande variété de télémétries provenant du binaire python.exe puisque l'interpréteur exécute nativement les APIs. Ceci peut être abusé en opérant à l'intérieur du processus Python.exe et en tentant de se fondre dans l'immense « empreinte télémétrique » du binaire python.exe.
- Il y a un manque d'audit pour l'exécution de code Python – PEP-578 a tenté de résoudre cela mais le binaire python.exe standard n'a pas de capacités d'audit activées par défaut.
- Les opérations peuvent être effectuées nativement depuis python.exe en utilisant le langage Python pour réaliser des tâches de post-exploitation telles que l'importation dynamique de modules Python pour exécuter des outils offensifs et l'exécution de Beacon Object Files (après quelques modifications BOF) directement dans python.exe.
Pour plus d'informations, veuillez consulter le diaporama du talk DEFCON30 - Adversary village "Python vs Modern Defenses" et cet article sur mon blog.
Avertissement
Cet outil a été créé pour démontrer une stratégie de contournement des EDR basée sur certaines hypothèses de zones d'ombre. C'est une combinaison de techniques et d'outils déjà existants, présentée (à ma connaissance) d'une manière nouvelle qui peut aider à contourner les défenses. Le seul but de l'outil est d'aider la communauté à prendre conscience de ce type d'utilisation et d'accélérer une résolution. Ce n'est pas un 0day, ce n'est pas un C2 complet et brillant, Pyramid exploite ce qui pourrait être les angles morts des EDR et l'outil a été rendu public pour les mettre en lumière.
Un paragraphe sur la défense a été inclus, en espérant que les blue-teamers expérimentés puissent contribuer et apporter une meilleure résolution possible au problème que Pyramid cherche à mettre en évidence. Toutes les informations sont fournies à des fins éducatives uniquement. Suivez les instructions à vos risques et périls. Ni l'auteur ni son employeur ne sont responsables de tout dommage ou perte directe ou indirecte résultant d'une personne ou d'une organisation.
Crédits
Le chargement en mémoire de Pyramid a été initialement inspiré et étendu à partir de la Finder Class d'xorrior pour EmPyre.
Contributeurs
snovvcrash a construit les modules mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Fonctionnalités actuelles
Les capacités des modules Pyramid peuvent être exécutées directement depuis un interpréteur Python et sont actuellement :
- Téléchargement, déchiffrement et chargement en mémoire des dépendances Python.
- Chargement dynamique et exécution de BloodHound Python, impacket secretsdump, DonPAPI, LaZagne.
- Chargement en mémoire d'une DLL ou d'un EXE récupéré à distance via PythonMemoryModule.
- Proxy SOCKS5 via un tunnel SSH de redirection de port inverse.
- Chargement d'assembly .NET en mémoire via Pythonnet
Fonctionnalités principales du serveur HTTP Pyramid :
- Chiffrement à la volée (chacha, xor) des fichiers à délivrer
- Génération automatique des configurations serveur basées sur la ligne de commande pyramid
- Décodage et déchiffrement des paramètres HTTP (URL)
- Authentification HTTP basique
Fonctionnalités principales du loader :
- Téléchargement, déchiffrement et exécution en mémoire des modules Pyramid.
- Dépendance uniquement aux bibliothèques standard de Python.
Description
Pyramid peut être utilisé avec un interpréteur Python déjà existant sur une machine cible, ou en décompressant un package Python embeddable officiel puis en exécutant python.exe pour lancer un loader de téléchargement Python. C'est un moyen simple d'éviter de créer des arbres de processus inhabituels et de ressembler à une utilisation normale d'une application Python.
Dans Pyramid, le loader de téléchargement est utilisé pour atteindre un serveur Pyramid via HTTP/S afin de récupérer des modules et des dépendances.
Les modules sont spécifiques à la fonctionnalité que vous souhaitez utiliser et contiennent :
- Une classe Finder personnalisée pour importer en mémoire les dépendances requises (fichiers zip).
- Le code pour télécharger les dépendances requises.
- La logique principale du programme que vous souhaitez exécuter (bloodhound, secretsdump, paramiko, etc.).
Les dépendances Python ont déjà été modifiées et corrigées pour être importées en mémoire sans conflit.
Il existe actuellement 8 modules Pyramid disponibles :
- bh.py importera en mémoire et exécutera python-BloodHound.
- secretsdump.py importera en mémoire et exécutera Impacket secretsdump.
- shellcode.py est un injecteur de shellcode simple en mémoire.
- DonPAPI.py importera en mémoire et exécutera DonPAPI. Les résultats et identifiants extraits sont sauvegardés sur disque dans le répertoire du package Python Embeddable.
- LaZagne.py importera en mémoire et exécutera LaZagne
- tunnel-socks5 importe et exécute paramiko dans un nouveau thread pour créer un tunnel SSH de redirection de port inverse vers un serveur SSH, puis un serveur proxy socks5 est exécuté localement sur la cible et rendu accessible à distance via le tunnel SSH.
- clr importe Pythonnet pour charger et exécuter un assembly .NET en mémoire.
- pythonmemorymodule importe PythonMemoryModule pour charger une DLL depuis la mémoire.
Utilisation
Démarrage du serveur
git clone https://github.com/naksyn/Pyramid
Générer les certificats SSL pour le serveur HTTP :
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
Si vous souhaitez utiliser votre propre certificat SSL signé, assurez-vous de :
- utiliser le format pem
- renommer les fichiers en key.pem et cert.pem
- placer les deux fichiers dans le dossier Server.
Configuration du module