Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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é.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Fiber — PoC basé sur Rust utilisant des fibres Windows pour exécuter du code en mémoire de manière furtive, cachant les piles de payloads des EDR en basculant entre les fibres de contrôle et de payload sans rappels du noyau. | Kitploit
Outils/GitHubGitHub/kudaes/fiber
Post-ExploitationRed TeamingDéveloppement de Charges Utiles
GitHubkudaes/fiber

Fiber

PoC basé sur Rust utilisant des fibres Windows pour exécuter du code en mémoire de manière furtive, cachant les piles de payloads des EDR en basculant entre les fibres de contrôle et de payload sans rappels du noyau.

Voir le dépôt
2451843il y a 2 ansVérifié par Kitploit

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

Description

Une fibre est une unité d'exécution qui doit être planifiée manuellement par l'application plutôt que de se reposer sur le mécanisme de planification basé sur les priorités intégré à Windows. Les fibres sont souvent appelées threads légers. Pour des informations plus détaillées sur ce que sont les fibres et comment elles fonctionnent, consultez la documentation officielle. Les fibres permettent d'avoir plusieurs flux d'exécution dans un seul thread, chacun avec son propre état des registres et sa pile. D'autre part, les fibres sont invisibles pour le noyau, ce qui en fait une méthode plus furtive (et moins coûteuse) pour exécuter du code en mémoire que de créer de nouveaux threads.

Un thread peut créer plusieurs fibres et basculer entre elles à volonté en appelant la fonction SwitchToFiber. Avant cela, le thread lui-même doit être devenu une fibre en appelant ConvertThreadToFiber car seule une fibre peut créer d'autres fibres. Enfin, pour créer une fibre qui, lorsqu'elle est programmée, exécute du code en mémoire (par exemple, après avoir chargé de manière reflective un PE ou un shellcode), il suffit d'appeler CreateFiber.

