
Um script agressor que rastreia mudanças operacionais feitas durante um engajamento de red team. Fornece uma trilha de auditoria completa do que foi alterado e do que ainda precisa ser limpo.
O Ledger é um script agressor do Cobalt Strike que rastreia todas as mudanças operacionais feitas durante uma operação. Cada serviço que você habilita, regra de firewall que você abre, conta que você cria ou chave de registro que você altera é registrada com uma pontuação de risco, atribuição de operador e status de limpeza. Ao final da operação, você tem uma trilha de auditoria completa do que foi alterado e do que ainda precisa ser limpo.
Operações de red team deixam artefatos. Serviços são habilitados, contas são criadas, regras de firewall são abertas, chaves de registro são modificadas. Sem um log estruturado, é fácil esquecê-los — especialmente em operações longas ou quando vários operadores trabalham simultaneamente.
O Ledger oferece um registro contínuo com:
ledger.cna para o diretório de scripts do seu Cobalt Strike.ledger.cna.dirty agora está disponível em todos os consoles do Beacon.Todos os comandos são executados a partir de um console do Beacon usando o alias dirty.
dirty <CATEGORY> <command> [comment] [score]
comment e score são opcionais. Se omitidos, valores padrão adequados são usados com base na 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 a alteração e executa imediatamente o comando no beacon — uma etapa em vez de duas.
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"
Limitações do dirty exec
dirty exec usa brun internamente, que executa um binário diretamente sem um wrapper cmd.exe /c. Isso significa:
net, sc, reg, nltest, whoami, ipconfig, etc.sleep, cd, ls, pwd, download, upload, execute-assembly, inject, etc. Para esses, execute o comando do Beacon normalmente e use dirty <CATEGORY> <command> separadamente para registrá-lo.cmd.exe: dir, echo, set, type, pipes (|), redirecionamentos (>), etc. Registre-os manualmente com dirty CATEGORY "shell <command>"..cna não serão despachados corretamente por meio de dirty exec.dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
Mostra todas as entradas registradas. O filtro opcional corresponde a comando, comentário, categoria, hostname e nome de usuário.

dirty score
Mostra um resumo de risco por host com pontuação agregada, contagem de limpezas pendentes e uma barra visual. Os hosts são classificados do maior score para o menor.
dirty clean <id>
dirty clean all
dirty clean host <hostname>
A correspondência de hostname não diferencia maiúsculas de minúsculas e aceita correspondências parciais — DESKTOP corresponde a DESKTOP-FGN4LPG.
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
As exportações são gravadas no diretório que contém ledger.cna e incluem um resumo de pontuação por host no topo, seguido pelo log completo de alterações. Os botões da barra de menus do Ledger acionam exportações sem filtro diretamente.
dirty help
| Categoria | Pontuação Padrão | Comentário Padrão |
|---|---|---|
| REGISTRY | 2 | Registro modificado |
| FIREWALL | 3 | Regra de firewall modificada |
| SERVICE | 3 | Configuração de serviço alterada |
| RPC | 4 | Alterações feitas no RPC |
| WINRM | 4 | WinRM habilitado |
| SMB | 4 | Assinatura SMB alterada |
| DCOM | 4 | DCOM habilitado |
| RDP | 5 | RDP habilitado |
| SCHEDULED_TASK | 5 | Tarefa agendada criada |
| DEFENDER | 6 | Configuração do Defender alterada |
| GROUP | 6 | Associação a grupo modificada |
| USER | 7 | Conta de usuário modificada |
| ACL | 8 | ACL modificada |
| SPN | 8 | SPN modificado |
| DOMAIN_ADMIN | 9 | Grupo de administradores de domínio modificado |
| TRUST | 9 | Relação de confiança modificada |
Qualquer categoria não listada é aceita com uma pontuação padrão de 3.
Por entrada
| Rótulo | Score |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
Agregado (por host)
| Rótulo | Score |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
Quando um beacon fica morto ainda com entradas de ledger não limpas pendentes, o Ledger dispara um aviso vermelho no Event Log do Cobalt Strike, visível para todos os operadores conectados:

O aviso é acionado uma vez por beacon e é redefinido automaticamente se o beacon se recuperar e fizer check-in novamente. Beacons vinculados (filhos) e beacons explicitamente mortos por um operador são excluídos. O tempo do aviso acompanha a configuração de sleep do beacon — um sleep de 60s dispara após ~2 minutos, um sleep de 5m após ~10 minutos.
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
}
Cada entrada registrada e limpa é transmitida para o Event Log do Cobalt Strike via elog, para que todos os operadores conectados vejam as alterações uns dos outros em tempo real. O registro permanece na memória do teamserver durante toda a sessão.
ledger.cna.dirty USER "net user ..." "my comment" 9 — o último argumento define uma pontuação explícita.