CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

IOC'den IOB'ye Geçiş — Davranış Tabanlı Göstergeler

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

IOC'den IOB'ye Geçiş — Davranış Tabanlı Göstergeler 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.

IOC'den IOB'ye Geçiş — Davranış Tabanlı Göstergeler

IOC (Indicator of Compromise) hash, IP ve domain gibi statik göstergelerdir. Saldırganlar bu göstergeleri günler içinde değiştirebilir. IOB (Indicator of Behavior) ise saldırganın ne yaptığını tanımlar ve çok daha dayanıklıdır. Python ile IOC ve IOB karşılaştırmalı tespit: import pandas as pd import re

IOC tabanlı tespit — statik hash listesi

ioc_hashes = {'d41d8cd98f00b204e9800998ecf8427e', 'a87ff679a2f3e71d9181a67b7542122c'}

IOB tabanlı tespit — davranış örüntüsü

df['iob_match'] = ( (df['process_parent'].str.contains('winword|excel|outlook', case=False, na=False)) & (df['process_child'].str.contains('powershell|cmd|wscript', case=False, na=False)) & (df['network_connection'] == True) & (df['file_write_temp'] == True) )

Giris ve Temel Akis

IOC (Indicator of Compromise) hash, IP ve domain gibi statik göstergelerdir. Saldırganlar bu göstergeleri günler içinde değiştirebilir. IOB (Indicator of Behavior) ise saldırganın ne yaptığını tanımlar ve çok daha dayanıklıdır. Python ile IOC ve IOB karşılaştırmalı tespit: import pandas as pd import re

IOC tabanlı tespit — statik hash listesi

ioc_hashes = {'d41d8cd98f00b204e9800998ecf8427e', 'a87ff679a2f3e71d9181a67b7542122c'}

IOB tabanlı tespit — davranış örüntüsü

df['iob_match'] = ( (df['process_parent'].str.contains('winword|excel|outlook', case=False, na=False)) & (df['process_child'].str.contains('powershell|cmd|wscript', case=False, na=False)) & (df['network_connection'] == True) & (df['file_write_temp'] == True) )

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

  • ioc_hashes = {'d41d8cd98f00b204e9800998ecf8427e'}
  • df['ioc_match'] = df['file_hash'].isin(ioc_hashes)
  • df['iob_match'] = ((df['process_parent'].str.contains('winword|excel',na=False)) & (df['process_child'].str.contains('powershell|cmd',na=False)) & (df['network_connection']==True))
  • print(f'IOC eşleşme: {df["ioc_match"].sum()}')
  • print(f'IOB eşleşme: {df["iob_match"].sum()}')
  • print(f'IOB yakaladığı ama IOC kaçırdığı: {(df["iob_match"] & ~df["ioc_match"]).sum()}')

Temel Kavram Eslesmeleri

David Bianco'nun Pyramid of Pain modeli tehdit göstergelerini değiştirme zorluğuna göre sıralar. Piramit üstündeki göstergeler saldırgan için değiştirmesi en maliyetli olanlardır. Pyramid of Pain (alttan üste): - Hash değerleri → en kolay değiştirilir - IP adresleri - Domain adları - Ağ/host artifact'ları - Araçlar - TTP'ler → en zor değiştirilir

  • Hash değerleri: Tek bit değişikliği yeni hash üretir, çok düşük maliyet
  • Domain adları: Yeni domain kaydı dakikalar içinde yapılabilir
  • Araçlar: Yeniden derleme veya yeni araç geliştirme gerektirir
  • TTP'ler: Saldırgan metodolojisinin yeniden tasarımı gerektirir

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram jitter_ratio olarak verilir. IOB tanımlamak için saldırı zincirinin her adımındaki davranışsal örüntüler çıkarılır. Cobalt Strike C2 beacon tespiti klasik bir IOB örneğidir: import pandas as pd import numpy as np # Beaconing IOB: düzenli aralıklı DNS sorguları df['timestamp'] = pd.to_datetime(df['timestamp']) df_sorted = df.sort_values(['src_ip','timestamp']) df_sorted['time_delta'] = df_sorted.groupby('src_ip')['timestamp'].diff().dt.total_seconds() beacon_features = df_sorted.groupby('src_ip').agg( mean_interval=('time_delta','mean'), std_interval=('time_delta','std'), query_count=('query','count'), unique_domains=('query','nunique') ).reset_index() beacon_features['jitter_ratio'] = beacon_features['std_interval'] / (beacon_features['mean_interval'] + 1) # Düşük jitter + yüksek sorgu sayısı = beaconing beacons = beacon_features[ (beacon_features['jitter_ratio'] < 0.1) & (beacon_features['query_count'] > 50) ] print(f'Beaconing IOB tespiti: {len(beacons)} kaynak IP')

