
Ein Aggressor-Skript, das während eines Red-Team-Einsatzes vorgenommene operative Änderungen verfolgt. Gibt Ihnen einen vollständigen Prüfpfad darüber, was geändert wurde und was noch bereinigt werden muss.
# Ledger — Aggressor-Skript zur Verfolgung betrieblicher Änderungen
Ledger ist ein Cobalt Strike Aggressor-Skript, das jede betriebliche Änderung während eines Einsatzes protokolliert. Jeder von Ihnen aktivierte Dienst, jede Firewall-Regel, die Sie durchbrechen, jedes Konto, das Sie erstellen, oder jeder Registry-Schlüssel, den Sie berühren, wird mit einer Risikobewertung, Operateur-Zuordnung und Bereinigungsstatus protokolliert. Am Ende des Einsatzes haben Sie eine vollständige Prüfspur darüber, was geändert wurde und was noch bereinigt werden muss.
---
## Warum
Red-Team-Einsätze hinterlassen Artefakte. Dienste werden aktiviert, Konten erstellt, Firewall-Regeln geöffnet, Registrierungsschlüssel geändert. Ohne ein strukturiertes Protokoll können diese leicht vergessen werden – besonders bei langen Einsätzen oder wenn mehrere Operateure gleichzeitig arbeiten.
Ledger bietet Ihnen ein fortlaufendes Journal mit:
- Risikobewertung pro Eintrag und pro Host
- Bereinigungsverfolgung, damit nichts zurückbleibt
- Zuordnung pro Operateur über das Cobalt Strike Ereignisprotokoll
- Export als JSON oder Klartext für Nachbereitungsberichte
- Automatische Warnungen bei toten Beacons, wenn noch nicht bereinigte Änderungen ausstehen
---
## Installation
1. Kopieren Sie `ledger.cna` in Ihr Cobalt Strike Skriptverzeichnis.
2. In der Menüleiste: **Cobalt Strike → Script Manager → Load** → wählen Sie `ledger.cna` aus.
3. Ein **Ledger**-Menü erscheint in der Menüleiste.
4. Der `dirty`-Alias ist nun in jeder Beacon-Konsole verfügbar.
---
## Verwendung
Alle Befehle werden über eine Beacon-Konsole mit dem `dirty`-Alias ausgeführt.
---
### Eine Änderung protokollieren (ohne Ausführung)
```
dirty <CATEGORY> <command> [comment] [score]
```
`comment` und `score` sind optional. Wenn sie weggelassen werden, werden sinnvolle Standardwerte basierend auf der Kategorie verwendet.
```
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"
```
<img width="712" height="137" alt="image" src="https://assets.kitploit.com/production/public/readmes/7583/bc456c7e36f217ce78f6bb7c8b044810a9f43128575cbbdddf30a98855e7a29c.png" />
---
### Ausführen und Protokollieren in einem Schritt
```
dirty exec <CATEGORY> <command> [comment] [score]
```
Protokolliert die Änderung und führt den Befehl sofort auf dem Beacon aus – ein Schritt statt zwei.
```
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"
```
**Einschränkungen von `dirty exec`**
`dirty exec` verwendet intern `brun`, das eine Binärdatei direkt ohne einen `cmd.exe /c`-Wrapper ausführt. Das bedeutet:
- Funktioniert für echte ausführbare Dateien: `net`, `sc`, `reg`, `nltest`, `whoami`, `ipconfig` usw.
- Funktioniert **nicht** für Beacon-interne Befehle: `sleep`, `cd`, `ls`, `pwd`, `download`, `upload`, `execute-assembly`, `inject` usw. Führen Sie für diese den Beacon-Befehl normal aus und verwenden Sie `dirty <CATEGORY> <command>` separat, um ihn zu protokollieren.
- Funktioniert **nicht** für Shell-interne Befehle, die `cmd.exe` erfordern: `dir`, `echo`, `set`, `type`, Pipes (`|`), Umleitungen (`>`) usw. Protokollieren Sie diese manuell mit `dirty CATEGORY "shell <command>"`.
- Benutzerdefinierte BOF-Aliasnamen, die aus anderen `.cna`-Dateien geladen werden, werden nicht korrekt über `dirty exec` weitergeleitet.
---
### Das Journal anzeigen
```
dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
```
Zeigt alle protokollierten Einträge. Der optionale Filter stimmt mit Befehl, Kommentar, Kategorie, Hostname und Benutzername überein.
<img width="742" height="267" alt="image" src="https://assets.kitploit.com/production/public/readmes/7583/1d4c864f0ecfbdd2d3c81f7d5b8a77ec6671624790c910a853d95da03c62373c.png" />
---
### Bewertungszusammenfassung
```
dirty score
```
Zeigt eine Zusammenfassung des Risikos pro Host mit Gesamtbewertung, Anzahl ausstehender Bereinigungen und einem visuellen Balken. Hosts werden nach höchster Bewertung zuerst sortiert.
---
### Einträge als bereinigt markieren
```
dirty clean <id>
dirty clean all
dirty clean host <hostname>
```
Die Hostname-Übereinstimmung ist case-insensitiv und unterstützt partielle Übereinstimmungen – `DESKTOP` stimmt mit `DESKTOP-FGN4LPG` überein.
---
### Export
```
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
```
Exporte werden in das Verzeichnis geschrieben, das `ledger.cna` enthält, und enthalten oben eine Zusammenfassung der Host-Bewertung, gefolgt vom vollständigen Änderungsprotokoll. Die **Ledger**-Menüleistenschaltflächen lösen direkt ungefilterte Exporte aus.
---
### Hilfe
```
dirty help
```
---
## Kategorien und Standardbewertungen
| Category | Default Score | Default Comment |
|----------------|:-------------:|--------------------------------|
| REGISTRY | 2 | Registry geändert |
| FIREWALL | 3 | Firewall-Regel geändert |
| SERVICE | 3 | Dienstkonfiguration geändert |
| RPC | 4 | Änderungen an RPC vorgenommen |
| WINRM | 4 | WinRM aktiviert |
| SMB | 4 | SMB-Signierung geändert |
| DCOM | 4 | DCOM aktiviert |
| RDP | 5 | RDP aktiviert |
| SCHEDULED_TASK | 5 | Geplante Aufgabe erstellt |
| DEFENDER | 6 | Defender-Konfiguration geändert|
| GROUP | 6 | Gruppenmitgliedschaft geändert |
| USER | 7 | Benutzerkonto geändert |
| ACL | 8 | ACL geändert |
| SPN | 8 | SPN geändert |
| DOMAIN_ADMIN | 9 | Domain-Admin-Gruppe geändert |
| TRUST | 9 | Vertrauensstellung geändert |
Jede nicht aufgeführte Kategorie wird mit einer Standardbewertung von 3 akzeptiert.
---
## Risikoschwellen
**Pro Eintrag**
| Label | Score |
|--------|--------|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
**Aggregiert (pro Host)**
| Label | Score |
|----------|---------|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
---
## Warnung bei totem Beacon
Wenn ein Beacon stirbt und noch nicht bereinigte Ledger-Einträge ausstehen, sendet Ledger eine rote Warnung an das Cobalt Strike Ereignisprotokoll, die für alle verbundenen Operateure sichtbar ist:
<img width="1541" height="77" alt="image" src="https://assets.kitploit.com/production/public/readmes/7583/ebb4280f79f8b3ffdeb390d4b4fc6e6266cc2ead06a023897633b08ad1b6ce35.png" />
Die Warnung wird einmal pro Beacon ausgelöst und setzt sich automatisch zurück, wenn der Beacon wiederhergestellt wird und sich erneut eincheckt. Verknüpfte (untergeordnete) Beacons und von einem Operateur explizit beendete Beacons sind ausgeschlossen. Der Warnungszeitpunkt skaliert mit der Sleep-Einstellung des Beacons – ein 60s Sleep löst nach ca. 2 Minuten aus, ein 5m Sleep nach ca. 10 Minuten.
---
## Exportformat
### Text
```
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
```
### JSON
```json
{
"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
}
```
---
## Nutzung durch mehrere Operateure
Jeder protokollierte und bereinigte Eintrag wird über `elog` an das Cobalt Strike Ereignisprotokoll gesendet, sodass alle verbundenen Operateure die Änderungen der jeweils anderen in Echtzeit sehen. Das Journal befindet sich für die Dauer der Sitzung im Arbeitsspeicher des Teamservers.
---
## Hinweise
- Das Journal befindet sich **nur im Arbeitsspeicher** und bleibt nicht über Teamserver-Neustarts hinweg bestehen. Exportieren Sie vor dem Herunterfahren.
- Exporte werden in das Verzeichnis geschrieben, das `ledger.cna` enthält.
- Bewertungsüberschreibungen werden unterstützt: `dirty USER "net user ..." "my comment" 9` — das letzte Argument setzt eine explizite Bewertung.
- Wenn das Skript zweimal geladen wird (z. B. einmal über den Script Manager und einmal manuell), werden doppelte Ereignishandler registriert. Überprüfen Sie den **Script Manager**, wenn Sie doppelte Ausgaben sehen.