
Ein Tool, das dabei hilft, in den blinden Flecken von EDRs zu agieren.
Pyramid besteht aus:
Pyramid ist nützlich, um Post-Exploitation-Aufgaben auf eine ausweichende Weise durchzuführen, indem offensive Tools von einer signierten Binärdatei (z. B. python.exe) ausgeführt werden, indem ihre Abhängigkeiten im Speicher importiert werden. Dies kann erreicht werden, weil:
Für weitere Informationen lesen Sie bitte die DEFCON30 - Adversary Village Talk "Python vs Modern Defenses" - Folien und diesen Beitrag in meinem Blog.
Dieses Tool wurde erstellt, um eine Umgehungsstrategie gegen EDRs zu demonstrieren, die auf einigen Annahmen über blinde Flecken basiert. Es handelt sich um eine Kombination bereits existierender Techniken und Tools in einer (nach meinem besten Wissen) neuartigen Weise, die helfen kann, Verteidigungen zu umgehen. Der alleinige Zweck des Tools ist es, der Gemeinschaft zu helfen, das Bewusstsein für diese Art der Nutzung zu schärfen und eine Lösung zu beschleunigen. Es ist kein 0‑Day, es ist kein ausgewachsenes glänzendes C2, Pyramid nutzt aus, was möglicherweise blinde Flecken von EDRs sind, und das Tool wurde veröffentlicht, um Licht auf diese zu werfen. Ein Abschnitt zur Verteidigung wurde hinzugefügt, in der Hoffnung, dass erfahrene Blue-Teamer dazu beitragen und eine bessere mögliche Lösung für das Problem liefern können, das Pyramid hervorheben möchte. Alle Informationen dienen nur zu Bildungszwecken. Befolgen Sie die Anweisungen auf eigenes Risiko. Weder der Autor noch sein Arbeitgeber sind für direkte oder indirekte Schäden oder Verluste verantwortlich, die durch eine Person oder Organisation entstehen.
Pyramids In-Memory-Laden wurde ursprünglich inspiriert und erweitert von xorriors Empyre - Finder Class
snovvcrash entwickelte die Module mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Die Fähigkeiten der Pyramid-Module können direkt von einem Python-Interpreter ausgeführt werden und umfassen derzeit:
Hauptfunktionen des Pyramid-HTTP-Servers:
Hauptfunktionen des Cradles:
Pyramid kann mit einem bereits auf einem Zielrechner vorhandenen Python-Interpreter verwendet werden, oder durch Entpacken eines offiziellen embeddable Python-Pakets und anschließendes Ausführen von python.exe, um ein Python-Download-Cradle auszuführen. Dies ist ein einfacher Weg, um ungewöhnliche Prozessbaum-Muster zu vermeiden und wie eine normale Python-Anwendungsnutzung auszusehen.
Im Pyramid wird das Download-Cradle verwendet, um über HTTP/S einen Pyramid-Server zu erreichen und Module und Abhängigkeiten abzurufen.
Module sind spezifisch für die gewünschte Funktion und enthalten:
Die Python-Abhängigkeiten wurden bereits angepasst und modifiziert, um im Speicher importiert werden zu können, ohne Konflikte zu verursachen.
Derzeit sind 8 Pyramid-Module verfügbar:
git clone https://github.com/naksyn/Pyramid
SSL-Zertifikate für den HTTP-Server generieren:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
Wenn Sie Ihr eigenes signiertes SSL-Zertifikat verwenden möchten, stellen Sie sicher, dass:
Wenn Sie beispielsweise pythonmemorymodule mit Pyramid verwenden möchten, legen Sie Ihren Payload in den Delivery_files-Ordner, öffnen Sie dann pythonmemorymodule.py und konfigurieren Sie die benötigten Parameter am Anfang des Skripts, wie den Namen der Payload-Datei und die Prozedur, die nach dem Laden des PE aufgerufen werden soll.
Sobald der Pyramid-Server läuft und das Basis-Skript bereit ist, können Sie die Variable pyramid_module in der Datei Agent/cradle.py setzen und auf dem Ziel ausführen.
Das Cradle ist so konzipiert, dass es mit den Python-Standardbibliotheken ausgeführt werden kann.
Beispiel für die Ausführung des Pyramid-HTTP-Servers mit SSL-Zertifikat, Basisauthentifizierung, Verschlüsselung der Auslieferungsdateien mit ChaCha und automatischer Generierung der Serverkonfiguration in Modulen sowie Ausgabe eines einfügbaren Cradles für pythonmemorymodule:
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
Beim Start analysiert pyramid.py seine eigene Ordnerstruktur, um key.pem und cert.pem zu finden, und liefert Dateien aus dem Server-Ordner aus.
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
Um Pyramid auszuführen, ohne eine sichtbare python.exe-Eingabeaufforderung zu öffnen, können Sie pythonw.exe verwenden, das kein Konsolenfenster öffnet und sich im selben Windows Embeddable Package befindet. Das folgende Bild zeigt ein Beispiel für die Verwendung von pythonw.exe zur Ausführung von base-tunnel-socks5.py auf einem entfernten Rechner, ohne ein python.exe-Konsolenfenster zu öffnen.

Dynamisches Laden von Python-Modulen unterstützt nativ keinen Import von *.pyd-Dateien, die im Wesentlichen DLLs sind. Die einzige mir bekannte öffentliche Lösung, die dieses Problem löst, wird von Scythe (In-Memory-Execution) durch Neuentwicklung des CPython-Interpreters bereitgestellt. Um die digitale Signatur nicht zu verlieren, besteht eine Lösung, die die Verwendung des nativen Python Embeddable Package erlaubt, darin, die benötigten pyd-Dateien oder Wheels auf die Festplatte zu schreiben. Dies sollte in den meisten Fällen keine signifikanten OPSEC-Auswirkungen haben, aber beachten Sie, dass die folgenden Wheels, die pyd-Dateien enthalten, auf die Festplatte geschrieben werden, um das dynamische Laden abzuschließen: *. Cryptodome – benötigt von Bloodhound-Python, Impacket, DonPAPI und LaZagne *. bcrypt, cryptography, nacl, cffi – benötigt von paramiko
Python.exe ist eine signierte Binärdatei mit guter Reputation und bietet keine Transparenz über dynamischen Python-Code. Pyramid nutzt diese Ausweicheigenschaften aus, indem es offensive Aufgaben innerhalb desselben python.exe-Prozesses ausführt.
Aus diesem Grund wäre eine der effizientesten Lösungen, Binärdateien und DLLs, die von der Python Foundation signiert sind, standardmäßig zu blockieren und nur für Benutzer Ausnahmen zu schaffen, die tatsächlich Python-Binärdateien verwenden müssen.
Auch können Warnungen bei Downloads von Embeddable Packages ausgelöst werden.
Die Bereitstellung von PEP-578 ist ebenfalls möglich, wenn auch komplex, dies ist eine Beispielimplementierung. Allerdings könnte die Bereitstellung von PEP-578 ohne Blockierung der Verwendung von Standard-Python-Binärdateien diese Gegenmaßnahme nutzlos machen.