CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

Graf Analizi ile Lateral Movement Tespiti

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

Graf Analizi ile Lateral Movement Tespiti 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.

Graf Analizi ile Lateral Movement Tespiti

Graf analizi ağ içi bağlantıları düğüm (node) ve kenar (edge) yapısıyla modelleyerek lateral movement tespitini güçlendirir. NetworkX ile authentication log üzerinden bağlantı grafiği: import networkx as nx import pandas as pd for _, row in df_auth.iterrows(): G.add_edge( row['src_host'], row['dst_host'], user=row['username'], timestamp=row['timestamp'], logon_type=row['logon_type'] ) print(f'Kenar sayısı: {G.number_of_edges()}') print(f'Bağlı bileşen sayısı: {nx.number_weakly_connected_components(G)}')

Giris ve Temel Akis

Graf analizi ağ içi bağlantıları düğüm (node) ve kenar (edge) yapısıyla modelleyerek lateral movement tespitini güçlendirir. NetworkX ile authentication log üzerinden bağlantı grafiği: import networkx as nx import pandas as pd for _, row in df_auth.iterrows(): G.add_edge( row['src_host'], row['dst_host'], user=row['username'], timestamp=row['timestamp'], logon_type=row['logon_type'] ) print(f'Kenar sayısı: {G.number_of_edges()}') print(f'Bağlı bileşen sayısı: {nx.number_weakly_connected_components(G)}')

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

  • df_auth = df[df['EventCode'] == 4624].copy()
  • G = nx.DiGraph()
  • for _, row in df_auth.iterrows(): G.add_edge(row['src_host'], row['dst_host'])
  • print(f'Düğüm sayısı: {G.number_of_nodes()}')
  • in_degree = dict(G.in_degree())
  • top_targets = sorted(in_degree.items(), key=lambda x: x[1], reverse=True)[:10]
  • print('En çok hedeflenen hostlar:', top_targets)

Temel Kavram Eslesmeleri

Graf merkeziliği (centrality) metrikleri ağ içindeki kritik düğümleri ve anormal davranışları tespit etmek için kullanılır. Her metrik farklı bir ağ özelliğini ölçer. Örnek: Bir saldırgan lateral movement sırasında çok sayıda hosta erişiyorsa degree centrality yüksek olur. Kritik sistemlere erişim yolunda konumlanmışsa betweenness centrality öne çıkar.

  • Degree centrality: Çok sayıda hosta bağlanan kaynak — keşif ve yayılma
  • Betweenness centrality: Kritik geçiş noktasındaki host — pivoting tespiti
  • PageRank: Önemli hostlardan bağlantı alan düğüm — hedef önceliklendirme
  • Closeness centrality: Ağın merkezine yakın host — hızlı yayılma riski

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram NetworkXNoPath olarak verilir. Kısa yol analizi lateral movement zincirini ortaya çıkarır. Saldırganın giriş noktasından domain controller'a ulaşma yolunu tespit etmek kritik öneme sahiptir: import networkx as nx import pandas as pd try: path = nx.shortest_path(G, source='WORKSTATION01', target='DC01') print(f'En kısa lateral movement yolu: {" -> ".join(path)}') print(f'Adım sayısı: {len(path) - 1}') except nx.NetworkXNoPath: print('Doğrudan bağlantı yok') all_paths = list(nx.all_simple_paths(G, source='WORKSTATION01', target='DC01', cutoff=4)) print(f'4 adım içindeki tüm yollar: {len(all_paths)}') for p in sorted(all_paths, key=len): print(' -> '.join(p))

Arac, Komut veya Inceleme Akisi

Topluluk tespiti (community detection) ağı doğal kümelere böler. Bir düğüm kendi topluluğu dışındaki hostlara bağlanıyorsa lateral movement işareti olabilir: import networkx as nx import community as community_louvain import pandas as pd edge_anomalies = [] for src, dst in G.edges(): src_comm = partition.get(src, -1) dst_comm = partition.get(dst, -1) if src_comm != dst_comm: edge_anomalies.append({ 'src': src, 'dst': dst, 'src_community': src_comm, 'dst_community': dst_comm }) print(f'Topluluk arası bağlantı sayısı: {len(df_anomalies)}') print(df_anomalies.groupby(['src_community','dst_community']).size().sort_values(ascending=False).head(10))

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

  • G_undirected = G.to_undirected()
  • partition = community_louvain.best_partition(G_undirected)
  • nx.set_node_attributes(G, partition, 'community')
  • for src, dst in G.edges(): src_comm = partition.get(src,-1); dst_comm = partition.get(dst,-1)
  • if src_comm != dst_comm: edge_anomalies.append({'src':src,'dst':dst})
  • df_anomalies = pd.DataFrame(edge_anomalies)
  • print(f'Topluluk arası bağlantı: {len(df_anomalies)}')

Kanit ve Bilesen Iliskileri

