
Un script d'agression qui suit les modifications opérationnelles effectuées lors d'un engagement d'équipe rouge. Vous fournit une piste d'audit complète de ce qui a été modifié et de ce qui doit encore être nettoyé.
Ledger est un script aggressor Cobalt Strike qui enregistre chaque changement opérationnel effectué durant un engagement. Chaque service que vous activez, règle de pare-feu que vous ouvrez, compte que vous créez ou clé de registre que vous modifiez est journalisé avec un score de risque, une attribution d'opérateur et un statut de nettoyage. À la fin de l'engagement, vous disposez d'une piste d'audit complète de ce qui a été modifié et de ce qui doit encore être nettoyé.
Les engagements d'équipe rouge laissent des artefacts. Des services sont activés, des comptes créés, des règles de pare-feu ouvertes, des clés de registre modifiées. Sans un journal structuré, il est facile de les oublier — surtout lors d'engagements longs ou lorsque plusieurs opérateurs travaillent simultanément.
Ledger vous offre un journal en continu avec :
ledger.cna dans votre répertoire de scripts Cobalt Strike.ledger.cna.dirty est maintenant disponible dans chaque console Beacon.Toutes les commandes s'exécutent depuis une console Beacon en utilisant l'alias dirty.
dirty <CATEGORY> <command> [comment] [score]
comment et score sont optionnels. S'ils sont omis, des valeurs par défaut appropriées sont utilisées en fonction de la catégorie.
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]
Journalise le changement et exécute immédiatement la commande sur le beacon — une seule étape au lieu de deux.
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"
Limitations de dirty exec
dirty exec utilise brun en interne, qui exécute un binaire directement sans wrapper cmd.exe /c. Cela signifie :
net, sc, reg, nltest, whoami, ipconfig, etc.sleep, cd, ls, pwd, download, upload, execute-assembly, inject, etc. Pour ceux-ci, exécutez la commande Beacon normalement et utilisez dirty <CATEGORIE> <commande> séparément pour la journaliser.cmd.exe : dir, echo, set, type, pipes (|), redirections (>), etc. Journalisez-les manuellement avec dirty CATEGORIE "shell <commande>"..cna ne seront pas correctement dispatchés via dirty exec.dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
Affiche toutes les entrées journalisées. Le filtre optionnel correspond à la commande, au commentaire, à la catégorie, au nom d'hôte et au nom d'utilisateur.
dirty score
Affiche un résumé des risques par hôte avec le score agrégé, le nombre de nettoyages en attente et une barre visuelle. Les hôtes sont triés du score le plus élevé au plus bas.
dirty clean <id>
dirty clean all
dirty clean host <hostname>
La correspondance des noms d'hôte est insensible à la casse et prend en charge les correspondances partielles — DESKTOP correspond à DESKTOP-FGN4LPG.
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
Les exports sont écrits dans le répertoire contenant ledger.cna et incluent un résumé des scores des hôtes en haut suivi du journal complet des changements. Les boutons de la barre de menus Ledger déclenchent directement des exports non filtrés.
dirty help
| Category | Default Score | Default Comment |
|---|---|---|
| REGISTRY | 2 | Registre modifié |
| FIREWALL | 3 | Règle de pare-feu modifiée |
| SERVICE | 3 | Configuration de service modifiée |
| RPC | 4 | Modifications RPC effectuées |
| WINRM | 4 | WinRM activé |
| SMB | 4 | Signature SMB modifiée |
| DCOM | 4 | DCOM activé |
| RDP | 5 | RDP activé |
| SCHEDULED_TASK | 5 | Tâche planifiée créée |
| DEFENDER | 6 | Configuration de Defender modifiée |
| GROUP | 6 | Appartenance à un groupe modifiée |
| USER | 7 | Compte utilisateur modifié |
| ACL | 8 | ACL modifié |
| SPN | 8 | SPN modifié |
| DOMAIN_ADMIN | 9 | Groupe d'administration de domaine modifié |
| TRUST | 9 | Relation d'approbation modifiée |
Toute catégorie non listée est acceptée avec un score par défaut de 3.
Par entrée
| Label | Score |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
Agrégé (par hôte)
| Label | Score |
|---|---|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
Lorsqu'un beacon meurt avec des entrées du journal non nettoyées toujours en attente, Ledger envoie un avertissement rouge au journal d'événements Cobalt Strike visible par tous les opérateurs connectés :
L'avertissement se déclenche une fois par beacon et se réinitialise automatiquement si le beacon récupère et se reconnecte. Les beacons liés (enfants) et les beacons explicitement tués par un opérateur sont exclus. Le délai d'avertissement s'adapte au paramètre de sommeil du beacon — un sommeil de 60s déclenche après ~2 minutes, un sommeil de 5m après ~10 minutes.
LEDGER EXPORT -- 2026-05-21 19:50:34