
Un script de Aggressor que rastrea los cambios operativos realizados durante un ejercicio de red team. Te proporciona un registro de auditoría completo de lo que se cambió y de lo que aún queda por limpiar.
Ledger es un script agresor de Cobalt Strike que registra cada cambio operativo realizado durante un compromiso. Cada servicio que habilitas, regla de firewall que abres, cuenta que creas o clave de registro que tocas queda registrada con una puntuación de riesgo, atribución al operador y estado de limpieza. Al final del compromiso tienes un rastro de auditoría completo de lo que se cambió y de lo que aún necesita limpieza.
Los compromisos de red team dejan artefactos. Se habilitan servicios, se crean cuentas, se abren reglas de firewall, se modifican claves de registro. Sin un registro estructurado es fácil olvidarlos, especialmente en compromisos largos o cuando varios operadores trabajan simultáneamente.
Ledger te ofrece un diario en curso con:
ledger.cna al directorio de scripts de Cobalt Strike.ledger.cna.dirty ya está disponible en cada consola de Beacon.Todos los comandos se ejecutan desde una consola de Beacon usando el alias dirty.
dirty <CATEGORY> <command> [comment] [score]
comment y score son opcionales. Si se omiten, se usan valores predeterminados sensatos según la categoría.
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 el cambio y ejecuta inmediatamente el comando en el beacon: un solo paso en lugar de dos.
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"
Limitaciones de dirty exec
dirty exec usa brun internamente, que ejecuta un binario directamente sin un envoltorio cmd.exe /c. Esto significa:
net, sc, reg, nltest, whoami, ipconfig, etc.sleep, cd, ls, pwd, download, upload, execute-assembly, inject, etc. Para esas, ejecuta el comando de Beacon normalmente y usa dirty <CATEGORY> <command> por separado para registrarlo.dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
Muestra todas las entradas registradas. El filtro opcional coincide con comando, comentario, categoría, nombre de host y nombre de usuario.
dirty score
Muestra un resumen de riesgo por host con puntuación agregada, recuento de limpieza pendiente y una barra visual. Los hosts se ordenan de mayor a menor puntuación.
dirty clean <id>
dirty clean all
dirty clean host <hostname>
La coincidencia de nombre de host no distingue mayúsculas y admite coincidencias parciales: DESKTOP coincide con DESKTOP-FGN4LPG.
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
Las exportaciones se escriben en el directorio que contiene ledger.cna e incluyen un resumen de puntuación por host al principio seguido del registro de cambios completo. Los botones del menú Ledger en la barra de menús activan exportaciones sin filtro directamente.
dirty help
Cualquier categoría no listada se acepta con una puntuación predeterminada de 3.
Por entrada
| Etiqueta | Puntuación |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
Agregado (por host)
| Etiqueta | Puntuación |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
Cuando una baliza muere con entradas de Ledger sin limpiar pendientes, Ledger envía una advertencia roja al registro de eventos de Cobalt Strike visible para todos los operadores conectados:
La advertencia se dispara una vez por baliza y se restablece automáticamente si la baliza se recupera y vuelve a conectarse. Las balizas vinculadas (hijas) y las balizas eliminadas explícitamente por un operador quedan excluidas. El tiempo del aviso se escala con el ajuste de sueño de la baliza: un sueño de 60s se dispara después de ~2 minutos, un sueño de 5m después de ~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 y limpiada se transmite al registro de eventos de Cobalt Strike mediante elog, de modo que todos los operadores conectados ven los cambios de los demás en tiempo real. El diario vive en la memoria del teamserver durante la sesión.
ledger.cna.dirty USER "net user ..." "my comment" 9 — el argumento final establece una puntuación explícita.cmd.exe: dir, echo, set, type, tuberías (|), redirecciones (>), etc. Regístralas manualmente con dirty CATEGORY "shell <command>"..cna no se despacharán correctamente a través de dirty exec.| Categoría | Puntuación predeterminada | Comentario predeterminado |
|---|
| REGISTRY | 2 | Registro modificado |
| FIREWALL | 3 | Regla de firewall modificada |
| SERVICE | 3 | Configuración de servicio cambiada |
| RPC | 4 | Cambios realizados en RPC |
| WINRM | 4 | WinRM habilitado |
| SMB | 4 | Firma SMB cambiada |
| DCOM | 4 | DCOM habilitado |
| RDP | 5 | RDP habilitado |
| SCHEDULED_TASK | 5 | Tarea programada creada |
| DEFENDER | 6 | Configuración de Defender cambiada |
| GROUP | 6 | Membresía de grupo modificada |
| USER | 7 | Cuenta de usuario modificada |
| ACL | 8 | ACL modificada |
| SPN | 8 | SPN modificado |
| DOMAIN_ADMIN | 9 | Grupo de administradores de dominio modificado |
| TRUST | 9 | Relación de confianza modificada |