CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

TTP (Tactics, Techniques, Procedures) Madenciliği

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

TTP (Tactics, Techniques, Procedures) Madenciliği konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda blog formatinda ogrenin. Temel akis, kavram eslestirmeleri ve analiz mantigi tek bir yapida birlestirildi.

TTP (Tactics, Techniques, Procedures) Madenciliği

TTP madenciliği tehdit istihbarat raporlarından, log verilerinden ve güvenlik olaylarından saldırgan davranış örüntülerini otomatik çıkarma sürecidir. STIX2 formatındaki threat intel verisinden TTP çıkarma: import json import requests import pandas as pd from collections import Counter

MITRE CTI GitHub'dan APT29 TTP'lerini çek

url = "https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json"

APT29 ile ilişkili teknikleri bul

apt29_techniques = [] for rel in data['objects']: if rel['type'] == 'relationship' and rel['relationship_type'] == 'uses': tgt = next((o for o in data['objects'] if o.get('id') == rel['target_ref']), None) if src and 'APT29' in src.get('aliases', []) and tgt and tgt['type'] == 'attack-pattern': apt29_techniques.append({ 'technique_id': tgt['external_references'][0]['external_id'], 'technique_name': tgt['name'], 'tactic': [p['phase_name'] for p in tgt.get('kill_chain_phases', [])] }) print(df_apt29.groupby('tactic').size().sort_values(ascending=False))

Giris ve Temel Akis

TTP madenciliği tehdit istihbarat raporlarından, log verilerinden ve güvenlik olaylarından saldırgan davranış örüntülerini otomatik çıkarma sürecidir. STIX2 formatındaki threat intel verisinden TTP çıkarma: import json import requests import pandas as pd from collections import Counter

MITRE CTI GitHub'dan APT29 TTP'lerini çek

url = "https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json"

APT29 ile ilişkili teknikleri bul

apt29_techniques = [] for rel in data['objects']: if rel['type'] == 'relationship' and rel['relationship_type'] == 'uses': tgt = next((o for o in data['objects'] if o.get('id') == rel['target_ref']), None) if src and 'APT29' in src.get('aliases', []) and tgt and tgt['type'] == 'attack-pattern': apt29_techniques.append({ 'technique_id': tgt['external_references'][0]['external_id'], 'technique_name': tgt['name'], 'tactic': [p['phase_name'] for p in tgt.get('kill_chain_phases', [])] }) print(df_apt29.groupby('tactic').size().sort_values(ascending=False))

Bu bölümün pratik akışı şu sırayla ilerler:

  • data = requests.get(url).json()
  • for rel in data['objects']: if rel['type']=='relationship' and rel['relationship_type']=='uses':
  • src = next((o for o in data['objects'] if o.get('id')==rel['source_ref']),None)
  • if src and 'APT29' in src.get('aliases',[]) and tgt['type']=='attack-pattern':
  • apt29_techniques.append({'technique_id':tgt['external_references'][0]['external_id'],'technique_name':tgt['name']})
  • df_apt29 = pd.DataFrame(apt29_techniques)
  • print(f'APT29 TTP sayısı: {len(df_apt29)}')

Temel Kavram Eslesmeleri

TTP hiyerarşisi üç katmandan oluşur ve her katman farklı bir soyutlama düzeyini temsil eder. Daha düşük katman daha spesifik ve değişime daha duyarlıdır. Örnek hiyerarşi: - Tactic (EN SOYUT): Credential Access - Technique: T1003 OS Credential Dumping - Sub-technique: T1003.001 LSASS Memory - Procedure (EN SPESİFİK): mimikatz.exe sekurlsa::logonpasswords komutu

  • Tactic: En dayanıklı — saldırganın amacı nadiren değişir
  • Technique: Orta dayanıklı — yıllar içinde yavaş evrilir
  • Sub-technique: Az dayanıklı — yama veya araç değişimiyle etkilenir
  • Procedure: En az dayanıklı — araç güncellemesiyle anında değişir

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram T\d{4}(?:.\d{3})? olarak verilir. NLP ile tehdit istihbarat raporlarından otomatik TTP çıkarma. spaCy ve özel NER modeli ile IOC ve teknik referansları metin içinden ayıklama: import spacy import re import pandas as pd nlp = spacy.load('en_core_web_sm') mitre_pattern = re.compile(r'T\d{4}(?:.\d{3})?') ioc_patterns = { 'ipv4': re.compile(r'\b(?:\d{1,3}.){3}\d{1,3}\b'), 'domain': re.compile(r'\b[a-zA-Z0-9.-]+.[a-zA-Z]{2,}\b'), 'hash_md5': re.compile(r'\b[0-9a-fA-F]{32}\b'), 'hash_sha256': re.compile(r'\b[0-9a-fA-F]{64}\b') } def extract_ttps(report_text): techniques = mitre_pattern.findall(report_text) iocs = {k: v.findall(report_text) for k, v in ioc_patterns.items()} doc = nlp(report_text) tools = [ent.text for ent in doc.ents if ent.label_ in ['PRODUCT','ORG']] return {'techniques': list(set(techniques)), 'iocs': iocs, 'tools': list(set(tools))} with open('threat_report.txt', 'r') as f: report = f.read() result = extract_ttps(report) print(f"Tespit edilen teknikler: {result['techniques']}") print(f"IPv4 IOC sayısı: {len(result['iocs']['ipv4'])}")