MITRE ATT&CK lateral movement teknikleri graf analizi ile eşleştirilerek tespit edilir. Her teknik farklı bir ağ bağlantısı örüntüsü oluşturur. Örnek graf örüntüleri: - Pass-the-Hash: aynı credential ile çok sayıda hedefe paralel bağlantı - RDP pivoting: A→B→C zinciri, B hem kaynak hem hedef - SMB spray: tek kaynaktan çok sayıda hedefe port 445 bağlantısı - WMI lateral movement: WORKSTATION→SERVER, port 135 ve yüksek ephem port

  • T1550 Pass-the-Hash: Aynı NTLM hash ile paralel çok hedef bağlantısı
  • T1021 RDP pivoting: A→B→C zinciri, B düğümü hem kaynak hem hedef
  • T1021.002 SMB: Tek kaynaktan port 445 ile yayılan bağlantı örüntüsü
  • T1047 WMI: Port 135 üzerinden yüksek ephemeral port bağlantısı

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram pivot_score olarak verilir. Splunk ile graf tabanlı lateral movement tespiti. Windows authentication loglarından bağlantı zinciri analizi: index=wineventlog EventCode=4624 Logon_Type=3 earliest=-24h | stats dc(dst_host) as unique_targets, values(dst_host) as target_list, count as total_auth by src_host, user | where unique_targets > 5 | eval lateral_risk=case( unique_targets>20, "CRITICAL", unique_targets>10, "HIGH", unique_targets>5, "MEDIUM", true(), "LOW" ) | join type=left src_host [ index=wineventlog EventCode=4624 Logon_Type=3 | stats dc(src_host) as incoming_connections by dst_host | rename dst_host as src_host ] | eval pivot_score=if(unique_targets>5 AND incoming_connections>3, "PIVOT_CANDIDATE", "NORMAL") | table src_host, user, unique_targets, total_auth, lateral_risk, pivot_score | sort -unique_targets

Operasyonel Dogrulama ve Raporlama

Zaman damgalı graf analizi saldırı zincirinin kronolojik ilerleyişini ortaya çıkarır. Her kenar zaman bilgisi taşıdığından lateral movement sırası yeniden oluşturulabilir: import networkx as nx import pandas as pd from datetime import timedelta df_sorted = df_auth.sort_values('timestamp') G_temporal = nx.DiGraph() for _, row in df_sorted.iterrows(): G_temporal.add_edge( row['src_host'], row['dst_host'], timestamp=row['timestamp'], user=row['username'] ) def find_attack_chain(G, start_node, time_window_hours=2): chains = [] for path in nx.all_simple_paths(G, start_node, cutoff=5): edges = [(path[i], path[i+1]) for i in range(len(path)-1)] timestamps = [G[u][v]['timestamp'] for u,v in edges] duration = (max(timestamps) - min(timestamps)).total_seconds() / 3600 if duration <= time_window_hours: chains.append({'path': path, 'duration_hours': duration}) return sorted(chains, key=lambda x: x['duration_hours']) chains = find_attack_chain(G_temporal, 'WORKSTATION01', time_window_hours=2) for chain in chains[:5]: print(f"Yol: {' -> '.join(chain['path'])}, Süre: {chain['duration_hours']:.2f}h")

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

  • all_simple_paths

Cikti ve Kullanım Amaci

Elastic EQL sequence sorguları graf analizi olmadan lateral movement zincirini tespit edebilir. Ardışık authentication olayları zaman penceresi içinde zincirleme sorgulanır. Örnek EQL: sequence by winlog.event_data.SubjectUserName with maxspan=2h [authentication where event.code == "4624" and winlog.event_data.LogonType == "3"] by host.name [authentication where event.code == "4624" and winlog.event_data.LogonType == "3"] by winlog.event_data.IpAddress

  • NetworkX graf analizi: Tüm ağ topolojisini görselleştirir ve yol analizi yapar
  • Elastic EQL sequence: Gerçek zamanlı zincir tespiti, SIEM entegrasyonu kolay
  • Splunk transaction: Olay zincirini tek kayıtta gruplar, süre hesaplar
  • Neo4j graph DB: Cypher sorgusuyla büyük ölçekli kalıcı graf sorgulama

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram AUTHENTICATED_TO*2..5 olarak verilir. Neo4j graf veritabanı büyük ölçekli lateral movement analizinde NetworkX'ten üstündür. Cypher sorgu dili ile karmaşık yol sorguları çok daha verimli çalışır: // Tüm lateral movement zincirlerini bul MATCH path = (src:Host)-[:AUTHENTICATED_TO*2..5]->(dst:Host) WHERE dst.name CONTAINS 'DC' OR dst.is_critical = true AND ALL(r IN relationships(path) WHERE r.logon_type = 3) WITH path, src, dst, length(path) as hop_count, [r IN relationships(path) | r.timestamp] as timestamps WHERE timestamps[-1] - timestamps[0] < 7200 RETURN src.name as entry_point, dst.name as target, hop_count, [n IN nodes(path) | n.name] as attack_chain ORDER BY hop_count ASC LIMIT 20

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, Graf Analizi ile Lateral Movement Tespiti 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: Degree centrality, Betweenness centrality, PageRank, Closeness centrality, T1550 Pass-the-Hash, T1021 RDP pivoting, T1021.002 SMB, T1047 WMI, NetworkX graf analizi, Elastic EQL sequence. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.