
Une variante de Gargoyle pour x64 afin de masquer les artefacts mémoire en utilisant uniquement ROP et PIC.
Une variante de Gargoyle pour x64 pour masquer les artefacts mémoire en utilisant uniquement ROP et PIC.
Un immense merci à @waldoirc pour avoir documenté une grande partie de cette technique sur son blog
Cette implémentation est différente en ce sens qu'elle n'utilise pas d'APC et est entièrement implémentée en PIC.
J'ai créé cela pour mieux comprendre comment contourner les artefacts mémoire en utilisant une technique similaire à Gargoyle sur x64. L'idée est de mettre en place une ROPChain qui appelle VirtualProtect() -> Sleep() -> VirtualProtect() pour marquer ma propre page comme N/A pendant le sommeil.
Contrairement à Gargoyle et autres implémentations similaires, je me repose entièrement sur ROP et ne mets en file d'attente aucun APC. DeepSleep lui-même est implémenté comme entièrement PIC, ce qui facilite l'énumération des pages mémoire qui doivent être cachées des scanners.
Lorsque le thread est actif, une MessageBox apparaît et la page de DeepSleep est marquée comme exécutable. Pendant le sommeil, la page est marquée comme N/A.
Cela contourne efficacement Moneta au moment de la rédaction si DeepSleep est injecté et que l'adresse de base du thread en cours d'exécution ne pointe pas vers de la mémoire privée engagée.
J'ai vérifié cela en utilisant la technique d'injection Earlybird pour injecter DeepSleep.bin dans notepad.exe

En utilisant Mingw :
Tapez make et un sauvage DeepSleep.bin apparaît.
Alternativement, utilisez le DeepSleep.bin précompilé :-)
Je pourrais publier un chargeur pour CS ou d'autres agents C2. Similaire à YouMayPasser, le chargeur hookerait Sleep en utilisant des HW breakpoints pour éviter les modifications suspectes de kernel32.dll.
Cela a été testé sur 10.0.19044 N/A Build 19044
Les ROPgadgets sur lesquels je me repose pourraient ne pas exister dans ntdll.dll dans d'autres versions de Windows. Il est probablement judicieux d'utiliser des ROPgadgets plus petits et plus génériques et d'énumérer les gadgets dans plus de dlls que ntdll.dll.
La pile d'appels d'un thread dans l'état DelayExecution inclut des régions mémoire inconnues/altérées et inclut en plus des adresses vers VirtualProtect(). Hunt-Sleeping-Beacons détecte cela.
Il pourrait être possible d'appliquer cette métrique à d'autres C2 utilisant une technique différente pour attendre entre les callbacks.

@waldoirc pour avoir documenté une grande partie de la technique ici
@forrest Orr pour Moneta
Josh Lospinoso pour la technique originale Gargoyle