Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ShellcodeFluctuation — Une technique avancée d'évasion en mémoire qui fait fluctuer la protection mémoire du shellcode entre RW/NoAccess et RX, puis chiffre/déchiffre son contenu. | Kitploit
Outils/GitHubGitHub/mgeeky/shellcodefluctuation
Génération de PayloadsShellcodePost-ExploitationRed TeamingGénération de ShellcodeDéveloppement de Charges UtilesAttaque AdversarialeTop en Développement de Charges Utiles n°16Top en Génération de Payloads n°16Top en Shellcode n°14
1.1k16347il y a 4 ansVérifié par Kitploit
Top en Génération de Shellcode n°16
GitHubmgeeky/shellcodefluctuation

ShellcodeFluctuation

Une technique avancée d'évasion en mémoire qui fait fluctuer la protection mémoire du shellcode entre RW/NoAccess et RX, puis chiffre/déchiffre son contenu.

Voir le dépôt

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Shellcode Fluctuation PoC

Une implémentation PoC pour une autre technique d'évasion en mémoire qui chiffre et déchiffre cycliquement le contenu du shellcode pour le faire fluctuer entre les protections mémoire RW (ou NoAccess) et RX. Lorsque notre shellcode réside dans des pages mémoire RW ou NoAccess, des scanners tels que Moneta ou pe-sieve seront incapables de le localiser et de le dump pour une analyse plus approfondie.

Intro

Après avoir publié ThreadStackSpoofer, j'ai reçu quelques questions à propos du point suivant du README :

Changez la protection des pages mémoire de votre Beacon en RW (depuis RX/RWX) et chiffrez leur contenu avant l'endormissement (cela pourrait contourner des scanners tels que Moneta ou pe-sieve)

Avant cela, j'étais assez convaincu que la communauté savait déjà comment chiffrer/déchiffrer ses payloads et modifier ses protections mémoire pour simplement contourner les scanners mémoire à la recherche de régions exécutables anormales. Les questions ont prouvé le contraire, j'ai donc décidé de publier ce PoC non armé pour documenter une autre stratégie d'évasion et proposer une implémentation d'exemple à la communauté.

Ce PoC est une démonstration d'une technique plutôt simple, déjà connue de la communauté offensive (donc je n'apporte rien de vraiment nouveau ici), dans l'espoir de lever le voile sur la magie démontrée par certains frameworks commerciaux qui exhibent leurs capacités d'évasion ciblant les deux scanners mémoire susmentionnés.

Voici une comparaison lors de la fluctuation vers RW (une autre option consiste à fluctuer vers PAGE_NOACCESS — décrite ci-dessous) :

  1. Beacon non chiffré
  2. Beacon chiffré (fluctuant)

comparison

Cette implémentation, accompagnée de mon ThreadStackSpoofer, apporte à la communauté Offensive Security des implémentations d'exemple pour rattraper l'offre des produits C2 commerciaux, afin que nous ne fassions pas moins bien dans nos outils Red Team. 💪


Comment ça marche ?

Ce programme effectue une auto-injection de shellcode (grossièrement via le classique VirtualAlloc + memcpy + CreateThread). Lorsque le shellcode s'exécute (cette implémentation cible spécifiquement les implants Cobalt Strike Beacon), une fonction Windows sera hookée pour intercepter le moment où le Beacon s'endort : kernel32!Sleep. Chaque fois que la fonction hookée MySleep est appelée, elle localise les limites de son allocation mémoire, bascule leur protection en RW et applique un xor32 sur tous les octets qui y sont stockés. Après avoir attendu le délai prévu, lorsque le shellcode revient dans notre handler MySleep, nous déchiffrons les données du shellcode et rebasculons la protection en RX.