Arac, Komut veya Inceleme Akisi

TTP clustering birden fazla tehdit aktörünün davranışsal benzerliğini ölçer. Ortak TTP setine sahip aktörler aynı araç veya altyapıyı paylaşıyor olabilir: import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity from sklearn.preprocessing import MultiLabelBinarizer actor_ttps = { 'APT29': ['T1059.001','T1003.001','T1021.002','T1547.001','T1566.002'], 'APT28': ['T1059.001','T1003.001','T1021.001','T1566.001','T1078'], 'Lazarus': ['T1059.001','T1055','T1021.002','T1486','T1566.001'], 'FIN7': ['T1059.007','T1055','T1021.002','T1566.001','T1041'] } actors = list(actor_ttps.keys()) print('TTP Benzerlik Matrisi:') print(sim_df.round(3)) pairs = [(actors[i],actors[j],sim_df.iloc[i,j]) for i in range(len(actors)) for j in range(i+1, len(actors))] print('\nEn benzer aktör çiftleri:') for a1, a2, score in sorted(pairs, key=lambda x: x[2], reverse=True): print(f'{a1} - {a2}: {score:.3f}')

Bu bölümün pratik akışı şu sırayla ilerler:

  • mlb = MultiLabelBinarizer()
  • X = mlb.fit_transform(actor_ttps.values())
  • similarity = cosine_similarity(X)
  • sim_df = pd.DataFrame(similarity, index=actors, columns=actors)
  • pairs = [(actors[i],actors[j],sim_df.iloc[i,j]) for i in range(len(actors)) for j in range(i+1,len(actors))]
  • for a1,a2,score in sorted(pairs, key=lambda x: x[2], reverse=True): print(f'{a1}-{a2}: {score:.3f}')

Kanit ve Bilesen Iliskileri

TTP madenciliğinde kullanılan veri kaynakları farklı kalite ve kapsam özelliklerine sahiptir. Çoklu kaynak kombinasyonu en kapsamlı TTP profilini sağlar. Örnek kaynak kaliteleri: - OSINT raporları: geniş kapsam, düşük doğruluk - ISAC paylaşımları: sektör spesifik, orta doğruluk - Kendi IR deneyimi: yüksek doğruluk, dar kapsam - Ticari threat intel: geniş kapsam, yüksek doğruluk, maliyetli

  • OSINT raporu: Geniş kapsam, doğrulama gerektiren ham veri
  • ISAC paylaşımı: Sektör odaklı, güvenilir peer-sharing verisi
  • Kendi IR vakası: En yüksek doğruluk, ortama özgü TTP
  • Ticari threat intel: Geniş aktör kapsamı, yapılandırılmış STIX2 formatı

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram Bearer olarak verilir. OpenCTI platformu TTP verilerini STIX2 formatında depolar ve REST API ile sorgulanabilir. Python ile OpenCTI'dan aktör TTP profili çekme: import requests import json OPENCTI_URL = 'https://opencti.example.com/graphql' AUTH_TOKEN = 'your_api_token' query = """ { threatActors(first: 10, filters: [{key: "name", values: ["APT29"]}]) { edges { node { name description sophistication usedTechniques { edges { node { x_mitre_id name killChainPhases { phase_name } } } } } } } } """ response = requests.post( OPENCTI_URL, json={'query': query}, headers={'Authorization': f'Bearer {AUTH_TOKEN}'} ) data = response.json() actor = data['data']['threatActors']['edges'][0]['node'] print(f"Aktör: {actor['name']}, Sofistike: {actor['sophistication']}") print(f"TTP sayısı: {len(actor['usedTechniques']['edges'])}")

Operasyonel Dogrulama ve Raporlama

