Was macht Analyse von Command-and-Control-Kommunikation?
Wann anwenden
- Reverse-Engineering einer Malware-Stichprobe hat Netzwerkkommunikation enthüllt, die eine Protokollanalyse erfordert
- Erstellung von Netzwerkerkennungssignaturen für ein bestimmtes C2-Framework (Cobalt Strike, Metasploit, Sliver)
- Kartierung der C2-Infrastruktur einschließlich primärer Server, Fallback-Domänen und Dead Drops
- Analyse von verschlüsseltem oder codiertem C2-Datenverkehr, um den Befehlssatz und das Datenformat zu verstehen
- Zuordnung von Malware zu einem Bedrohungsakteur anhand von C2-Infrastrukturmustern und -Werkzeugen
Nicht verwenden für allgemeine Netzwerkanomalieerkennung; dies dient speziell dem Verständnis bekannter oder vermuteter C2-Protokolle aus der Malware-Analyse.
Voraussetzungen
- PCAP-Aufnahme des Malware-Netzwerkverkehrs (aus Sandbox, Netzwerk-Tap oder vollständiger Paketerfassung)
- Wireshark/tshark für die Analyse auf Paketebene
- Reverse-Engineering-Tools (Ghidra, dnSpy) zum Verständnis des C2-Codes in der Malware-Binärdatei
- Python 3.8+ mit
scapy,dpktundrequestsfür Protokollanalyse und Wiedergabe - Bedrohungsintelligenz-Datenbanken für die C2-Infrastruktur-Korrelation (VirusTotal, Shodan, Censys)
- JA3/JA3S-Fingerabdruckdatenbanken für die TLS-basierte C2-Identifikation
Arbeitsablauf
Schritt 1: Identifizieren Sie den C2-Kanal
Bestimmen Sie das für die C2-Kommunikation verwendete Protokoll und den Transport:
C2-Kommunikationskanäle:
━━━━━━━━━━━━━━━━━━━━━━━━━━━
HTTP/HTTPS: Am häufigsten; verwendet Standard-Webverkehr, um sich anzupassen
Indikatoren: Regelmäßige POST/GET-Anfragen, bestimmte URI-Muster, benutzerdefinierte Header
DNS: Tunneln von Daten durch DNS-Abfragen und -Antworten
Indikatoren: Hochvolumige TXT-Abfragen, lange Subdomain-Namen, hohe Entropie
Benutzerdefinierte TCP/UDP: Proprietäres Binärprotokoll auf nicht standardmäßigem Port
Indikatoren: Nicht-HTTP-Verkehr auf hohen Ports, unbekanntes Protokoll
ICMP: Daten, die in ICMP-Echo/Antwort-Nutzlasten codiert sind
Indikatoren: ICMP-Pakete mit großen oder nicht standardmäßigen Nutzlasten
WebSocket: Persistente bidirektionale Verbindung für Echtzeit-C2
Indikatoren: WebSocket-Upgrade gefolgt von binären Frames
Cloud-Dienste: Verwendung legitimer APIs (Telegram, Discord, Slack, GitHub)
Indikatoren: API-Aufrufe an Cloud-Dienste von unerwarteten Prozessen
E-Mail: SMTP/IMAP für C2-Befehle und Datenerxflition
Indikatoren: Automatisierte E-Mail-Operationen von Nicht-E-Mail-Prozessen
Schritt 2: Beacon-Muster analysieren
Charakterisieren Sie das periodische Kommunikationsmuster:
from scapy.all import rdpcap, IP, TCP
from collections import defaultdict
import statistics
import json
packets = rdpcap("c2_traffic.pcap")
# TCP-SYN-Pakete nach Ziel gruppieren
connections = defaultdict(list)
for pkt in packets:
if IP in pkt and TCP in pkt and (pkt[TCP].flags & 0x02):
key = f"{pkt[IP].dst}:{pkt[TCP].dport}"
connections[key].append(float(pkt.time))
# Jedes Ziel auf Beaconing analysieren
for dst, times in sorted(connections.items()):
if len(times) < 3:
continue
intervals = [times[i+1] - times[i] for i in range(len(times)-1)]
avg_interval = statistics.mean(intervals)
stdev = statistics.stdev(intervals) if len(intervals) > 1 else 0
jitter_pct = (stdev / avg_interval * 100) if avg_interval > 0 else 0
duration = times[-1] - times[0]
beacon_data = {
"destination": dst,
"connections": len(times),
"duration_seconds": round(duration, 1),
"avg_interval_seconds": round(avg_interval, 1),
"stdev_seconds": round(stdev, 1),
"jitter_percent": round(jitter_pct, 1),
"is_beacon": 5 < avg_interval < 7200 and jitter_pct < 25,
}
if beacon_data["is_beacon"]:
print(f"[!] BEACON ERKANNT: {dst}")
print(f" Intervall: {avg_interval:.0f}s +/- {stdev:.0f}s ({jitter_pct:.0f}% Jitter)")
print(f" Sitzungen: {len(times)} über {duration:.0f}s")
Schritt 3: C2-Protokollstruktur dekodieren
Die Nachrichtenstruktur aus dem erfassten Datenverkehr reverseengineeren:
# HTTP-basierte C2-Protokollanalyse
import dpkt
import base64
with open("c2_traffic.pcap", "rb") as f:
pcap = dpkt.pcap.Reader(f)
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
if not isinstance(eth.data, dpkt.ip.IP):
continue
ip = eth.data
if not isinstance(ip.data, dpkt.tcp.TCP):
continue
tcp = ip.data
if tcp.dport == 80 or tcp.dport == 443:
if len(tcp.data) > 0:
try:
http = dpkt.http.Request(tcp.data)
print(f"\n--- C2-ANFRAGE ---")
print(f"Methode: {http.method}")
print(f"URI: {http.uri}")
print(f"Header: {dict(http.headers)}")
if http.body:
print(f"Body ({len(http.body)} Bytes):")
# Versuche Base64-Dekodierung
try:
decoded = base64.b64decode(http.body)
print(f" Dekodiert: {decoded[:200]}")
except:
print(f" Roh: {http.body[:200]}")
except:
pass
Schritt 4: C2-Framework identifizieren
Beobachtete Muster mit bekannten C2-Frameworks abgleichen:
Bekannte C2-Framework-Signaturen:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cobalt Strike:
- Standard-URIs: /pixel, /submit.php, /___utm.gif, /ca, /dpixel
- Malleable C2-Profile passen alle Verkehrsmerkmale an
- JA3: variiert je nach Profil, Katalog unter ja3er.com
- Wasserzeichen in Beacon-Konfiguration (einmalig pro Lizenz)
- Konfigurationsextraktion: Verwende CobaltStrikeParser oder 1768.py
Metasploit/Meterpreter:
- Standard-Staging-URI-Muster: zufällige 4-stellige Prüfsumme
- Reverse-HTTP(S)-Handler-Muster
- Meterpreter-TLV (Type-Length-Value)-Protokollstruktur
Sliver:
- mTLS, HTTP, DNS, WireGuard-Transportoptionen
- Protobuf-codierte Nachrichten
- Einzigartige Implantat-ID in der Kommunikation
Covenant:
- .NET-basiertes C2-Framework
- HTTP mit anpassbaren Profilen
- Aufgabenbasierte Befehlsausführung
PoshC2:
- PowerShell/C#-basiert
- HTTP mit verschlüsselten Nutzlasten
- Cookie-basiertes Sitzungsmanagement
# Cobalt-Strike-Beacon-Konfiguration aus PCAP oder Probe extrahieren
python3 << 'PYEOF'
# Verwendung von CobaltStrikeParser (pip install cobalt-strike-parser)
from cobalt_strike_parser import BeaconConfig
try:
config = BeaconConfig.from_file("suspect.exe")
print("Cobalt-Strike-Beacon-Konfiguration:")
for key, value in config.items():
print(f" {key}: {value}")
except Exception as e:
print(f"Kein Cobalt-Strike-Beacon oder Analysefehler: {e}")
PYEOF
Schritt 5: C2-Infrastruktur kartieren
Dokumentieren Sie die vollständige C2-Infrastruktur und Failover-Mechanismen:
# Infrastrukturkartierung
import requests
import json
c2_indicators = {
"primary_c2": "185.220.101.42",
"domains": ["update.malicious.com", "backup.evil.net"],
"ports": [443, 8443],
"failover_dns": ["ns1.malicious-dns.com"],
}
# Mit Shodan anreichern
def shodan_lookup(ip, api_key):
resp = requests.get(f"https://api.shodan.io/shodan/host/{ip}?key={api_key}")
if resp.status_code == 200:
data = resp.json()
return {
"ip": ip,
"ports": data.get("ports", []),
"os": data.get("os"),
"org": data.get("org"),
"asn": data.get("asn"),
"country": data.get("country_code"),
"hostnames": data.get("hostnames", []),
"last_update": data.get("last_update"),
}
return None
# Mit passivem DNS anreichern
def pdns_lookup(domain):
# Verwendung von VirusTotal passivem DNS
resp = requests.get(
f"https://www.virustotal.com/api/v3/domains/{domain}/resolutions",
headers={"x-apikey": VT_API_KEY}
)
if resp.status_code == 200:
data = resp.json()
resolutions = []
for r in data.get("data", []):
resolutions.append({
"ip": r["attributes"]["ip_address"],
"date": r["attributes"]["date"],
})
return resolutions
return []
Schritt 6: Netzwerkerkennungssignaturen erstellen
Erstellen Sie Erkennungsregeln basierend auf den analysierten C2-Merkmalen:
# Suricata-Regeln für das analysierte C2
cat << 'EOF' > c2_detection.rules
# HTTP-Beacon-Muster
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"MALWARE MalwareX C2 HTTP Beacon";
flow:established,to_server;
http.method; content:"POST";
http.uri; content:"/gate.php"; startswith;
http.header; content:"User-Agent: Mozilla/5.0 (compatible; MSIE 10.0)";
threshold:type threshold, track by_src, count 5, seconds 600;
sid:9000010; rev:1;
)
# JA3-Fingerabdruck-Übereinstimmung
alert tls $HOME_NET any -> $EXTERNAL_NET any (
msg:"MALWARE MalwareX TLS JA3-Fingerabdruck";
ja3.hash; content:"a0e9f5d64349fb13191bc781f81f42e1";
sid:9000011; rev:1;
)
# DNS-Beacon-Erkennung (Subdomain mit hoher Entropie)
alert dns $HOME_NET any -> any any (
msg:"MALWARE Vermutetes DNS-C2-Tunneling";
dns.query; pcre:"/^[a-z0-9]{20,}\./";
threshold:type threshold, track by_src, count 10, seconds 60;
sid:9000012; rev:1;
)
# Zertifikatsbasierte Erkennung
alert tls $HOME_NET any -> $EXTERNAL_NET any (
msg:"MALWARE MalwareX selbstsigniertes C2-Zertifikat";
tls.cert_subject; content:"CN=update.malicious.com";
sid:9000013; rev:1;
)
EOF
Schlüsselkonzepte
| Begriff | Definition |
|---|---|
| Beaconing | Periodischer Check-in der Malware beim C2-Server in regelmäßigen Abständen, oft mit Jitter, um Mustererkennung zu vermeiden |
| Jitter | Zufällige Abweichung des Beacon-Intervalls (z. B. 60 s +/- 15 %), um das Zeitmuster weniger vorhersagbar und schwerer erkennbar zu machen |
| Malleable C2 | Cobalt-Strike-Funktion, die es Betreibern ermöglicht, alle Aspekte des C2-Verkehrs (URIs, Header, Kodierung) anzupassen, um legitime Dienste zu imitieren |
| Dead Drop | Zwischenablage (Paste-Site, Cloud-Speicher, soziale Medien), in der C2-Befehle für die Malware zum Abruf hinterlegt werden |
| Domain Fronting | Verwendung einer vertrauenswürdigen CDN-Domäne im TLS-SNI bei gleichzeitiger Weiterleitung an ein anderes Backend, sodass C2-Verkehr zu einem legitimen Dienst zu gehen scheint |
| Fast Flux | Schnell wechselnde DNS-Einträge für C2-Domänen, um sie auf viele IPs zu verteilen und Bekämpfungsbemühungen zu widerstehen |
| C2-Framework | Software-Toolkit, das C2-Server, Implantat-Generator und Betreiberoberfläche bereitstellt (Cobalt Strike, Metasploit, Sliver, Covenant) |
Werkzeuge & Systeme
- Wireshark: Paketanalysator für detaillierte C2-Protokollanalyse auf Paketebene
- RITA (Real Intelligence Threat Analytics): Open-Source-Tool zur Analyse von Zeek-Protokollen auf Beacon-Erkennung und DNS-Tunneling
- CobaltStrikeParser: Tool zur Extraktion der Cobalt-Strike-Beacon-Konfiguration aus Proben und Speicherabbildern
- JA3/JA3S: TLS-Fingerprinting-Methode zur Identifizierung von C2-Frameworks anhand ihrer TLS-Implementierungsmerkmale
- Shodan/Censys: Internet-Scanning-Plattformen zur Kartierung der C2-Infrastruktur und Identifizierung verwandter Server
Häufige Szenarien
Szenario: Reverse-Engineering eines benutzerdefinierten C2-Protokolls
Kontext: Eine Malware-Probe kommuniziert mit ihrem C2-Server über ein unbekanntes Binärprotokoll auf TCP-Port 8443. Das Protokoll muss dekodiert werden, um den Befehlssatz zu verstehen und Erkennungssignaturen zu erstellen.
Vorgehensweise:
- PCAP nach TCP-Port-8443-Konversationen filtern und die TCP-Streams extrahieren
- Die ersten Austausche analysieren, um den Handshake/Authentifizierungsmechanismus zu identifizieren
- Die Nachrichtenstruktur kartieren (Längenpräfix, Typfeld, Nutzlastkodierung)
- Mit der Ghidra-Disassemblierung der Sende-/Empfangsfunktionen in der Malware abgleichen
- Den Befehlsverteiler identifizieren und die Funktion jedes Befehlscodes dokumentieren
- Einen Protokoll-Decoder in Python für die laufende Verkehrsanalyse erstellen
- Suricata-Regeln erstellen, die auf den Protokoll-Handshake oder statische Header-Bytes passen
Fallstricke:
- Annahme, dass das Protokoll statisch ist; einige C2-Frameworks handeln während des Handshakes eine Verschlüsselung aus
- Nicht genügend Verkehr erfassen, um alle Befehlstypen zu sehen (einige Befehle sind selten)
- Übersehen von Fallback-C2-Kanälen (DNS, ICMP), die aktiviert werden, wenn der primäre Kanal ausfällt
- Verwechseln von verschlüsselten Nutzlastdaten mit der Protokoll-Rahmenstruktur
Ausgabeformat
C2-KOMMUNIKATIONSANALYSEBERICHT
===================================
Probe: malware.exe (SHA-256: e3b0c44...)
C2-Framework: Cobalt Strike 4.9
BEACON-KONFIGURATION
C2-Server: hxxps://185.220.101[.]42/updates
Beacon-Typ: HTTPS (Reverse)
Schlaf: 60 Sekunden
Jitter: 15%
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
URI (GET): /dpixel
URI (POST): /submit.php
Wasserzeichen: 1234567890
PROTOKOLLANALYSE
Transport: HTTPS (TLS 1.2)
JA3-Hash: a0e9f5d64349fb13191bc781f81f42e1
Zertifikat: CN=Microsoft Update (selbstsigniert)
Kodierung: Base64 mit XOR-Schlüssel 0x69
Befehlsformat: [4B Länge][4B Befehlskennung][Nutzlast]
BEFEHLSATZ
0x01 - Sleep Beacon-Intervall ändern
0x02 - Shell cmd.exe-Befehl ausführen
0x03 - Download Datei von C2 übertragen
0x04 - Upload Datei an C2 exfiltrieren
0x05 - Inject Prozessinjektion
0x06 - Keylog Keylogger starten
0x07 - Screenshot Bildschirm aufnehmen
INFRASTRUKTUR
Primär: 185.220.101[.]42 (AS12345, Hosting Co, NL)
Failover: 91.215.85[.]17 (AS67890, VPS-Anbieter, RU)
DNS: update.malicious[.]com -> 185.220.101[.]42
Registrar: NameCheap
Registrierung: 2025-09-01
ERKENNUNGSSIGNATUREN
SID 9000010: HTTP-Beacon-Muster
SID 9000011: JA3-TLS-Fingerabdruck
SID 9000013: C2-Zertifikatsübereinstimmung