La fonction SwitchToFiber est la partie la plus importante de ce processus et là où toute la magie opère. Cette fonction permet de planifier une fibre ou une autre, tout en espace utilisateur. Selon la documentation officielle, « la fonction SwitchToFiber enregistre les informations d'état de la fibre actuelle et restaure l'état de la fibre spécifiée ». Cela signifie que lorsque cette fonction est appelée, les valeurs des registres et la pile sont commutées de l'état de la fibre actuelle à l'état de la fibre cible, permettant de « cacher » la pile de la fibre actuelle une fois le processus terminé. Cela permet également de reprendre l'exécution de la fibre cible au point où l'exécution a été arrêtée (de la même manière que lorsqu'un planificateur alterne entre les threads selon sa propre logique de priorité).

Et c'est exactement ce que fait ce PoC simple :

  • D'abord, nous avons un chargeur, qui utilise DInvoke pour mapper manuellement la dll qui contient notre charge utile.
  • Ensuite, le chargeur transforme le thread actuel en une fibre (appelée dorénavant la fibre de contrôle). La fibre de contrôle profite d'une pile « normale » puisque le chargeur est exécuté à partir d'un PE sur disque.
  • Le chargeur crée ensuite une nouvelle fibre pour exécuter la fonction run() exportée par la dll mappée manuellement. Cette fibre sera appelée la fibre de charge utile à partir de maintenant.
  • La fibre de contrôle bascule vers la fibre de charge utile, qui exécutera le code que la charge utile contient. Une fois que la charge utile doit entrer dans un état alertable (par exemple, lorsqu'un appel à Sleep est nécessaire), la fibre de charge utile rebascule vers la fibre de contrôle, cachant ainsi sa pile (qui peut contenir plusieurs IOC d'activité malveillante).
  • La fibre de contrôle effectue l'appel à Sleep. Lorsque l'appel revient, elle bascule à nouveau vers la fibre de charge utile pour qu'elle puisse continuer son exécution.

Ce processus se répète indéfiniment.

Avantages

L'utilisation des fibres peut être avantageuse pour certains types de charges utiles (comme une balise C2) pour certaines de ces raisons :

  • Les fibres permettent d'exécuter du code en mémoire sans avoir besoin d'utiliser les instructions JMP ou CALL du chargeur pointant vers des régions mémoire non adossées.
  • Cette exécution se fait sans création de nouveaux threads, empêchant la génération de callbacks du noyau qui pourraient être collectés par un EDR.
  • La pile de la fibre de charge utile peut être cachée lorsque la charge utile entre dans un état alertable ou lorsqu'elle doit attendre une opération d'E/S en attente. Cela se fait en utilisant une fibre de contrôle avec une pile normale qui exécute du code depuis le disque. Ce « masquage » est moins coûteux et plus facile à mettre en œuvre que le processus habituel de spoofing de pile de thread.
  • Les fibres sont invisibles pour le noyau et toute la procédure de commutation se déroule en espace utilisateur, ce qui facilite le camouflage face à un EDR.

Inconvénients

  • Une seule fibre peut être planifiée à la fois sur un thread, ce qui signifie que pour obtenir une véritable concurrence en utilisant des fibres, vous devez créer plus de threads.
  • Bien que la pile de la fibre de charge utile soit cachée lorsque la fibre de contrôle est de nouveau activée, elle reste dans la mémoire du processus et pourrait être repérée par une inspection mémoire.
  • L'obfuscation est toujours nécessaire pour cacher l'implant en mémoire ; il s'agit uniquement de cacher la pile et la méthode d'exécution.

Compilation

Puisque nous utilisons le plugin LITCRYPT pour obscurcir les littéraux de chaîne, il est nécessaire de définir la variable d'environnement LITCRYPT_ENCRYPT_KEY avant de compiler le code :

root@kitploit:~
C:\Users\User\Desktop\Fiber> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"

Ensuite, compilez simplement la charge utile et le chargeur, puis exécutez ce dernier :

root@kitploit:~
C:\Users\User\Desktop\Fiber\payload> cargo build --release
C:\Users\User\Desktop\Fiber\loader> cargo build --release
C:\Users\User\Desktop\Fiber\loader\target\release> loader.exe

Utilisation

Il n'y a pas beaucoup de mystère dans l'exécution de ce PoC. Tout ce qu'il faut faire, c'est exécuter le chargeur et utiliser un outil comme ProcessHacker pour inspecter la pile du thread. Étant donné que la charge utile rebascule vers la fibre de contrôle avant de dormir, la pile de la fibre de charge utile reste cachée la plupart du temps. Vous verrez dans la sortie comment les deux fibres sont programmées consécutivement selon la logique déjà commentée.

Le code est commenté pour montrer comment utiliser, créer et planifier des fibres. Vous remarquerez que le chargeur et la charge utile fournis en exemple sont « bloqués » dans une boucle infinie, ce qui permet de basculer indéfiniment entre les fibres et de continuer l'exécution.

Si une charge utile différente doit être testée, modifiez simplement le chemin situé à la ligne 32 du fichier src::main.rs du chargeur. Dans ce cas, la nouvelle dll doit exporter une fonction run(PVOID) qui recevra comme paramètre d'entrée l'adresse de la fibre de contrôle. Cette fonction doit rebasculer vers la fibre de contrôle pour appeler la fonction Sleep, bien que vous puissiez modifier ce comportement à volonté pour répondre à vos besoins.

Une autre façon de tester cet outil avec une charge utile aléatoire est d'effectuer un hooking IAT pour rediriger tout appel à la fonction Sleep (ou à toute autre fonction importée) effectué par la charge utile vers une fonction située dans le chargeur, permettant de rebasculer vers la fibre de contrôle lorsque cet appel se produit. À vous de voir.

Dans les captures d'écran suivantes, nous pouvons voir comment la pile du thread actuel passe d'une région mémoire privée à une autre lorsque nous basculons les fibres :

Stack in Process Hacker Stack in Process Hacker

Télécharger l’outil