
Génère des profils malléables C2 randomisés et validés par lint pour Cobalt Strike, automatisant la configuration des beacons HTTP/S, DNS, SMB et SSH avec une randomisation personnalisable des indicateurs de compromission (IOC).
C2concealer est un outil en ligne de commande qui génère des profils malléables C2 aléatoires pour une utilisation dans Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Consultez les instructions Docker
Usage :
$ C2concealer --hostname google.com --variant 3
Flags :
(facultatif)
--hostname
Le nom d'hôte utilisé dans les paramètres côté client et serveur HTTP. Par défaut : Aucun.
--variant
Un entier définissant le nombre de variantes client/serveur HTTP à générer.
Recommandé entre 1 et 5. Maximum 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Recherche de l'outil c2lint sur votre système (partie de Cobalt Strike). Cela peut prendre 10 à 20 secondes.
[i] c2lint trouvé dans le répertoire /opt/cobaltstrike/c2lint.
Choisissez une option SSL :
1. Certificat SSL auto-signé (il suffit de fournir quelques détails)
2. Certificat SSL LetsEncrypt (nécessite un enregistrement A temporaire pour le domaine concerné pointant vers cette machine)
3. Keystore existant
4. Pas de SSL
[?] Option [1/2/3/4] :
Astuce : Utilisez toujours un certificat SSL. De préférence un certificat de LetsEncrypt ou similaire. Astuce : Les variantes HTTP vous permettent de sélectionner différents IOC pour le trafic HTTP sur différentes balises. Recommandez une valeur d'au moins 1.
Nous avons minutieusement parcouru la documentation de Cobalt Strike et défini des plages de valeurs qui auraient du sens pour chaque attribut de profil. Parfois, ces données sont aussi simples qu'un entier aléatoire dans une certaine plage, et d'autres fois nous devons choisir une valeur aléatoire dans un dictionnaire Python. Quoi qu'il en soit, nous avons commencé la création de l'outil en définissant les données qui constitueraient un profil valide.
Ensuite, nous avons divisé chaque section (ou bloc) de profil malléable en un fichier .py distinct, contenant la logique pour tirer des valeurs aléatoires appropriées pour chaque attribut, puis produire une chaîne formatée pour ce bloc de profil. Nous concaténons tous les blocs de profil, effectuons quelques vérifications de cohérence rapides, puis exécutons le profil via le linter de Cobalt Strike (c2lint). Le résultat est un profil qui devrait fonctionner pour vos engagements. Nous recommandons toujours de tester le profil (y compris l'injection de processus et le spawn) avant de lancer une campagne.
Si vous examinez le code, nous vous recommandons de commencer par ces deux fichiers : /C2concealer/main.py et /C2concealer/profile.py. Après avoir lu les commentaires, consultez les générateurs de blocs de profil individuels dans le dossier : /C2concealer/components.
C'est crucial. C'est un outil open source. Les fournisseurs peuvent facilement écrire des signatures pour les profils qu'il génère. Bien que l'exécution de l'outil fournisse un excellent point de départ pour construire un profil malléable Cobalt Strike, nous recommandons d'explorer les domaines suivants pour personnaliser les données utilisées pour peupler les profils générés :
/C2concealer/data/
De plus, vous pouvez personnaliser divers attributs tout au long du processus de génération de profil. Par exemple, dans le fichier : /C2concealer/components/stageblock.py, vous pouvez modifier la plage à partir de laquelle la valeur de la taille de l'image PE est tirée (près des lignes 73-74). Veuillez parcourir tous les différents fichiers dans le répertoire components.
Si vous êtes arrivé jusqu'ici, alors nous savons que vous tirerez beaucoup de profit de cet outil. La façon dont nous recommandons de voir cet outil est que nous avons construit le code squelette pour générer automatiquement ces profils. Maintenant, c'est à vous de réfléchir aux valeurs qui ont du sens pour chaque attribut pour vos campagnes et de mettre à jour les sources de données.
Bien que nous ayons couvert de nombreuses options possibles pour le langage de profil Malléable C2, il existe de nombreuses options que nous ne définissons pas. Nous vous encourageons vivement à consulter la documentation sur le commandement et contrôle malléable et à modifier votre profil.
Les options suivantes ne sont pas définies, ou sont définies de manière statique par C2concealer et vous devriez envisager de les modifier.
http-config| Option manquante | Remarques |
|---|---|
set block_useragents | Bloquer les motifs UA non-beacon |
set allow_useragents | Liste blanche des motifs UA (CS 4.3+) |
stage| Option manquante | Remarques |
|---|---|
set allocator | Codé en dur VirtualAlloc ; manque HeapAlloc, MapViewOfFile randomisation |
set magic_mz_x86 / magic_mz_x64 | Spoofing de l'en-tête MZ |
set magic_pe | Spoofing du marqueur PE |
set rich_header | Spoofing des métadonnées du compilateur |
set module_x86 / module_x64 | Module stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | Contournement de la vérification EAT |
set syscall_method | Aucun/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
Bloc transform-obfuscate | Options base64, lznt1, rc4, xor totalement absentes |
append dans transform-x86/x64 | Seuls prepend et strrep sont utilisés |
process-inject| Option manquante | Remarques |
|---|---|
set allocator | Codé en dur VirtualAllocEx ; manque NtMapViewOfSection randomisation |
set use_driploading | — |
set dripload_delay | — |
append dans transform-x86/x64 | Seul prepend est utilisé |
Exécution : NtQueueApcThread | Pas dans le bloc execute |
Exécution : NtQueueApcThread-s | Pas dans le bloc execute |
Exécution : ObfSetThreadContext | Pas dans le bloc execute |
Exécution : SetThreadContext | Pas dans le bloc execute |
| Spoofing de fonction d'exécution | Syntaxe module!function+0x## non supportée |
post-ex| Option manquante | Remarques |
|---|---|
set pipename | Pipe nommé pour les tâches post-ex |
dns-beacon| Option manquante | Remarques |
|---|---|
set ns_response | Gestion NS drop/idle/zero. Par défaut drop si non défini. |
set dns_stager_prepend | Préfixer des données aux charges utiles stagées |
| Transformation manquante | Remarques |
|---|---|
lznt1 | Compression — pas dans aucune chaîne d'encodage |
rc4 "key" | Chiffrement — pas dans aucune chaîne d'encodage |
xor "key" | XOR — pas dans aucune chaîne d'encodage |
uri-append | Déclaration de terminaison — non implémentée |
Un grand merci à Raphael Mudge pour avoir constamment amélioré l'ensemble des fonctionnalités de profil malléable et la documentation pour l'apprendre. Également, un énorme merci à @killswitch-GUI pour son script qui automatise la génération de certificats LetsEncrypt pour les serveurs d'équipe CS. Enfin, deux articles de blog qui ont rendu la vie tellement plus facile : l'article de @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) et l'article de Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Version 1.0
Version 1.1