Was macht Analyse von APT-Gruppen mit MITRE ATT&CK Navigator?
Überblick
Der MITRE ATT&CK Navigator ist ein webbasiertes Tool zur Annotation und Erkundung von ATT&CK-Matrizen. Es ermöglicht Analysten, die Technikabdeckung von Bedrohungsakteuren zu visualisieren, mehrere APT-Gruppen zu vergleichen, Erkennungslücken zu identifizieren und bedrohungsinformierte Verteidigungsstrategien zu entwickeln. Diese Fähigkeit umfasst das programmatische Abfragen von ATT&CK-Daten, die Abbildung von APT-Gruppen-TTPs in Navigator-Layern, die Erstellung von Multi-Layer-Overlays für Lückenanalysen und die Generierung umsetzbarer Intelligence-Berichte für Erkennungsentwicklungsteams.
Wann anwenden
- Bei der Untersuchung von Sicherheitsvorfällen, die die Analyse von APT-Gruppen mit dem MITRE Navigator erfordern
- Bei der Erstellung von Erkennungsregeln oder Jagdabfragen für diese Domäne
- Wenn SOC-Analysten strukturierte Verfahren für diesen Analysetyp benötigen
- Bei der Validierung der Sicherheitsmonitoring-Abdeckung für verwandte Angriffstechniken
Voraussetzungen
- Python 3.9+ mit
attackcti,mitreattack-python,stix2,requests-Bibliotheken - ATT&CK Navigator (https://mitre-attack.github.io/attack-navigator/) oder lokale Bereitstellung
- Verständnis der ATT&CK Enterprise-Matrix: 14 Taktiken, 200+ Techniken, Sub-Techniken
- Zugriff auf Bedrohungsintelligenzberichte oder MISP/OpenCTI für Bedrohungsakteurdaten
- Vertrautheit mit STIX 2.1 Intrusion Set und Attack Pattern Objekten
Schlüsselkonzepte
ATT&CK Navigator Layer
Navigator-Layer sind JSON-Dateien, die ATT&CK-Techniken mit Bewertungen, Farben, Kommentaren und Metadaten annotieren. Jeder Layer kann die Techniknutzung einer einzelnen APT-Gruppe, eine Erkennungsfähigkeitskarte oder ein kombiniertes Overlay darstellen. Layer Version 4.5 unterstützt Enterprise-Attack, Mobile-Attack und ICS-Attack Domänen mit Filtern nach Plattform (Windows, Linux, macOS, Cloud, Azure AD, Office 365, SaaS).
APT-Gruppenprofile in ATT&CK
ATT&CK katalogisiert über 140 Bedrohungsgruppen mit dokumentierter Techniknutzung. Jedes Gruppenprofil enthält Aliase, anvisierte Branchen, zugehörige Kampagnen, verwendete Software und Technikzuordnungen mit Verfahrensdetails auf Prozedurebene. Gruppen werden durch G-Codes identifiziert (z. B. G0016 für APT29, G0007 für APT28, G0032 für Lazarus Group).
Multi-Layer-Analyse
Der Navigator unterstützt das gleichzeitige Laden mehrerer Layer. Analysten können so TTPs von Bedrohungsakteuren mit der Erkennungsabdeckung überlagern, um Lücken zu identifizieren, mehrere APT-Gruppen zu vergleichen und gemeinsame Techniken zu priorisieren sowie Änderungen der Technikabdeckung im Zeitverlauf zu verfolgen.
Arbeitsablauf
Schritt 1: ATT&CK-Daten für eine APT-Gruppe abfragen
from attackcti import attack_client
import json
lift = attack_client()
# Alle Bedrohungsgruppen abrufen
groups = lift.get_groups()
print(f"Gesamtzahl ATT&CK-Gruppen: {len(groups)}")
# APT29 (Cozy Bear / Midnight Blizzard) finden
apt29 = next((g for g in groups if g.get('name') == 'APT29'), None)
if apt29:
print(f"Gruppe: {apt29['name']}")
print(f"Aliase: {apt29.get('aliases', [])}")
print(f"Beschreibung: {apt29.get('description', '')[:300]}")
# Von APT29 (G0016) verwendete Techniken abrufen
techniques = lift.get_techniques_used_by_group("G0016")
print(f"APT29 verwendet {len(techniques)} Techniken")
technique_map = {}
for tech in techniques:
tech_id = ""
for ref in tech.get("external_references", []):
if ref.get("source_name") == "mitre-attack":
tech_id = ref.get("external_id", "")
break
if tech_id:
tactics = [p.get("phase_name", "") for p in tech.get("kill_chain_phases", [])]
technique_map[tech_id] = {
"name": tech.get("name", ""),
"tactics": tactics,
"description": tech.get("description", "")[:500],
"platforms": tech.get("x_mitre_platforms", []),
"data_sources": tech.get("x_mitre_data_sources", []),
}
Schritt 2: Navigator-Layer-JSON generieren
def create_navigator_layer(group_name, technique_map, color="#ff6666"):
techniques_list = []
for tech_id, info in technique_map.items():
for tactic in info["tactics"]:
techniques_list.append({
"techniqueID": tech_id,
"tactic": tactic,
"color": color,
"comment": info["name"],
"enabled": True,
"score": 100,
"metadata": [
{"name": "group", "value": group_name},
{"name": "platforms", "value": ", ".join(info["platforms"])},
],
})
layer = {
"name": f"{group_name} TTP-Abdeckung",
"versions": {"attack": "16.1", "navigator": "5.1.0", "layer": "4.5"},
"domain": "enterprise-attack",
"description": f"{group_name} zugeschriebene Techniken",
"filters": {
"platforms": ["Linux", "macOS", "Windows", "Cloud",
"Azure AD", "Office 365", "SaaS", "Google Workspace"]
},
"sorting": 0,
"layout": {
"layout": "side", "aggregateFunction": "average",
"showID": True, "showName": True,
"showAggregateScores": False, "countUnscored": False,
},
"hideDisabled": False,
"techniques": techniques_list,
"gradient": {"colors": ["#ffffff", color], "minValue": 0, "maxValue": 100},
"legendItems": [
{"label": f"Verwendet von {group_name}", "color": color},
{"label": "Nicht beobachtet", "color": "#ffffff"},
],
"showTacticRowBackground": True,
"tacticRowBackground": "#dddddd",
"selectTechniquesAcrossTactics": True,
"selectSubtechniquesWithParent": False,
"selectVisibleTechniques": False,
}
return layer
layer = create_navigator_layer("APT29", technique_map)
with open("apt29_layer.json", "w") as f:
json.dump(layer, f, indent=2)
print("[+] Layer gespeichert: apt29_layer.json")
Schritt 3: Mehrere APT-Gruppen vergleichen
groups_to_compare = {"G0016": "APT29", "G0007": "APT28", "G0032": "Lazarus Group"}
group_techniques = {}
for gid, gname in groups_to_compare.items():
techs = lift.get_techniques_used_by_group(gid)
tech_ids = set()
for t in techs:
for ref in t.get("external_references", []):
if ref.get("source_name") == "mitre-attack":
tech_ids.add(ref.get("external_id", ""))
group_techniques[gname] = tech_ids
common_to_all = set.intersection(*group_techniques.values())
print(f"Allen Gruppen gemeinsame Techniken: {len(common_to_all)}")
for tid in sorted(common_to_all):
print(f" {tid}")
for gname, techs in group_techniques.items():
others = set.union(*[t for n, t in group_techniques.items() if n != gname])
unique = techs - others
print(f"\nEinzigartig für {gname}: {len(unique)} Techniken")
Schritt 4: Erkennungslückenanalyse mit Layer-Overlay
# Definieren Sie Ihre aktuellen Erkennungsfähigkeiten
detected_techniques = {
"T1059", "T1059.001", "T1071", "T1071.001", "T1566", "T1566.001",
"T1547", "T1547.001", "T1053", "T1053.005", "T1078", "T1027",
}
actor_techniques = set(technique_map.keys())
covered = actor_techniques.intersection(detected_techniques)
gaps = actor_techniques - detected_techniques
print(f"=== Erkennungslückenanalyse für APT29 ===")
print(f"Akteur-Techniken: {len(actor_techniques)}")
print(f"Erkannt: {len(covered)} ({len(covered)/len(actor_techniques)*100:.0f}%)")
print(f"Lücken: {len(gaps)} ({len(gaps)/len(actor_techniques)*100:.0f}%)")
# Lücken-Layer erstellen (rot = unentdeckt, grün = entdeckt)
gap_techniques = []
for tech_id in actor_techniques:
info = technique_map.get(tech_id, {})
for tactic in info.get("tactics", [""]):
color = "#66ff66" if tech_id in detected_techniques else "#ff3333"
gap_techniques.append({
"techniqueID": tech_id,
"tactic": tactic,
"color": color,
"comment": f"{'ERKANNT' if tech_id in detected_techniques else 'LÜCKE'}: {info.get('name', '')}",
"enabled": True,
"score": 100 if tech_id in detected_techniques else 0,
})
gap_layer = {
"name": "APT29 Erkennungslückenanalyse",
"versions": {"attack": "16.1", "navigator": "5.1.0", "layer": "4.5"},
"domain": "enterprise-attack",
"description": "Grün = erkannt, Rot = Lücke",
"techniques": gap_techniques,
"gradient": {"colors": ["#ff3333", "#66ff66"], "minValue": 0, "maxValue": 100},
"legendItems": [
{"label": "Erkannt", "color": "#66ff66"},
{"label": "Erkennungslücke", "color": "#ff3333"},
],
}
with open("apt29_gap_layer.json", "w") as f:
json.dump(gap_layer, f, indent=2)
Schritt 5: Taktik-Aufschlüsselungsanalyse
from collections import defaultdict
tactic_breakdown = defaultdict(list)
for tech_id, info in technique_map.items():
for tactic in info["tactics"]:
tactic_breakdown[tactic].append({"id": tech_id, "name": info["name"]})
tactic_order = [
"reconnaissance", "resource-development", "initial-access",
"execution", "persistence", "privilege-escalation",
"defense-evasion", "credential-access", "discovery",
"lateral-movement", "collection", "command-and-control",
"exfiltration", "impact",
]
print("\n=== APT29 Taktik-Aufschlüsselung ===")
for tactic in tactic_order:
techs = tactic_breakdown.get(tactic, [])
if techs:
print(f"\n{tactic.upper()} ({len(techs)} Techniken):")
for t in techs:
print(f" {t['id']}: {t['name']}")
Validierungskriterien
- ATT&CK-Daten erfolgreich über TAXII-Server abgefragt
- APT-Gruppe auf alle dokumentierten Techniken mit Verfahrensbeispielen abgebildet
- Navigator-Layer-JSON validiert und korrekt in ATT&CK Navigator dargestellt
- Multi-Layer-Overlay zeigt Bedrohungsakteur vs. Erkennungsabdeckung
- Erkennungslückenanalyse identifiziert nicht überwachte Techniken mit Datenquellenempfehlungen
- Gruppenvergleich zeigt gemeinsame und einzigartige TTPs
- Ausgabe ist umsetzbar für die Priorisierung der Erkennungsentwicklung