
API Python per l'utilizzo con la specifica External C2 di Cobalt Strike
Framework Python per l'utilizzo con la specifica External C2 di Cobalt Strike come descritto nella specifica.
L'obiettivo progettuale principale è essere un'implementazione molto modulare della specifica external c2 che fornisca un'astrazione sufficiente per implementare facilmente canali C2 per Cobalt Strike. Idealmente, tutto ciò che un utente deve fare è creare un modulo transport, un modulo encoder e compilare un file di configurazione per implementare un nuovo canale.
Dovrai apportare diverse modifiche alla configurazione prima di iniziare. Dovrai:
builds/client/dbox/dbox_client.py, cambia token con quello generato al punto 2.builds/server/utils/transports/transport_dbox.py apporta le stesse modifiche fatte al punto 3.cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna dal tuo client CS.cd builds/server/ && ./dbox_server.pyLink al video demo: https://www.youtube.com/watch?v=nTRHSh_uCcA
Questo progetto è composto da tre parti principali:
Il builder costruisce dinamicamente le distribuzioni client e server in base alla configurazione specificata. Idealmente, il client dovrebbe poter essere distribuito come un singolo file compilato, come una DLL o un EXE.
Il client è essenzialmente il payload che viene eseguito sull'endpoint, indicato come third-party client nella specifica. La logica del client è principalmente statica:
transporttransporttransport per nuovi tasktransportLe configurazioni necessarie per i meccanismi di trasporto e codifica vengono copiate staticamente nel client. Anche la logica delle funzioni per i meccanismi di trasporto e codifica viene copiata staticamente dai rispettivi moduli.
La logica dell'iniezione di processo è determinata dal builder.
Il server è l'applicazione che fa da intermediario nella comunicazione tra il client e il c2 server, indicato come third-party Client Controller nella specifica. La logica del server è principalmente statica, ma supporta output verbose e di debug per assistere nello sviluppo:
encodertransporttransportencodertransporttransportencoderLa scelta di quali moduli encoder e transport il server importi è determinata dai valori presenti in config.py.
Non viene eseguito alcun import di moduli transport o encoder non utilizzati.
Le tabelle seguenti descrivono le funzioni condivise tra i moduli encoding e transport e il client. Le funzioni condivise sono essenzialmente lo stesso identico codice.
NOTA MOLTO IMPORTANTE: I dati inviati alle funzioni sendData e recvData del client devono essere dati grezzi, mentre i dati inviati alle funzioni sendData e retrieveData del modulo di trasporto devono essere già codificati o decodificati come necessario.
| Funzione di trasporto | Funzione Client | Descrizione |
|---|---|---|
| Funzione encoder | Funzione Client | Descrizione |
|---|---|---|
| encode | encode | Definisce le modifiche apportate ai dati grezzi per prepararli al trasporto |
| decode | decode | Definisce le modifiche apportate ai dati grezzi ricevuti dal trasporto per essere inoltrati alla loro destinazione |
Per prima cosa, determina quale modulo di trasporto e di codifica desideri utilizzare. Per l'esempio seguente useremo transport_gmail e encoder_b64url.
Successivamente, modifica server/config.py in base alle tue esigenze, assicurandoti che ENCODER_MODULE e TRANSPORT_MODULE siano configurati correttamente e puntino ai moduli desiderati:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
Successivamente, modifica la sezione di configurazione per i moduli transport e encoder selezionati.
Assicurati che la sezione di configurazione di client/mechanism/$mechanism_client.py corrisponda a tutte le configurazioni che hai definito finora.
Sulla macchina che esegue il server, esegui:
python server.py
Per un output più verbose, puoi eseguire:
python server.py -v
Per un output più verbose e ulteriori informazioni utili per il debug, puoi eseguire:
python server.py -d
Successivamente, esegui il client sull'endpoint di destinazione.
Se tutto ha funzionato, un nuovo beacon verrà registrato nella console di Cobalt Strike con cui potrai interagire.
Perché hai scritto questo?: Non c'erano molte implementazioni rilasciate della specifica e, tra quelle rilasciate, o non sono in un linguaggio che conosco oppure non hanno la modularità e l'astrazione che cercavo.
Perché Python 2?: Sono pigro ed è facile implementare nuovi canali di trasporto e codifica.
Il tuo codice fa schifo: Questa non è una domanda.
Posso inviare nuovi moduli di trasporto e/o codifica?: Sì, per favore! Invia una pull request e sarò felice di esaminarla.
Astrazione e modularità simili verranno implementate anche nel componente client, per supportare diversi metodi di iniezione di processo per il payload del beacon e altre funzionalità in programma.
Attualmente manca la funzionalità del builder, che dovrebbe costruire dinamicamente le distribuzioni client e server, ma è nella roadmap.
| prepTransport |
| prepTransport |
| Esegue tutte le preconfigurazioni necessarie per utilizzare il meccanismo di trasporto |
| sendData | sendData | Definisce come i dati vengono inviati tramite il meccanismo di trasporto |
| retrieveData | recvData | Definisce come i dati vengono ricevuti tramite il meccanismo di trasporto |