Cobalt-Strike-Beacon-Konfiguration: was sie verrät
Die Konfiguration eines Cobalt-Strike-Beacons statisch extrahieren und jedes Feld — C2, Sleep, Pipes, Spawn-to, Watermark, Public Key — in eine Suche verwandeln.
Kurz gesagt. Ein Cobalt-Strike-Beacon trägt seine gesamte Konfiguration im Binary: wohin er sich verbindet, wie oft, wie er sich tarnt, in welchen Prozess er injiziert. Statisch dekodiert, wird aus einem Sample eine Liste konkreter Suchen in Proxy-Logs, EDR-Telemetrie und auf anderen Hosts. Der PE Parser dekodiert sie im Browser und zeigt sie in einem Tab Konfig.
Warum die Konfiguration zählt
Taucht während einer Untersuchung ein Beacon auf, ist das Binary selbst das am wenigsten Interessante: ein generisches Implantat. Was es zu diesem Angriff macht, ist die Konfiguration des Operators — C2-Domains, URIs, User-Agent, Named Pipes, der Prozess für Post-Exploitation-Jobs. Jeder dieser Werte lässt sich anderswo suchen, und keiner erfordert, das Sample auszuführen.
Wo die Konfiguration liegt
Der Beacon speichert seine Einstellungen als Tabelle nummerierter Einträge (Typ, Länge, Wert), kodiert mit einem Ein-Byte-XOR: 0x69 in älteren Versionen, 0x2e in 4.x. Loader legen oft eine Schicht darüber — die Beacon-DLL mit einem Vier-Byte-XOR-Schlüssel in einem Stager kodiert oder komprimiert in einem Overlay. Der PE Parser sucht die Tabelle in der Datei selbst, in den Schichten, die er entpackt (UPX), und in den ausführbaren Dateien, die er aus der Datei herauslöst — die Konfiguration wird gefunden, wo immer der Beacon steckt.
Kleine Stager sind anders: Sie enthalten nicht den Beacon, nur den Shellcode, der ihn nachlädt. Für sie nennt das Tool den Stager-Typ (reverse_http, reverse_https, reverse_tcp) und was es aus dem Shellcode lesen kann: Host, Port, URI und User-Agent.
Die Felder lesen
| Feld | Bedeutung | Wo suchen |
|---|---|---|
| Beacon-Typ | HTTP, HTTPS, DNS, SMB (Named Pipe) oder TCP | Welche Logs zuerst |
| C2-Server | Kontaktierte Hostnamen und URIs | Proxy-, DNS- und Firewall-Logs; Passive DNS |
| Port | Port des C2-Listeners | Firewall und Netflow |
| Sleep / Jitter | Rückmeldeintervall und seine Zufallsstreuung | Beaconing-Erkennung in Netzwerk-Logs |
| User-Agent, HTTP-POST-URI | Wie die Anfragen aussehen | Proxy-Logs, oft sehr markant |
| Pipe-Name | Named Pipe der SMB-Beacons und Post-Ex-Jobs | Named-Pipe-Ereignisse auf Hosts (zum Beispiel Sysmon 17 und 18) |
| Spawn to (x86 / x64) | Für Post-Exploitation gestarteter Prozess | Prozessstarts: dieser Prozess ohne Argumente, von ungewöhnlichem Elternprozess |
| Watermark | An die Lizenz gebundene Zahl | Samples über Vorfälle hinweg gruppieren |
| Public Key (SHA-256) | Hash des Team-Server-Schlüssels | Beacons desselben Team-Servers gruppieren |
Einige praktische Hinweise:
- Der Spawn-to-Prozess ist eine der besten Suchen auf dem Host. Standard ist
rundll32.exe; einrundll32.exeohne DLL-Argument ist selten legitim. - Sleep und Jitter beschreiben das Beaconing im Netz: 60 Sekunden Sleep mit 20 % Jitter ergibt eine Rückmeldung alle 48 bis 72 Sekunden.
- Das Watermark verbindet Samples aus derselben Installation. Geleakte und gecrackte Kopien teilen einige gängige Werte — ein gleiches Watermark ist eine Spur, keine Attribution.
- Der Public-Key-Hash ist oft ein besserer Gruppierungsschlüssel als das Watermark: Beacons desselben Team-Servers teilen ihn.
Mit dem PE Parser extrahieren
- Ziehen Sie die Datei (oder ein ZIP der Sammlung) auf den PE Parser. Nichts wird hochgeladen oder ausgeführt.
- Wird eine Konfiguration gefunden, erhält die Datei einen Indikator hoher Schwere, Malware-Konfiguration dekodiert, und ein Tab Konfig erscheint.
- Der Tab listet zuerst die C2-Einträge, dann jede dekodierte Einstellung, mit dem Offset der Tabelle — ein Klick öffnet die Hex-Ansicht auf diesen Bytes.
- Der Tab IOCs übernimmt C2-URLs und -Hostnamen, User-Agent und Pipe-Namen, bereit zum Export als CSV, MISP-Event oder STIX-2.1-Bundle (IOCs exportieren).
Derselbe Tab deckt einige weitere Familien ab, deren Konfiguration sich statisch lesen lässt: AsyncRAT und Ableger (DcRat, VenomRAT), QuasarRAT, njRAT und Remcos.
Grenzen
- Gepackte oder verschlüsselte Loader. Steckt der Beacon in einem eigenen Crypter, erscheint die Konfiguration erst nach dem Entfernen dieser Schicht, meist dynamisch in einer Sandbox. UPX und einfache Schichten (XOR, Kompression) werden behandelt, eigene Crypter nicht.
- Formatänderungen. Das Format hat sich über Versionen geändert, und Generatoren lassen sich anpassen. Der Extraktor prüft die Tabellenstruktur streng, um keine Felder zu erfinden; ein ungewöhnlicher Build wird dann eben nicht dekodiert.
- Köder. Operatoren hinterlassen manchmal irreführende Werte (falsche Hosts, ein gecracktes Watermark). Bestätigen Sie mit Netzwerkbelegen, bevor Sie auf ein einzelnes Feld reagieren.
- Allein kein Beweis für Bösartigkeit. Red Teams nutzen Cobalt Strike legitim. Eine dekodierte Konfiguration sagt, was das Binary ist, nicht wer es gestartet hat — fragen Sie Ihr Red Team, bevor Sie eskalieren.