
un outil pour aider à opérer dans les angles morts des EDRs
Pyramid est composé de :
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 :
Pour plus d'informations, veuillez consulter le diaporama du talk DEFCON30 - Adversary village "Python vs Modern Defenses" et cet article sur mon blog.
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.
Le chargement en mémoire de Pyramid a été initialement inspiré et étendu à partir de la Finder Class d'xorrior pour EmPyre.
snovvcrash a construit les modules mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Les capacités des modules Pyramid peuvent être exécutées directement depuis un interpréteur Python et sont actuellement :
Fonctionnalités principales du serveur HTTP Pyramid :
Fonctionnalités principales du loader :
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 :
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 :
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 :
Par exemple, si vous souhaitez utiliser pythonmemorymodule avec Pyramid, placez votre payload dans le dossier Delivery_files, puis ouvrez pythonmemorymodule.py et configurez les paramètres nécessaires en haut du script, comme le nom du fichier payload et la procédure à appeler après le chargement du PE.
Une fois le serveur Pyramid en cours d'exécution et le script Base prêt, vous pouvez définir la variable pyramid_module dans le fichier Agent/cradle.py et l'exécuter sur la cible.
Le loader est conçu pour être exécuté avec les bibliothèques standard de Python.
Exemple d'exécution du serveur HTTP Pyramid avec certificat SSL, authentification basique, chiffrement des fichiers de livraison avec ChaCha et génération automatique de la configuration serveur dans les modules, avec affichage d'un loader prêt à l'emploi pour pythonmemorymodule :
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
Au démarrage, pyramid.py analysera sa propre structure de dossiers pour chercher key.pem, cert.pem et délivrera les fichiers depuis le dossier Server.
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
Pour exécuter Pyramid sans afficher d'invite python.exe visible, vous pouvez utiliser pythonw.exe qui n'ouvre pas de fenêtre de console lors de l'exécution et qui est contenu dans le même package Windows Embeddable. L'image suivante illustre un exemple d'utilisation de pythonw.exe pour exécuter base-tunnel-socks5.py sur une machine distante sans ouvrir de fenêtre de console python.exe.

Le chargement dynamique de modules Python ne prend pas en charge nativement l'importation de fichiers *.pyd qui sont essentiellement des DLL. La seule solution publique à ma connaissance qui résout ce problème est fournie par Scythe *(in-memory-execution) en ré-architecturant l'interpréteur CPython. Afin de ne pas perdre la signature numérique, une solution qui permettrait d'utiliser le package Python embeddable natif consiste à déposer sur disque les fichiers pyd ou wheels nécessaires. Cela ne devrait pas avoir d'implications OPSEC significatives dans la plupart des cas, mais gardez à l'esprit que les wheels suivants contenant des fichiers pyd sont déposés sur disque pour permettre le chargement dynamique : *. Cryptodome – nécessaire pour Bloodhound-Python, Impacket, DonPAPI et LaZagne *. bcrypt, cryptography, nacl, cffi – nécessaire pour paramiko
Python.exe est un binaire signé avec une bonne réputation et ne fournit pas de visibilité sur le code dynamique Python. Pyramid exploite ces propriétés d'évasion en effectuant des tâches offensives depuis le même processus python.exe.
Pour cette raison, l'une des solutions les plus efficaces serait de bloquer par défaut les binaires et DLL signés par la Python Foundation, en créant des exceptions uniquement pour les utilisateurs qui ont réellement besoin d'utiliser des binaires Python.
Des alertes sur les téléchargements de packages embeddables peuvent également être déclenchées.
Le déploiement de PEP-578 est également envisageable bien que complexe, voici un exemple d'implémentation. Cependant, déployer PEP-578 sans bloquer l'utilisation des binaires Python standard pourrait rendre cette contre-mesure inutile.