Analisando TTPs de Atores de Ameaça com MITRE ATT&CK
Visão Geral
MITRE ATT&CK é uma base de conhecimento globalmente acessível de táticas, técnicas e procedimentos (TTPs) de adversários, baseada em observações do mundo real. Esta skill abrange o mapeamento sistemático do comportamento de atores de ameaça para o framework ATT&CK, a construção de mapas de calor de cobertura de técnicas usando o ATT&CK Navigator, a identificação de lacunas de detecção e a produção de relatórios de inteligência acionáveis que vinculam IOCs observados a técnicas específicas de adversários nas matrizes Enterprise, Mobile e ICS.
Quando Usar
- Ao investigar incidentes de segurança que exigem analisar TTPs de atores de ameaça com MITRE ATT&CK
- Ao construir regras de detecção ou consultas de caça a ameaças para este domínio
- Quando analistas de SOC precisam de procedimentos estruturados para este tipo de análise
- Ao validar a cobertura de monitoramento de segurança para técnicas de ataque relacionadas
Pré-requisitos
- Python 3.9+ com as bibliotecas
mitreattack-python,attackcti,stix2 - MITRE ATT&CK Navigator (implantação web ou local)
- Compreensão da estrutura da matriz ATT&CK: Táticas, Técnicas, Sub-técnicas
- Acesso a relatórios de inteligência de ameaças ou MISP/OpenCTI para dados de atores de ameaça
- Familiaridade com objetos STIX 2.1 Attack Pattern
Conceitos-chave
Estrutura da Matriz ATT&CK
A matriz ATT&CK Enterprise organiza o comportamento do adversário em 14 Táticas (o "porquê") contendo Técnicas (o "como") e Sub-técnicas (implementações específicas). Cada técnica possui fontes de dados, detecções, mitigações e exemplos de procedimentos do mundo real de grupos de ameaça observados.
Perfis de Grupos de Ameaça
O ATT&CK cataloga mais de 140 grupos de ameaça (por exemplo, APT28, APT29, Lazarus Group, FIN7) com uso documentado de técnicas. Cada perfil de grupo inclui aliases, setores-alvo, campanhas associadas, software utilizado e mapeamentos de técnicas com detalhes de procedimentos.
ATT&CK Navigator
O ATT&CK Navigator é uma ferramenta baseada na web para criar visualizações personalizadas da matriz ATT&CK. Os analistas criam camadas (arquivos JSON) que anotam técnicas com pontuações, cores, comentários e metadados para visualizar a cobertura do ator de ameaça, as capacidades de detecção ou as avaliações de risco.
Fluxo de Trabalho
Passo 1: Consultar Dados ATT&CK Programaticamente
from attackcti import attack_client
import json
# Inicializa o cliente ATT&CK (consulta o servidor TAXII da MITRE)
lift = attack_client()
# Obtém todas as técnicas Enterprise
enterprise_techniques = lift.get_enterprise_techniques()
print(f"Total de técnicas Enterprise: {len(enterprise_techniques)}")
# Obtém todos os grupos de ameaça
groups = lift.get_groups()
print(f"Total de grupos de ameaça: {len(groups)}")
# Obtém um grupo específico pelo nome
apt29 = [g for g in groups if 'APT29' in g.get('name', '')]
if apt29:
group = apt29[0]
print(f"Grupo: {group['name']}")
print(f"Aliases: {group.get('aliases', [])}")
print(f"Descrição: {group.get('description', '')[:200]}")
Passo 2: Mapear Ator de Ameaça para Técnicas ATT&CK
from attackcti import attack_client
lift = attack_client()
# Obtém técnicas usadas pelo APT29
apt29_techniques = lift.get_techniques_used_by_group("G0016") # ID do grupo APT29
technique_map = {}
for entry in apt29_techniques:
tech_id = entry.get("external_references", [{}])[0].get("external_id", "")
tech_name = entry.get("name", "")
description = entry.get("description", "")
tactic_refs = [
phase.get("phase_name", "")
for phase in entry.get("kill_chain_phases", [])
]
technique_map[tech_id] = {
"name": tech_name,
"tactics": tactic_refs,
"description": description[:300],
}
print(f"\nAPT29 usa {len(technique_map)} técnicas:")
for tid, info in sorted(technique_map.items()):
print(f" {tid}: {info['name']} [{', '.join(info['tactics'])}]")
Passo 3: Gerar Camada do ATT&CK Navigator
import json
def create_navigator_layer(group_name, technique_map, description=""):
"""Gera JSON de camada do ATT&CK Navigator para um grupo de ameaça."""
techniques_list = []
for tech_id, info in technique_map.items():
techniques_list.append({
"techniqueID": tech_id,
"tactic": info["tactics"][0] if info["tactics"] else "",
"color": "#ff6666", # Vermelho para técnicas observadas
"comment": info["description"][:200],
"enabled": True,
"score": 100,
"metadata": [
{"name": "group", "value": group_name},
],
})
layer = {
"name": f"Cobertura de TTPs {group_name}",
"versions": {
"attack": "16.1",
"navigator": "5.1.0",
"layer": "4.5",
},
"domain": "enterprise-attack",
"description": description or f"Técnicas atribuídas a {group_name}",
"filters": {"platforms": ["Windows", "Linux", "macOS", "Cloud"]},
"sorting": 0,
"layout": {
"layout": "side",
"aggregateFunction": "average",
"showID": True,
"showName": True,
"showAggregateScores": False,
"countUnscored": False,
},
"hideDisabled": False,
"techniques": techniques_list,
"gradient": {
"colors": ["#ffffff", "#ff6666"],
"minValue": 0,
"maxValue": 100,
},
"legendItems": [
{"label": "Técnica observada", "color": "#ff6666"},
{"label": "Não observada", "color": "#ffffff"},
],
"showTacticRowBackground": True,
"tacticRowBackground": "#dddddd",
"selectTechniquesAcrossTactics": True,
"selectSubtechniquesWithParent": False,
"selectVisibleTechniques": False,
}
return layer
# Gera e salva a camada
layer = create_navigator_layer("APT29", technique_map, "Análise de TTPs do APT29 (Cozy Bear)")
with open("apt29_navigator_layer.json", "w") as f:
json.dump(layer, f, indent=2)
print("[+] Camada do Navigator salva em apt29_navigator_layer.json")
Passo 4: Identificar Lacunas de Detecção
from attackcti import attack_client
lift = attack_client()
# Obtém todas as técnicas com fontes de dados
all_techniques = lift.get_enterprise_techniques()
# Constrói mapa de cobertura de fontes de dados
data_source_coverage = {}
for tech in all_techniques:
tech_id = tech.get("external_references", [{}])[0].get("external_id", "")
data_sources = tech.get("x_mitre_data_sources", [])
for ds in data_sources:
if ds not in data_source_coverage:
data_source_coverage[ds] = []
data_source_coverage[ds].append(tech_id)
# Compara técnicas do ator com detecções disponíveis
detected_techniques = {"T1059", "T1071", "T1566"} # Exemplo: técnicas que você pode detectar
actor_techniques = set(technique_map.keys())
covered = actor_techniques.intersection(detected_techniques)
gaps = actor_techniques - detected_techniques
print(f"\n=== Análise de Lacunas de Detecção para APT29 ===")
print(f"Técnicas do ator: {len(actor_techniques)}")
print(f"Detectadas: {len(covered)} ({len(covered)/len(actor_techniques)*100:.0f}%)")
print(f"Lacunas: {len(gaps)} ({len(gaps)/len(actor_techniques)*100:.0f}%)")
print(f"\nTécnicas não detectadas:")
for tech_id in sorted(gaps):
if tech_id in technique_map:
print(f" {tech_id}: {technique_map[tech_id]['name']}")
Passo 5: Comparação de Técnicas entre Grupos
from attackcti import attack_client
lift = attack_client()
# Compara técnicas entre vários grupos
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:
tid = t.get("external_references", [{}])[0].get("external_id", "")
if tid:
tech_ids.add(tid)
group_techniques[gname] = tech_ids
# Encontra técnicas comuns e únicas
all_groups = list(group_techniques.keys())
common_to_all = set.intersection(*group_techniques.values())
print(f"\nTécnicas comuns a todos os {len(all_groups)} grupos: {len(common_to_all)}")
for tid in sorted(common_to_all):
print(f" {tid}")
for gname, techs in group_techniques.items():
unique = techs - set.union(*[t for n, t in group_techniques.items() if n != gname])
print(f"\nÚnicas de {gname}: {len(unique)} técnicas")
Critérios de Validação
- Dados ATT&CK consultados com sucesso via servidor TAXII ou cópia local
- Ator de ameaça mapeado para técnicas específicas com exemplos de procedimentos
- JSON da camada do ATT&CK Navigator é válido e renderiza corretamente
- Análise de lacunas de detecção identifica técnicas não monitoradas
- Comparação entre grupos revela TTPs compartilhadas e únicas
- Saída é acionável para priorização de engenharia de detecção