
Pyramid
¿Qué es?
Pyramid está compuesto por:
- un servidor HTTP/S en Python que puede entregar archivos cifrados (chacha, xor)
- módulos de Python que pueden cargar dependencias en memoria de herramientas ofensivas como Bloodhound-py, secretsdump, LaZagne, Pythonnet, DonPAPI, pythonmemorymodule, paramiko, pproxy.
- dependencias de Python fijas (archivos zip) que pueden importarse en memoria
- un cargador inicial (cradle) de Python que puede descargar, descifrar y ejecutar módulos de Pyramid en memoria
¿Por qué es útil?
Pyramid es útil para realizar tareas de post-explotación de manera evasiva, ejecutando herramientas ofensivas desde un binario firmado (por ejemplo, python.exe) importando sus dependencias en memoria.
Esto se puede lograr porque:
- el paquete Python Embeddable proporciona un intérprete de Python firmado con buena reputación;
- Python tiene muchas aplicaciones legítimas, por lo que hay mucha telemetría diferente proveniente del binario python.exe, ya que el intérprete ejecuta las APIs de forma nativa. Esto se puede abusar operando dentro del proceso Python.exe e intentando mezclarse con la enorme "huella de telemetría" del binario python.exe.
- Hay una falta de auditoría para la ejecución de código en Python - PEP-578 intentó solucionarlo, pero el binario python.exe estándar no tiene capacidades de auditoría habilitadas por defecto.
- Las operaciones pueden realizarse de forma nativa desde python.exe utilizando el lenguaje Python para realizar tareas de post-explotación, como importar dinámicamente módulos de Python para ejecutar herramientas ofensivas y ejecutar Beacon Object Files (después de algunas modificaciones de BOF) directamente dentro de python.exe.
Para más información, consulte la presentación del talk "Python vs Modern Defenses" en DEFCON30 - Adversary village y este post en mi blog.
Descargo de responsabilidad
Esta herramienta fue creada para demostrar una estrategia de evasión contra EDR basada en algunas suposiciones de puntos ciegos. Es una combinación de técnicas y herramientas ya existentes de una manera (hasta donde sé) novedosa que puede ayudar a evadir defensas. La única intención de la herramienta es ayudar a la comunidad a aumentar la conciencia sobre este tipo de uso y acelerar una resolución. No es un 0day, no es un C2 completo y brillante; Pyramid explota lo que podrían ser puntos ciegos de los EDR y la herramienta se ha hecho pública para arrojar luz sobre ellos.
Se ha incluido un párrafo sobre defensa, con la esperanza de que los blue-teamers experimentados puedan contribuir y proporcionar una mejor resolución posible sobre el problema que Pyramid pretende resaltar. Toda la información se proporciona únicamente con fines educativos. Siga las instrucciones bajo su propio riesgo. Ni el autor ni su empleador son responsables de ningún daño o pérdida directa o consecuente que surja de cualquier persona u organización.
Créditos
La carga en memoria de Pyramid se inspiró inicialmente y se amplió a partir de la Empyre - Finder Class de xorrior.
Contribuyentes
snovvcrash construyó los módulos mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Funcionalidades actuales
Las capacidades de los módulos de Pyramid pueden ejecutarse directamente desde un intérprete de Python y actualmente son:
- Descarga, descifrado y carga en memoria de dependencias de Python.
- Carga dinámica y ejecución de BloodHound Python, impacket secretsdump, DonPAPI, LaZagne.
- Carga en memoria de un dll o exe obtenido remotamente a través de PythonMemoryModule
- Proxy SOCKS5 a través de túnel SSH de reenvío de puerto inverso.
- Carga de ensamblados .NET en memoria a través de Pythonnet
Funcionalidades principales del servidor HTTP Pyramid:
- cifrado sobre la marcha (chacha, xor) de los archivos a entregar
- generación automática de configuraciones del servidor basadas en la línea de comandos de Pyramid
- decodificación y descifrado de parámetros HTTP (URL)
- Autenticación HTTP básica
Funcionalidades principales del cargador inicial (cradle):
- Descarga, descifrado y ejecución en memoria de módulos de Pyramid.
- Dependencia solo de bibliotecas estándar de Python
Descripción
Pyramid se puede usar con un intérprete de Python ya existente en una máquina objetivo, o descomprimiendo un paquete Python Embeddable oficial y luego ejecutando python.exe para ejecutar un cargador inicial de descarga de Python. Esta es una forma sencilla de evitar crear un patrón de árbol de procesos poco común y parecerse al uso normal de una aplicación Python.
En Pyramid, el cargador inicial de descarga se utiliza para llegar a un servidor Pyramid a través de HTTP/S para obtener módulos y dependencias.
Los módulos son específicos para la función que se desea usar y contienen:
- Una clase Finder personalizada para importar en memoria las dependencias requeridas (archivos zip).
- Código para descargar las dependencias requeridas.
- Lógica principal para el programa que se desea ejecutar (bloodhound, secretsdump, paramiko, etc.).
Las dependencias de Python ya han sido fijadas y modificadas para importarse en memoria sin conflictos.
Actualmente hay 8 módulos de Pyramid disponibles:
- bh.py importa y ejecuta en memoria python-BloodHound.
- secretsdump.py importa y ejecuta en memoria Impacket secretsdump.
- shellcode.py es un inyector de shellcode en memoria simple.
- DonPAPI.py importa y ejecuta en memoria DonPAPI. Los resultados y credenciales extraídas se guardan en disco en el Directorio del Paquete Python Embeddable.
- LaZagne.py importa y ejecuta en memoria LaZagne
- tunnel-socks5 importa y ejecuta paramiko en un nuevo hilo para crear un reenvío de puerto remoto SSH a un servidor SSH, luego se ejecuta un servidor proxy socks5 localmente en el objetivo y se hace accesible remotamente a través del túnel SSH.
- clr importa Pythonnet para cargar y ejecutar un ensamblado .NET en memoria.
- pythonmemorymodule importa PythonMemoryModule para cargar un dll desde memoria.
Uso
Iniciar el servidor
git clone https://github.com/naksyn/Pyramid
Generar certificados SSL para el servidor HTTP:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
Si desea usar su propio certificado SSL firmado, asegúrese de:
- usar formato pem
- renombrar los archivos como key.pem y cert.pem
- colocar ambos archivos en la carpeta Server.
Configurar el módulo