Splunk ile TTP bazlı tehdit aktörü ilişkilendirme (attribution). Ortamda tespit edilen TTP kombinasyonu bilinen aktör profiline eşleştirme: | eval detected_ttp=case( match(CommandLine,"-[Ee][Nn][Cc]"), "T1059.001", match(TargetImage,"lsass.exe"), "T1003.001", match(CommandLine,"net.*use.445"), "T1021.002", match(CommandLine,"schtasks./create"), "T1053.005", match(CommandLine,"reg.*add.*CurrentVersion\\Run"), "T1547.001", true(), null() ) | stats values(detected_ttp) as ttp_set, dc(hostname) as affected_hosts, dc(user) as affected_users by src_ip | eval apt29_overlap=mvcount(mvfilter(match(ttp_set,"T1059.001|T1003.001|T1021.002|T1547.001"))) | eval apt28_overlap=mvcount(mvfilter(match(ttp_set,"T1059.001|T1003.001|T1021.001|T1078"))) | eval attribution=case( apt29_overlap>=3, "APT29_CANDIDATE", apt28_overlap>=3, "APT28_CANDIDATE", true(), "UNKNOWN_ACTOR" ) | table src_ip, ttp_set, apt29_overlap, apt28_overlap, attribution, affected_hosts

Bu bölümün pratik akışı şu sırayla ilerler:

  • index=sysmon OR index=wineventlog earliest=-72h
  • | eval detected_ttp=case(match(CommandLine,"-[Ee][Nn][Cc]"),"T1059.001",match(TargetImage,"lsass.exe"),"T1003.001",true(),null())
  • | where isnotnull(detected_ttp)
  • | stats values(detected_ttp) as ttp_set, dc(hostname) as affected_hosts by src_ip
  • | eval apt29_overlap=mvcount(mvfilter(match(ttp_set,"T1059.001|T1003.001|T1021.002")))
  • | eval attribution=case(apt29_overlap>=3,"APT29_CANDIDATE",true(),"UNKNOWN_ACTOR")
  • | where attribution!="UNKNOWN_ACTOR"
  • | table src_ip, ttp_set, apt29_overlap, attribution, affected_hosts
  • | sort -apt29_overlap

Cikti ve Kullanım Amaci

TTP madenciliği sonuçlarının SOC operasyonlarına entegrasyonu farklı süreçleri iyileştirir. Her çıktı tipi farklı bir SOC işlevine katkı sağlar. Örnek entegrasyon akışı: Threat intel raporu → NLP TTP çıkarma → STIX2 bundle → OpenCTI → SIEM korelasyon kuralı → Splunk alarm → SOC triage

  • Aktör TTP profili: Proaktif avcılık hipotezi oluşturma
  • TTP benzerlik matrisi: Saldırı attributionu ve aktör kümeleme
  • Otomatik Sigma kuralı: SIEM kapsam boşluğunu hızla kapatma
  • TTP zaman çizelgesi: Saldırı kampanyasının evrimini izleme

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram detected_techniques / total_techniques olarak verilir. TTP madenciliğinin etkinliğini ölçmek için coverage ve enrichment metrikleri kullanılır. Python ile TTP coverage raporu: import pandas as pd df_alerts = pd.read_csv('siem_alerts.csv') df_mitre = pd.read_csv('mitre_techniques.csv') total_techniques = len(df_mitre) detected_techniques = df_alerts['mitre_technique'].nunique() coverage_pct = detected_techniques / total_techniques * 100 enrichment_rate = df_alerts['mitre_technique'].notna().mean() * 100 mean_ttps_per_incident = df_alerts.groupby('incident_id')['mitre_technique'].nunique().mean() print(f'ATT&CK Kapsam Oranı: %{coverage_pct:.1f} ({detected_techniques}/{total_techniques})') print(f'Alert Zenginleştirme Oranı: %{enrichment_rate:.1f}') print(f'Olay Başına Ortalama TTP: {mean_ttps_per_incident:.1f}') tactic_coverage = df_alerts.merge(df_mitre, on='mitre_technique').groupby('tactic')['mitre_technique'].nunique() print('\nTaktik bazlı kapsam:') print(tactic_coverage.sort_values(ascending=False))

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, TTP (Tactics, Techniques, Procedures) Madenciliği konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda parcali degil, butunlu bir ogrenme akisina donusturur. Yalnizca kavramlari ezberlemek yerine surec sirasini, bilesenler arasi iliskiyi ve hangi kanitin neden onemli oldugunu kavramayi hedefler.

Ozet

Bu ders kapsaminda one cikan basliklar: Tactic, Technique, Sub-technique, Procedure, OSINT raporu, ISAC paylaşımı, Kendi IR vakası, Ticari threat intel, Aktör TTP profili, TTP benzerlik matrisi. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.