
CobaltWhispers est un script d'agresseur qui utilise une collection de fichiers d'objet Beacon (BOF) pour Cobalt Strike afin d'effectuer des injections de processus, de la persistance et plus encore, en tirant parti d'appels système directs (SysWhispers2) pour contourner les EDR/AV.
Auteur : @Cerbersec
CobaltWhispers est un script aggressor qui utilise une collection de Beacon Object Files pour Cobalt Strike afin d'effectuer de l'injection de processus, de la persistance et plus encore, en tirant parti des appels système directs pour contourner les EDR/AV.
CobaltWhispers est propulsé par SysWhispers2 et InlineWhispers2
CobaltWhispers est basé sur StayKit et sur les travaux de Hasherezade et Forrest Orr.
CobaltWhispers a été réalisé dans le cadre d'un stage au sein de la Red Team de NVISO Security. Les articles de blog associés sont disponibles ici (injection de processus) et ici (kernel karnage).
CobaltWhispers nécessite plusieurs outils pour être compilé :
apt install mingw-w64apt install makeChaque projet nécessite 3 fichiers générés par SysWhispers2 / InlineWhispers2 pour fonctionner :
Ces fichiers peuvent être générés conformément à la documentation d'InlineWhispers2, cependant cette méthode n'est pas optimale car beaucoup de code inutile sera inclus :
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
À la place, utilisez SysWhispers2 pour générer les fichiers de sortie uniquement pour les API nécessaires, puis fournissez-les manuellement (ou via un script) à InlineWhispers2 qui les convertira dans le format approprié. Consultez le makefile inclus pour plus d'informations ou utilisez les fichiers inclus à vos risques et périls.
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| - | - | 5 | Non | Hérite des autorisations du processus parent |
Démarre un nouveau processus suspendu avec Code Integrity Guard (CIG) activé pour bloquer les binaires signés non Microsoft. Usurpe le processus parent spécifié. Le PID est renvoyé.
Processus parent : Le nom du processus à définir comme parent
Emplacement de l'exécutable : Chemin complet de l'exécutable sur le disque utilisé pour démarrer le nouveau processus
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | Non | - |
Injecte une charge utile dans un processus distant via NtCreateThreadEx
PID du processus : L'identifiant du processus distant
Emplacement de la charge utile : Emplacement de la charge utile sous forme binaire sur le disque (Conditionnel | Facultatif)
Charge utile b64 : Shellcode brut au format chaîne encodée en base64 (Conditionnel | Facultatif)
Listener : Listener pour lequel générer la charge utile (Conditionnel)
Un listener doit être spécifié pour générer une charge utile Beacon. Si une charge utile manuelle est souhaitée, elle doit être fournie via un chemin vers le binaire brut sur le disque, ou un shellcode encodé en base64.
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | Non | Peut potentiellement faire planter le processus cible |
Injecte une charge utile dans un processus distant via NtQueueApcThread
PID du processus : L'identifiant du processus distant
Threads : Nombre de threads auxquels ajouter un appel APC
Emplacement de la charge utile : Emplacement de la charge utile sous forme binaire sur le disque (Conditionnel | Facultatif)
Charge utile b64 : Shellcode brut au format chaîne encodée en base64 (Conditionnel | Facultatif)
Listener : Listener pour lequel générer la charge utile (Conditionnel)
Un listener doit être spécifié pour générer une charge utile Beacon. Si une charge utile manuelle est souhaitée, elle doit être fournie via un chemin vers le binaire brut sur le disque, ou un shellcode encodé en base64.
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| Shellcode/Raw | Processus de substitution | 5 | Non | - |
Injecte une charge utile dans un processus de substitution via NtMapViewOfSection
Processus parent : Le nom du processus à définir comme parent
Emplacement de l'exécutable : L'emplacement sur disque de l'exécutable à utiliser pour démarrer un nouveau processus
Emplacement de la charge utile : Emplacement de la charge utile sous forme binaire sur le disque (Conditionnel | Facultatif)
Charge utile b64 : Shellcode brut au format chaîne encodée en base64 (Conditionnel | Facultatif)
Listener : Listener pour lequel générer la charge utile (Conditionnel)
Un listener doit être spécifié pour générer une charge utile Beacon. Si une charge utile manuelle est souhaitée, elle doit être fournie via un chemin vers le binaire brut sur le disque, ou un shellcode encodé en base64.
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| PE | Processus de substitution | 5 | Non | Requiert une charge utile PE x64 |
Injecte une charge utile dans un processus de substitution en utilisant des sections transactionnelles et des vues mappées. Le point d'entrée distant et le PEB sont mis à jour, sans sections mémoire anormales ni permissions mémoire anormales. Voir ici pour plus d'informations.
Processus parent : Le nom du processus à définir comme parent
Emplacement de l'exécutable : L'emplacement sur disque de l'exécutable à utiliser pour démarrer un nouveau processus
Emplacement de la charge utile : Emplacement de la charge utile PE x64 sur le disque (Conditionnel | Facultatif)
Charge utile b64 : Charge utile PE x64 au format chaîne encodée en base64 (Conditionnel | Facultatif)
Listener : Listener pour lequel générer la charge utile (Conditionnel)
Un listener doit être spécifié pour générer une charge utile Beacon. Si une charge utile manuelle est souhaitée, elle doit être fournie via un chemin vers le PE x64 sur le disque, ou un PE x64 encodé en base64.
ACTUELLEMENT NON IMPLÉMENTÉ
| Type de charge utile | Cible | Fiabilité (0-5) | Admin requis | Remarques |
|---|---|---|---|---|
| Shellcode indépendant de la position (PIC) | Processus de substitution | 5 | Oui | Des permissions élevées sont requises pour ouvrir les DLL système avec des permissions d'écriture |
Injecte une charge utile dans un processus de substitution en utilisant des sections transactionnelles combinées au DLL hollowing. Voir ici pour plus d'informations.