Fluctuation vers PAGE_READWRITE — déroulement

  1. Lire le contenu du shellcode depuis un fichier.
  2. Hooker kernel32!Sleep en le faisant pointer vers notre callback.
  3. Injecter et lancer le shellcode via VirtualAlloc + memcpy + CreateThread. Contrairement à ce que nous avions dans ThreadStackSpoofer, nous ne hookons ici rien dans ntdll pour lancer notre shellcode, mais nous y sautons depuis notre propre fonction. Cela tente d'éviter de laisser de simples IOC en mémoire pointant vers une mémoire ntdll modifiée.
  4. Dès que le Beacon tente de s'endormir, notre callback MySleep est invoqué.
  5. L'allocation mémoire du Beacon est chiffrée et sa protection basculée en RW
  6. Nous déhookons ensuite le kernel32!Sleep d'origine pour éviter de laisser un simple IOC en mémoire indiquant que Sleep a été trampoliné (hooké en ligne).
  7. Un appel au ::Sleep d'origine est effectué pour laisser le Beacon dormir en attendant de nouvelles communications.
  8. Une fois le Sleep terminé, nous déchiffrons les données de notre shellcode, rebasculons ses protections mémoire en RX puis re-hookons kernel32!Sleep pour garantir l'interception des endormissements suivants.

Fluctuation vers PAGE_NOACCESS — déroulement

  1. Lire le contenu du shellcode depuis un fichier.
  2. Hooker kernel32!Sleep en le faisant pointer vers notre callback.
  3. Injecter et lancer le shellcode via VirtualAlloc + memcpy + CreateThread ...
  4. Initialiser un Vectored Exception Handler (VEH) pour mettre en place notre propre handler qui attrapera les exceptions Access Violation.
  5. Dès que le Beacon tente de s'endormir, notre callback MySleep est invoqué.
  6. L'allocation mémoire du Beacon est chiffrée et sa protection basculée en PAGE_NOACCESS
  7. Nous déhookons ensuite le kernel32!Sleep d'origine pour éviter de laisser un simple IOC en mémoire indiquant que Sleep a été trampoliné (hooké en ligne).
  8. Un appel au ::Sleep d'origine est effectué pour laisser le Beacon dormir en attendant de nouvelles communications.
  9. Une fois le Sleep terminé, nous re-hookons kernel32!Sleep pour garantir l'interception des endormissements suivants.
  10. Le shellcode tente ensuite de reprendre son exécution, ce qui provoque une Access Violation puisque ses pages sont marquées NoAccess.
  11. Notre VEH Handler attrape l'exception, déchiffre et rebascule les protections mémoire en RX puis le shellcode reprend son exécution.

Ce n'est pas une technique nouvelle

La technique n'est pas récente, et ce n'est rien que j'ai inventé moi-même. C'est simplement une implémentation montrant le concept et son utilisation pratique pour permettre à notre communauté Offensive Security de rattraper l'offre des frameworks C2 commerciaux.

En réalité, j'ai été introduit à l'idée de basculer la protection mémoire du shellcode il y a quelques années grâce au travail de Josh Lospinoso dans son incroyable Gargoyle.

Voici davantage de contexte :

  • gargoyle, a memory scanning evasion technique
  • Bypassing Memory Scanners with Cobalt Strike and Gargoyle

Gargoyle pousse le concept du shellcode auto-conscient et auto-fluctuant encore plus loin, en exploitant une séquence ROP appelant VirtualProtect. Cependant, si la technique est impressionnante, elle est tout aussi difficile à exploiter avec le Beacon de Cobalt Strike sans avoir à tuer son thread et à réinitialiser continuellement le Beacon en mémoire.

Ce n'est pas parfait, mais puisque nous opérons déjà depuis le terrain de notre propre processus loader à auto-injection, nous pouvons faire ce que nous voulons de l'environnement dans lequel le shellcode évolue et le cacher comme bon nous semble. Cette technique (ainsi que la précédente, ThreadStackSpoofer) montre les avantages d'exécuter nos shellcodes de cette manière.

L'implémentation de la fluctuation vers PAGE_NOACCESS est inspirée du travail d'ORCA666 présenté dans son injecteur https://github.com/ORCA666/0x41. Il a démontré que :

  1. nous pouvons initialiser un vectored exception handler (VEH),
  2. basculer les pages du shellcode en no-access
  3. puis attraper les exceptions Access Violation qui se produiront dès que le shellcode voudra reprendre son exécution, et déchiffrer + rebasculer ses pages mémoire en Read+Execute.

Cette implémentation contient cette idée, disponible avec l'option 2 dans <fluctuate>. Assurez-vous également de consulter ses autres projets.


Demo

Télécharger l’outil