
Uno script aggressor che tiene traccia delle modifiche operative effettuate durante un engagement red team. Fornisce una traccia di audit completa di ciò che è stato modificato e di ciò che deve ancora essere ripulito.
Ledger è uno script Aggressor per Cobalt Strike che traccia ogni modifica operativa effettuata durante un engagement. Ogni servizio che abiliti, regola firewall che apri, account che crei o chiave di registro che tocchi viene registrato con un punteggio di rischio, l'attribuzione dell'operatore e lo stato di pulizia. Al termine dell'engagement disponi di una traccia di audit completa di ciò che è stato modificato e di ciò che deve ancora essere ripulito.
Gli engagement di red team lasciano artefatti. I servizi vengono abilitati, gli account creati, le regole firewall aperte, le chiavi di registro modificate. Senza un log strutturato è facile dimenticarsene — soprattutto negli engagement lunghi o quando più operatori lavorano contemporaneamente.
Ledger ti offre un journal in continuo aggiornamento con:
ledger.cna nella directory degli script di Cobalt Strike.ledger.cna.dirty è ora disponibile in ogni console Beacon.Tutti i comandi vengono eseguiti da una console Beacon utilizzando l'alias dirty.
dirty <CATEGORY> <command> [comment] [score]
comment e score sono opzionali. Se omessi, vengono utilizzati valori predefiniti sensati in base alla categoria.
dirty RPC "sql-enablerpc lon-db-1 lon-db-2"
dirty DEFENDER "add-exclusion C:\windows\temp" "Payload staging" 8
dirty GROUP "net group 'Domain Admins' svc_backup /add /domain"
dirty USER "net user backdoor P@ssw0rd! /add"
dirty SCHEDULED_TASK "schtasks /create /tn updater /tr C:\temp\beacon.exe /sc onlogon"
dirty exec <CATEGORY> <command> [comment] [score]
Registra la modifica ed esegue immediatamente il comando sul beacon — un passaggio invece di due.
dirty exec RPC "sql-enablerpc lon-db-1 lon-db-2"
dirty exec USER "net user backdoor P@ssw0rd! /add"
dirty exec DEFENDER "sc config WinDefend start= disabled"
dirty exec FIREWALL "netsh advfirewall set allprofiles state off"
Limiti di dirty exec
dirty exec usa brun internamente, che esegue un binario direttamente senza un wrapper cmd.exe /c. Ciò significa:
net, sc, reg, nltest, whoami, ipconfig, ecc.sleep, cd, ls, pwd, download, upload, execute-assembly, inject, ecc. Per questi, esegui normalmente il comando Beacon e usa dirty <CATEGORY> <command> separatamente per registrarlo.dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
Mostra tutte le voci registrate. Il filtro opzionale cerca in comando, commento, categoria, hostname e nome utente.
dirty score
Mostra un riepilogo del rischio per host con punteggio aggregato, conteggio dei cleanup in sospeso e una barra visiva. Gli host sono ordinati dal punteggio più alto al più basso.
dirty clean <id>
dirty clean all
dirty clean host <hostname>
La corrispondenza dell'hostname non fa distinzione tra maiuscole e minuscole e supporta corrispondenze parziali — DESKTOP corrisponde a DESKTOP-FGN4LPG.
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
Le esportazioni vengono scritte nella directory che contiene ledger.cna e includono un riepilogo dei punteggi per host in cima, seguito dal log completo delle modifiche. I pulsanti della barra dei menu Ledger avviano direttamente esportazioni senza filtri.
dirty help
Qualsiasi categoria non elencata viene accettata con un punteggio predefinito di 3.
Per voce
| Etichetta | Punteggio |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
Aggregato (per host)
| Etichetta | Punteggio |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
Quando un beacon muore con voci del ledger non ripulite ancora in sospeso, Ledger emette un avviso rosso nell'Event Log di Cobalt Strike visibile a tutti gli operatori connessi:
L'avviso viene emesso una volta per beacon e si azzera automaticamente se il beacon si riprende e effettua nuovamente il check-in. I beacon collegati (figli) e i beacon terminati esplicitamente da un operatore sono esclusi. La tempistica dell'avviso scala con l'impostazione di sleep del beacon — uno sleep di 60s attiva l'avviso dopo ~2 minuti, uno sleep di 5m dopo ~10 minuti.
LEDGER EXPORT -- 2026-05-21 19:50:34
HOST SCORE SUMMARY
================================================================================
Host Risk Score Pending Bar
--------------------------------------------------------------------------------
DESKTOP-RLP4KBJ (sally *) CRITICAL +21 2 pend [##########]
DESKTOP-FGN4LPG (Admin) CRITICAL +18 0 pend [#########]
================================================================================
CHANGE LOG
================================================================================
[000002] 2026-05-21 19:22:56 | neo | GROUP | MEDIUM +6 | CLEANED
Host : DESKTOP-FGN4LPG
User : Admin
Process : HTTP Listener_x64.exe (PID 4716)
Command : net group 'Domain Admins' svc_backup /add /domain
Comment : Added svc_backup to Domain Admins for lateral movement
{
"exported": "2026-05-21 19:53:19",
"host_summary": [
{
"host": "DESKTOP-FGN4LPG (Admin)",
"risk": "CRITICAL",
"score": 18,
"pending": 0
},
{
"host": "DESKTOP-RLP4KBJ (sally *)",
"risk": "CRITICAL",
"score": 21,
"pending": 2
}
],
"entries": [
{
"id": "000004",
"timestamp": "2026-05-21 19:31:36",
"operator": "neo",
"beacon_id": "1607712302",
"computer": "DESKTOP-RLP4KBJ",
"beacon_user": "sally *",
"beacon_process": "HTTP Listener_x64.exe (PID 11540)",
"functionality": "USER",
"command": "net user svc_backup P@ssw0rd123! /add /domain",
"comment": "Created service account for persistence",
"score": 7,
"risk": "MEDIUM",
"cleaned": false
}
Ogni voce registrata e ripulita viene trasmessa all'Event Log di Cobalt Strike tramite elog, così tutti gli operatori connessi vedono in tempo reale le modifiche degli altri. Il journal risiede nella memoria del teamserver per l'intera durata della sessione.
ledger.cna.dirty USER "net user ..." "my comment" 9 — l'argomento finale imposta un punteggio esplicito.cmd.exe: dir, echo, set, type, pipe (|), reindirizzamenti (>), ecc. Registra questi manualmente con dirty CATEGORY "shell <command>"..cna non verranno gestiti correttamente tramite dirty exec.| Categoria | Punteggio Predefinito | Commento Predefinito |
|---|
| REGISTRY | 2 | Registro modificato |
| FIREWALL | 3 | Regola firewall modificata |
| SERVICE | 3 | Configurazione del servizio modificata |
| RPC | 4 | Modifiche apportate a RPC |
| WINRM | 4 | WinRM abilitato |
| SMB | 4 | Firma SMB modificata |
| DCOM | 4 | DCOM abilitato |
| RDP | 5 | RDP abilitato |
| SCHEDULED_TASK | 5 | Attività pianificata creata |
| DEFENDER | 6 | Configurazione di Defender modificata |
| GROUP | 6 | Appartenenza al gruppo modificata |
| USER | 7 | Account utente modificato |
| ACL | 8 | ACL modificata |
| SPN | 8 | SPN modificato |
| DOMAIN_ADMIN | 9 | Gruppo Domain Admin modificato |
| TRUST | 9 | Relazione di trust modificata |