
Genera profili malleabili C2 randomizzati e validati con lint per Cobalt Strike, automatizzando la configurazione di beacon HTTP/S, DNS, SMB e SSH con randomizzazione personalizzabile degli IOC.
C2concealer è uno strumento da riga di comando che genera profili malleabili C2 casuali per l'uso in Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Fai riferimento alle istruzioni Docker
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
The hostname used in HTTP client and server side settings. Default is None.
--variant
An integer defining the number of HTTP client/server variants to generate.
Recommend between 1 and 5. Max 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Searching for the c2lint tool on your system (part of Cobalt Strike). Might take 10-20 seconds.
[i] Found c2lint in the /opt/cobaltstrike/c2lint directory.
Choose an SSL option:
1. Self-signed SSL cert (just input a few details)
2. LetsEncrypt SSL cert (requies a temporary A record for the relevant domain to be pointed to this machine)
3. Existing keystore
4. No SSL
[?] Option [1/2/3/4]:
Suggerimento: usa sempre un certificato SSL. Preferibilmente un certificato da LetsEncrypt o simile. Suggerimento: le varianti HTTP ti permettono di selezionare diversi IOC per il traffico HTTP su diversi beacon. Si consiglia un valore di almeno 1.
Abbiamo analizzato la documentazione di Cobalt Strike e definito intervalli di valori che avessero senso per ogni attributo del profilo. A volte quei dati sono semplici numeri casuali all'interno di un intervallo, altre volte dobbiamo scegliere un valore casuale da un dizionario Python. In ogni caso, abbiamo iniziato la creazione dello strumento definendo i dati che avrebbero formato un profilo valido.
Poi abbiamo diviso ogni sezione (o blocco) del profilo malleabile in un file .py separato, che contiene la logica per estrarre valori appropriati casuali per ogni attributo e poi produrre una stringa formattata per quel blocco di profilo. Concateniamo tutti i blocchi del profilo, eseguiamo alcuni rapidi controlli di coerenza e poi passiamo il profilo attraverso il linter di Cobalt Strike (c2lint). L'output è un profilo che dovrebbe funzionare per i tuoi impegni. Raccomandiamo sempre di testare il profilo (inclusi process injection e spawning) prima di avviare una campagna.
Se stai guardando il codice, ti consigliamo di iniziare con questi due file: /C2concealer/__main__.py e /C2concealer/profile.py. Dopo aver esaminato i commenti, dai un'occhiata ai generatori di singoli blocchi di profilo nella cartella: /C2concealer/components.
Questo è fondamentale. Questo è uno strumento open source. I fornitori possono facilmente scrivere firme per i profili che genera. Anche se eseguire lo strumento fornisce un ottimo punto di partenza per costruire un profilo malleabile di Cobalt Strike, ti consigliamo di approfondire le seguenti aree per personalizzare i dati utilizzati per popolare i profili generati:
/C2concealer/data/
Inoltre, puoi personalizzare vari attributi in tutto il processo di generazione del profilo. Ad esempio, nel file: /C2concealer/components/stageblock.py, puoi cambiare l'intervallo da cui viene estratto il valore della dimensione dell'immagine PE (vicino alle righe 73-74). Esamina tutti i file nella directory dei componenti.
Se sei arrivato fino a qui, allora sappiamo che trarrai molto beneficio da questo strumento. Il modo in cui consigliamo di vedere questo strumento è che abbiamo costruito lo scheletro del codice per generare automaticamente questi profili. Ora sta a te pensare a quali valori abbiano senso per ogni attributo nelle tue campagne e aggiornare le fonti di dati.
Sebbene abbiamo coperto molte possibili opzioni per il linguaggio del profilo Malleable C2, ci sono molte opzioni che non impostiamo. Ti incoraggiamo vivamente a consultare la documentazione di Malleable Command and Control e modificare il tuo profilo.
Le seguenti opzioni non sono impostate, o sono impostate staticamente da C2concealer e dovresti considerare di cambiarle.
http-config| Opzione mancante | Note |
|---|---|
set block_useragents | Blocca i pattern UA non beacon |
set allow_useragents | Whitelist dei pattern UA (CS 4.3+) |
stageprocess-injectpost-ex| Opzione mancante | Note |
|---|---|
set pipename | Pipe con nome per i job post-ex |
dns-beacon| Opzione mancante | Note |
|---|---|
set ns_response | Gestione NS drop/idle/zero. Se non impostato, predefinito drop. |
set dns_stager_prepend |
| Trasformazione mancante | Note |
|---|---|
lznt1 | Compressione — non in nessuna catena di encoding |
rc4 "key" |
Un grande ringraziamento a Raphael Mudge per aver migliorato costantemente il set di funzionalità dei profili malleabili e la documentazione per imparare a usarli. Inoltre, un enorme grazie a @killswitch-GUI per il suo script che automatizza la generazione di certificati LetsEncrypt per i server team di CS. Infine, due post di blog che hanno reso la vita molto più facile: il post di @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) e il post di Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Versione 1.0
Versione 1.1
| Opzione mancante | Note |
|---|
set allocator | Hardcoded VirtualAlloc; manca la randomizzazione HeapAlloc, MapViewOfFile |
set magic_mz_x86 / magic_mz_x64 | Spoofing dell'intestazione MZ |
set magic_pe | Spoofing del marcatore PE |
set rich_header | Spoofing dei metadati del compilatore |
set module_x86 / module_x64 | Module stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | Bypass del controllo EAT |
set syscall_method | Nessuno/Diretto/Indiretto (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
Blocco transform-obfuscate | Opzioni base64, lznt1, rc4, xor completamente assenti |
append in transform-x86/x64 | Vengono usati solo prepend e strrep |
| Opzione mancante | Note |
|---|
set allocator | Hardcoded VirtualAllocEx; manca la randomizzazione NtMapViewOfSection |
set use_driploading | — |
set dripload_delay | — |
append in transform-x86/x64 | Viene usato solo prepend |
Execute: NtQueueApcThread | Non nel blocco execute |
Execute: NtQueueApcThread-s | Non nel blocco execute |
Execute: ObfSetThreadContext | Non nel blocco execute |
Execute: SetThreadContext | Non nel blocco execute |
| Spoofing della funzione Execute | Sintassi module!function+0x## non supportata |
| Anteponi dati ai payload staged |
| Cifratura — non in nessuna catena di encoding |
xor "key" | XOR — non in nessuna catena di encoding |
uri-append | Dichiarazione di terminazione — non implementata |