Arac, Komut veya Inceleme Akisi

YARA kuralları IOB'yi dosya ve bellek içeriğinde aramak için kullanılır. Hash yerine davranışsal string örüntüsü ve yapısal özellikler tanımlanır: import yara yara_rule = """ rule CobaltStrike_Beacon_IOB { meta: description = "Detects CS beacon behavioral patterns" mitre_technique = "T1071.001" author = "SOC L3" strings: $s1 = "ReflectiveDll" nocase $s2 = "beacon" nocase wide $s3 = { 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF } $http1 = "/jquery-3.3.1.min.js" nocase $http2 = "Accept: text/html" nocase $b64 = /[A-Za-z0-9+/]{100,}={0,2}/ condition: (2 of ($s*)) or (all of ($http*) and $b64) or ($s3 at 0 and 1 of ($s*)) } """ for match in matches: print(f'Kural: {match.rule}')

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

  • yara_rule = """rule CobaltStrike_Beacon_IOB { meta: ... strings: $s1='ReflectiveDll' $b64=/[A-Za-z0-9+/]{100,}={0,2}/ condition: (2 of ($s*)) or (all of ($http*) and $b64) }"""
  • rules = yara.compile(source=yara_rule)
  • matches = rules.match('/path/to/suspicious.exe')
  • for match in matches: print(f'Kural: {match.rule}')
  • print(f'Eşleşen string: {[str(s) for s in match.strings]}')

Kanit ve Bilesen Iliskileri

IOB kategorileri saldırı yaşam döngüsünün farklı aşamalarını kapsar. Her kategori farklı log kaynakları ve analiz teknikleri gerektirir. Örnek IOB kategorileri: - Process IOB: anormal parent-child ilişkisi - Network IOB: beaconing, DNS tünelleme, JA3 parmak izi - File IOB: temp dizine yazma, imzasız binary - Registry IOB: Run key değişikliği, COM hijacking - Memory IOB: process injection, hollowing

  • Network IOB: JA3 TLS parmak izi ve DNS interval analizi
  • Process IOB: Sysmon EventID 1 parent-child zincir analizi
  • Memory IOB: Volatility ile process injection tespiti
  • Registry IOB: Sysmon EventID 12/13 registry değişiklik izleme

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram md5 olarak verilir. JA3 TLS parmak izi ağ seviyesinde IOB tespiti için güçlü bir yöntemdir. Kötücül araçların TLS handshake örüntüleri benzersiz JA3 hash'leri üretir: import hashlib import struct def compute_ja3(tls_record): version = tls_record.get('tls_version', 0) ciphers = '-'.join([str(c) for c in tls_record.get('cipher_suites', []) if c not in [0x0a0a, 0x1a1a]]) extensions = '-'.join([str(e) for e in tls_record.get('extension_types', [])]) groups = '-'.join([str(g) for g in tls_record.get('elliptic_curves', [])]) point_formats = '-'.join([str(p) for p in tls_record.get('ec_point_formats', [])]) ja3_string = f'{version},{ciphers},{extensions},{groups},{point_formats}' ja3_hash = hashlib.md5(ja3_string.encode()).hexdigest() return ja3_hash, ja3_string known_malicious_ja3 = { '72a589da586844d7f0818ce684948eea': 'Cobalt Strike default', 'a0e9f5d64349fb13191bc781f81f42e1': 'Metasploit Meterpreter' } ja3_hash, ja3_str = compute_ja3(tls_record) if ja3_hash in known_malicious_ja3: print(f'Kötücül JA3: {ja3_hash} — {known_malicious_ja3[ja3_hash]}')

