
una herramienta para ayudar a operar en los puntos ciegos de los EDR
Pyramid está compuesto por:
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:
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.
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.
La carga en memoria de Pyramid se inspiró inicialmente y se amplió a partir de la Empyre - Finder Class de xorrior.
snovvcrash construyó los módulos mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py
Las capacidades de los módulos de Pyramid pueden ejecutarse directamente desde un intérprete de Python y actualmente son:
Funcionalidades principales del servidor HTTP Pyramid:
Funcionalidades principales del cargador inicial (cradle):
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:
Las dependencias de Python ya han sido fijadas y modificadas para importarse en memoria sin conflictos.
Actualmente hay 8 módulos de Pyramid disponibles:
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:
Como ejemplo, si desea usar pythonmemorymodule con Pyramid, coloque su payload en la carpeta Delivery_files, luego abra pythonmemorymodule.py y configure los parámetros necesarios en la parte superior del script, como el nombre del archivo payload y el procedimiento que desea llamar después de cargar el PE.
Una vez que el servidor Pyramid esté en ejecución y el script Base esté listo, puede configurar la variable pyramid_module en el archivo Agent/cradle.py y ejecutarlo en el objetivo.
El cargador inicial está diseñado para ejecutarse con las bibliotecas estándar de Python.
Ejemplo de ejecución del servidor HTTP Pyramid usando certificado SSL, proporcionando autenticación básica, cifrando archivos de entrega con ChaCha y generando automáticamente la configuración del servidor en los módulos e imprimiendo un cargador inicial listo para pegar para pythonmemorymodule:
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
Al iniciar, pyramid.py analizará su propia estructura de carpetas para buscar key.pem, cert.pem y entregará archivos desde la carpeta Server.
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
Para ejecutar Pyramid sin mostrar una ventana visible de python.exe, puede aprovechar pythonw.exe, que no abrirá una ventana de consola al ejecutarse y está contenido en el mismo paquete Windows Embeddable Package. La siguiente imagen ilustra un ejemplo de uso de pythonw.exe para ejecutar base-tunnel-socks5.py en una máquina remota sin abrir una ventana de consola de python.exe.

La carga dinámica de módulos de Python no admite de forma nativa la importación de archivos *.pyd que son esencialmente dlls. La única solución pública que conozco que resuelve este problema es la proporcionada por Scythe *(in-memory-execution) mediante la reingeniería del intérprete CPython. Para no perder la firma digital, una solución que permitiría usar el paquete Python Embeddable nativo implica eliminar en disco los archivos pyd o wheels requeridos. Esto no debería tener implicaciones OPSEC significativas en la mayoría de los casos; sin embargo, tenga en cuenta que los siguientes wheels que contienen archivos pyd se eliminan en disco para permitir que se complete la carga dinámica: *. Cryptodome: necesario para Bloodhound-Python, Impacket, DonPAPI y LaZagne *. bcrypt, cryptography, nacl, cffi: necesario para paramiko
Python.exe es un binario firmado con buena reputación y no proporciona visibilidad sobre el código dinámico de Python. Pyramid explota estas propiedades de evasión llevando a cabo tareas ofensivas desde el mismo proceso python.exe.
Por esta razón, una de las soluciones más eficientes sería bloquear por defecto los binarios y dlls firmados por la Python Foundation, creando excepciones solo para los usuarios que realmente necesiten usar binarios de Python.
También se pueden generar alertas sobre descargas de paquetes incrustables.
La implementación de PEP-578 también es factible, aunque compleja; esta es una implementación de muestra. Sin embargo, implementar PEP-578 sin bloquear el uso de binarios Python estándar podría hacer que esta contramedida sea inútil.