
Erzeugt randomisierte, lint-validierte C2-Malleable-Profile für Cobalt Strike und automatisiert die Konfiguration von HTTP/S-, DNS-, SMB- und SSH-Beacons mit anpassbarer IOC-Randomisierung.
C2concealer ist ein Kommandozeilen-Tool, das randomisierte C2-Malleable-Profile für die Verwendung in Cobalt Strike generiert.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Siehe die Docker-Anleitung
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
Der in den HTTP-Client- und Server-Einstellungen verwendete Hostname. Standard ist None.
--variant
Eine ganze Zahl, die die Anzahl der zu generierenden HTTP-Client/Server-Varianten definiert.
Empfehlung zwischen 1 und 5. Max. 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Suche nach dem c2lint-Tool auf Ihrem System (Teil von Cobalt Strike). Könnte 10-20 Sekunden dauern.
[i] c2lint im Verzeichnis /opt/cobaltstrike/c2lint gefunden.
Wählen Sie eine SSL-Option:
1. Selbstsigniertes SSL-Zertifikat (einfach ein paar Details eingeben)
2. LetsEncrypt-SSL-Zertifikat (erfordert einen temporären A-Eintrag für die entsprechende Domain, der auf diese Maschine zeigt)
3. Vorhandener Keystore
4. Kein SSL
[?] Option [1/2/3/4]:
Tipp: Verwenden Sie immer ein SSL-Zertifikat. Vorzugsweise ein Zertifikat von LetsEncrypt oder ähnlich. Tipp: HTTP-Varianten ermöglichen es Ihnen, verschiedene IOCs für den HTTP-Verkehr auf verschiedenen Beacons auszuwählen. Empfohlen wird ein Wert von mindestens 1.
Wir haben die Cobalt Strike-Dokumentation gründlich durchgearbeitet und Wertebereiche definiert, die für jedes Profilattribut sinnvoll sind. Manchmal sind diese Daten so einfach wie eine zufällige Ganzzahl in einem bestimmten Bereich, manchmal müssen wir einen zufälligen Wert aus einem Python-Wörterbuch auswählen. So oder so, wir begannen die Tool-Erstellung mit der Definition der Daten, die ein gültiges Profil ergeben. Dann teilten wir jeden Malleable-Profilabschnitt (oder Block) in eine separate .py-Datei auf, die die Logik enthält, um zufällige passende Werte für jedes Attribut zu ziehen und dann einen formatierten String für diesen Profilblock auszugeben. Wir verketten alle Profilblöcke, führen ein paar schnelle Konsistenzprüfungen durch und lassen das Profil durch den Cobalt Strike Linter (c2lint) laufen. Das Ergebnis ist ein Profil, das sollte für Ihre Engagements funktionieren. Wir empfehlen immer, das Profil (einschließlich Prozessinjektion und Spawning) vor dem Start einer Kampagne zu testen.
Wenn Sie sich den Code ansehen, empfehlen wir, mit diesen beiden Dateien zu beginnen: /C2concealer/__main__.py und /C2concealer/profile.py. Nach Durchsicht der Kommentare sehen Sie sich die einzelnen Profilblock-Generatoren im Ordner an: /C2concealer/components.
Dies ist entscheidend. Dies ist ein Open-Source-Tool. Anbieter können leicht Signaturen für die von ihm generierten Profile schreiben. Während die Ausführung des Tools einen hervorragenden Ausgangspunkt für die Erstellung eines anpassbaren Cobalt Strike-Profils bietet, empfehlen wir, in die folgenden Bereiche einzutauchen, um die Daten anzupassen, die zur Befüllung der generierten Profile verwendet werden:
/C2concealer/data/
Zusätzlich können Sie während des gesamten Profilerstellungsprozesses verschiedene Attribute anpassen. Zum Beispiel in der Datei: /C2concealer/components/stageblock.py können Sie den Bereich ändern, aus dem der PE-Image-Größenwert bezogen wird (in der Nähe der Zeilen 73-74). Bitte sehen Sie sich alle verschiedenen Dateien im Verzeichnis components an.
Wenn Sie es so weit geschafft haben, wissen wir, dass Sie viel Nutzen aus diesem Tool ziehen werden. Wir empfehlen, dieses Tool so zu betrachten, dass wir den Grundgerüstcode gebaut haben, um diese Profile automatisch zu generieren. Jetzt liegt es an Ihnen, zu überlegen, welche Werte für jedes Attribut für Ihre Kampagnen sinnvoll sind und die Datenquellen zu aktualisieren.
Obwohl wir viele mögliche Optionen für die Malleable-C2-Profilsprache abgedeckt haben, gibt es viele Optionen, die wir nicht setzen. Wir empfehlen Ihnen dringend, die Malleable Command and Control Dokumentation zu konsultieren und Ihr Profil zu modifizieren.
Die folgenden Optionen werden nicht gesetzt oder werden statisch von C2concealer gesetzt, und Sie sollten in Betracht ziehen, sie zu ändern.
http-config-Block| Fehlende Option | Anmerkungen |
|---|---|
set block_useragents | Nicht-Beacon-UA-Muster blockieren |
set allow_useragents | UA-Muster auf die Whitelist setzen (CS 4.3+) |
stage-Blockprocess-inject-Blockpost-ex-Block| Fehlende Option | Anmerkungen |
|---|---|
set pipename | Named Pipe für Post-Ex-Jobs |
dns-beacon-Block| Fehlende Option | Anmerkungen |
|---|---|
set ns_response | drop/idle/zero NS-Handhabung. Standardmäßig drop, wenn nicht gesetzt. |
set dns_stager_prepend |
| Fehlende Transformation | Anmerkungen |
|---|---|
lznt1 | Kompression — nicht in einer Kodierungskette |
rc4 "key" |
Großer Dank an Raphael Mudge für die ständige Verbesserung der Malleable-Profil-Funktionen und der Dokumentation, um darüber zu lernen. Ebenfalls großen Dank an @killswitch-GUI für sein Skript, das die LetsEncrypt-Zertifikatserstellung für CS-Teamserver automatisiert. Schließlich zwei Blogbeiträge, die das Leben so viel einfacher gemacht haben: @bluescreenofjeffs Beitrag (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) und Joe Vests Beitrag (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Version 1.0
Version 1.1
| Fehlende Option | Anmerkungen |
|---|
set allocator | Fest codiert VirtualAlloc; fehlt HeapAlloc, MapViewOfFile Randomisierung |
set magic_mz_x86 / magic_mz_x64 | MZ-Header-Spoofing |
set magic_pe | PE-Marker-Spoofing |
set rich_header | Compiler-Metadaten-Spoofing |
set module_x86 / module_x64 | Module-Stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | EAT-Prüfung umgehen |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
transform-obfuscate-Block | base64, lznt1, rc4, xor Optionen vollständig fehlend |
append in transform-x86/x64 | Nur prepend und strrep werden verwendet |
| Fehlende Option | Anmerkungen |
|---|
set allocator | Fest codiert VirtualAllocEx; fehlt NtMapViewOfSection Randomisierung |
set use_driploading | — |
set dripload_delay | — |
append in transform-x86/x64 | Nur prepend verwendet |
Execute: NtQueueApcThread | Nicht im Execute-Block |
Execute: NtQueueApcThread-s | Nicht im Execute-Block |
Execute: ObfSetThreadContext | Nicht im Execute-Block |
Execute: SetThreadContext | Nicht im Execute-Block |
| Execute-Funktionsspoofing | module!function+0x## Syntax nicht unterstützt |
| Daten an gestaffelte Payloads voranstellen |
| Verschlüsselung — nicht in einer Kodierungskette |
xor "key" | XOR — nicht in einer Kodierungskette |
uri-append | Abschlussanweisung — nicht implementiert |