Operasyonel Dogrulama ve Raporlama

Splunk ile IOB tabanlı Cobalt Strike C2 tespiti. Beaconing örüntüsü ve JA3 parmak izi korelasyonu: | sort src_ip, time_epoch | stats avg(interval) as mean_interval, stdev(interval) as std_interval, count as conn_count, dc(dst_ip) as unique_dst, values(ja3_hash) as ja3_hashes by src_ip | eval is_beacon=if( jitter_ratio < 0.1 AND conn_count > 50 AND mean_interval BETWEEN 30 AND 300, 1, 0 ) | eval malicious_ja3=if( mvfind(ja3_hashes,"72a589da586844d7f0818ce684948eea")>=0, "CobaltStrike", "UNKNOWN" ) | table src_ip, mean_interval, jitter_ratio, conn_count, malicious_ja3

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

  • index=network earliest=-24h
  • | eval time_epoch=_time
  • | streamstats current=f last(time_epoch) as prev_time by src_ip
  • | eval interval=time_epoch - prev_time
  • | stats avg(interval) as mean_interval, stdev(interval) as std_interval, count as conn_count by src_ip
  • | eval jitter_ratio=std_interval/(mean_interval+1)
  • | eval is_beacon=if(jitter_ratio<0.1 AND conn_count>50 AND mean_interval BETWEEN 30 AND 300,1,0)
  • | where is_beacon=1 OR malicious_ja3!="UNKNOWN"
  • | table src_ip, mean_interval, jitter_ratio, conn_count
  • | sort jitter_ratio

Cikti ve Kullanım Amaci

IOB'nin SOC operasyonlarına entegrasyonu farklı süreçleri iyileştirir. IOC'ye kıyasla daha az alarm gürültüsü ve daha yüksek tespit kalitesi sağlar. Örnek SOC iyileştirmeleri: - SIEM kural güncellemesi: IOC hash yerine IOB process chain kuralı - Threat hunting: IOB hipotezi IOC listesinden daha uzun ömürlü - Alert triage: IOB alarmı genellikle daha yüksek güven skoru taşır - Threat intel paylaşımı: IOB içeren STIX2 bundle daha değerli

  • Daha az kural bakımı: IOB kuralları hash güncellemesi gerektirmez
  • Yüksek güven skoru: Davranış eşleşmesi FP oranını düşürür
  • Uzun ömürlü hipotez: TTP değişmediğinden avcılık değerini korur
  • Zengin STIX2 paylaşımı: IOB içeren bundle diğer kurumlara daha fazla değer katar

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram 8 olarak verilir. Elastic ile IOB tabanlı process injection tespiti. Sysmon EventID 8 (CreateRemoteThread) ve bellekte yazma-çalıştırma döngüsü: sequence by host.name with maxspan=5m [process where event.type == "start" and process.name in ("powershell.exe","cmd.exe","wscript.exe") and not process.parent.name in ("explorer.exe","services.exe")] [process where event.code == "8" and winlog.event_data.TargetImage like "\svchost.exe" and not process.executable like "\Windows\System32\*"] [network where event.type == "connection" and process.name == "svchost.exe" and not cidrmatch(destination.ip,"10.0.0.0/8","172.16.0.0/12","192.168.0.0/16")] Bu EQL sorgusu 5 dakika içinde: şüpheli process başlatma → CreateRemoteThread svchost'a → svchost'tan dış bağlantı zincirini IOB olarak tespit eder.

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, IOC'den IOB'ye Geçiş — Davranış Tabanlı Göstergeler 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: Hash değerleri, Domain adları, Araçlar, TTP'ler, Network IOB, Process IOB, Memory IOB, Registry IOB, Daha az kural bakımı, Yüksek güven skoru. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.