Ransomware Pre-Encryption Davranış Tespiti
Ransomware şifreleme başlamadan önce keşif, lateral movement ve staging aşamalarından geçer. Bu aşamaların tespiti kritik erken uyarı sağlar. Python ile pre-encryption IOB tespiti: import pandas as pd import numpy as np from datetime import timedelta df_sysmon = pd.read_parquet('sysmon_events.parquet') df_sysmon['timestamp'] = pd.to_datetime(df_sysmon['timestamp'])
Keşif komutları tespiti
recon_cmds = [ 'net view','net share','whoami','ipconfig','systeminfo', 'nltest','wmic','nslookup','arp -a','net group','net localgroup' ] df_sysmon['is_recon'] = df_sysmon['CommandLine'].str.lower().apply( lambda cmd: any(r in str(cmd) for r in recon_cmds) )
Gölge kopya silme tespiti — kritik ransomware göstergesi
df_sysmon['is_vss_delete'] = df_sysmon['CommandLine'].str.contains( r'vssadmin.*delete|wmic.*shadowcopy.*delete|bcdedit.*recoveryenabled.*no', case=False, regex=True, na=False )
Yedek dosya silme tespiti
df_sysmon['is_backup_kill'] = df_sysmon['CommandLine'].str.contains( r'wbadmin.delete|del..bak|del.*.vhd|taskill.*veeam|net.*stop.*backup', case=False, regex=True, na=False ) host_risk = df_sysmon.groupby('hostname').agg( recon_count=('is_recon','sum'), vss_delete=('is_vss_delete','sum'), backup_kill=('is_backup_kill','sum') ).reset_index() host_risk['ransomware_pre_score'] = ( host_risk['recon_count'].clip(0,10) * 5 + host_risk['vss_delete'] * 50 + host_risk['backup_kill'] * 40 )
Giris ve Temel Akis
Ransomware şifreleme başlamadan önce keşif, lateral movement ve staging aşamalarından geçer. Bu aşamaların tespiti kritik erken uyarı sağlar. Python ile pre-encryption IOB tespiti: import pandas as pd import numpy as np from datetime import timedelta df_sysmon = pd.read_parquet('sysmon_events.parquet') df_sysmon['timestamp'] = pd.to_datetime(df_sysmon['timestamp'])
Keşif komutları tespiti
recon_cmds = [ 'net view','net share','whoami','ipconfig','systeminfo', 'nltest','wmic','nslookup','arp -a','net group','net localgroup' ] df_sysmon['is_recon'] = df_sysmon['CommandLine'].str.lower().apply( lambda cmd: any(r in str(cmd) for r in recon_cmds) )
Gölge kopya silme tespiti — kritik ransomware göstergesi
df_sysmon['is_vss_delete'] = df_sysmon['CommandLine'].str.contains( r'vssadmin.*delete|wmic.*shadowcopy.*delete|bcdedit.*recoveryenabled.*no', case=False, regex=True, na=False )
Yedek dosya silme tespiti
df_sysmon['is_backup_kill'] = df_sysmon['CommandLine'].str.contains( r'wbadmin.delete|del..bak|del.*.vhd|taskill.*veeam|net.*stop.*backup', case=False, regex=True, na=False ) host_risk = df_sysmon.groupby('hostname').agg( recon_count=('is_recon','sum'), vss_delete=('is_vss_delete','sum'), backup_kill=('is_backup_kill','sum') ).reset_index() host_risk['ransomware_pre_score'] = ( host_risk['recon_count'].clip(0,10) * 5 + host_risk['vss_delete'] * 50 + host_risk['backup_kill'] * 40 )
Bu bölümün pratik akışı şu sırayla ilerler:
- df_sysmon['is_recon'] = df_sysmon['CommandLine'].str.lower().apply(lambda cmd: any(r in str(cmd) for r in recon_cmds))
- df_sysmon['is_vss_delete'] = df_sysmon['CommandLine'].str.contains(r'vssadmin.*delete|wmic.*shadowcopy.*delete', case=False, regex=True, na=False)
- df_sysmon['is_backup_kill'] = df_sysmon['CommandLine'].str.contains(r'wbadmin.*delete|net.*stop.*backup', case=False, regex=True, na=False)
- host_risk = df_sysmon.groupby('hostname').agg(recon_count=('is_recon','sum'), vss_delete=('is_vss_delete','sum'), backup_kill=('is_backup_kill','sum')).reset_index()
- host_risk['ransomware_pre_score'] = (host_risk['recon_count'].clip(0,10)*5 + host_risk['vss_delete']*50 + host_risk['backup_kill']*40)
- print(host_risk[host_risk['ransomware_pre_score']>50].sort_values('ransomware_pre_score',ascending=False))
Temel Kavram Eslesmeleri
Modern ransomware saldırıları belirli aşamalardan oluşan yapılandırılmış bir zincir izler. Her aşama farklı tespit fırsatı sunar. Örnek ransomware kill chain (Conti/BlackCat): 1. Initial Access: phishing veya VPN exploit 2. Execution: Cobalt Strike beacon yükleme 3. Persistence: scheduled task, registry run key 4. Discovery: AD keşfi, BloodHound çalıştırma 5. Lateral Movement: PsExec, WMI, RDP 6. Exfiltration: veri çalma (double extortion) 7. Impact: VSS silme + şifreleme
- Discovery aşaması: BloodHound LDAP sorguları ve nltest komutları
- Lateral movement: PsExec EventID 7045 ve SMB bağlantı grafiği
- Exfiltration: Yüksek bytes_out ve Rclone/MEGAcmd process tespiti
- Impact aşaması: vssadmin delete ve bcdedit recoveryenabled no
Ilk Cekirdek Kavram
Bu bölümde öne çıkan çekirdek kavram 11 olarak verilir. Dosya sistemi davranış anomalisi ile şifreleme başlangıcını saniyeler içinde tespit etme. Dosya değiştirme hızı ve uzantı değişimi kritik göstergelerdir: import pandas as pd import numpy as np from datetime import timedelta df_file = pd.read_parquet('sysmon_file_events.parquet') df_file['timestamp'] = pd.to_datetime(df_file['timestamp']) df_file['time_window'] = df_file['timestamp'].dt.floor('1min') known_ransom_ext = ['.locked','.encrypted','.crypto','.enc','.ryk','.conti','.blackcat','.hive'] df_file['is_ransom_ext'] = df_file['TargetFilename'].str.lower().apply( lambda f: any(f.endswith(ext) for ext in known_ransom_ext) ) file_activity = df_file.groupby(['hostname','time_window']).agg( file_writes=('EventID', lambda x: (x==11).sum()), file_renames=('EventID', lambda x: (x==23).sum()), ransom_ext_count=('is_ransom_ext','sum'), unique_dirs=('TargetFilename', lambda x: x.str.rsplit('\',n=1).str[0].nunique()) ).reset_index() file_activity['writes_per_min'] = file_activity['file_writes'] file_activity['rename_ratio'] = file_activity['file_renames'] / (file_activity['file_writes'] + 1) encryption_start = file_activity[ (file_activity['writes_per_min'] > 100) | (file_activity['ransom_ext_count'] > 0) | (file_activity['rename_ratio'] > 0.5) ] print(f'Şifreleme başlangıcı adayı: {len(encryption_start)} host-dakika') print(encryption_start.sort_values('ransom_ext_count',ascending=False).head())
Arac, Komut veya Inceleme Akisi
Splunk ile ransomware pre-encryption çok aşamalı tespit sorgusu. BloodHound tespitinden VSS silmeye kadar tam zincir: | eval stage=case( match(CommandLine,"Invoke-BloodHound|SharpHound|bloodhound"), "1_DISCOVERY_BLOODHOUND", match(CommandLine,"mimikatz|sekurlsa|lsadump"), "2_CREDENTIAL_DUMP", match(CommandLine,"psexec|wmiexec|smbexec|atexec"), "3_LATERAL_MOVEMENT", match(CommandLine,"rclone|mega|exfil") AND match(CommandLine,"copy|upload|sync"), "4_EXFILTRATION", match(CommandLine,"vssadmin.*delete|shadowcopy.*delete"), "5_VSS_DELETE", match(CommandLine,"bcdedit.*recoveryenabled.*no"), "5_RECOVERY_DISABLE", match(CommandLine,"wbadmin.*delete|taskill.*backup"), "5_BACKUP_KILL", true(), null() ) | eval campaign_duration_min=round((last_seen-first_seen)/60,1) | eval ransomware_confidence=case( has_vss=1 AND stage_count>=4, "CRITICAL", has_vss=1 AND stage_count>=2, "HIGH", stage_count>=3, "MEDIUM", true(), "LOW" ) | table src_ip, stages, stage_count, campaign_duration_min, ransomware_confidence, hosts
Bu bölümün pratik akışı şu sırayla ilerler:
- index=sysmon earliest=-4h
- | eval stage=case(match(CommandLine,"Invoke-BloodHound"),"1_DISCOVERY_BLOODHOUND",match(CommandLine,"mimikatz"),"2_CREDENTIAL_DUMP",match(CommandLine,"vssadmin.*delete"),"5_VSS_DELETE",true(),null())
- | where isnotnull(stage)
- | stats values(stage) as stages, dc(hostname) as hosts, min(_time) as first_seen, max(_time) as last_seen by src_ip
- | eval stage_count=mvcount(stages)
- | eval has_vss=if(mvfind(stages,"5_VSS")>=0,1,0)
- | eval ransomware_confidence=case(has_vss=1 AND stage_count>=4,"CRITICAL",has_vss=1,"HIGH",true(),"LOW")
- | where ransomware_confidence IN ("CRITICAL","HIGH")
- | table src_ip, stages, stage_count, ransomware_confidence, hosts
- | sort -stage_count
Kanit ve Bilesen Iliskileri
Ransomware operatörleri tespiti zorlaştırmak için LOLBins (Living Off the Land Binaries) kullanır. Windows'un kendi araçlarını kötüye kullandıkları için imza tabanlı tespit yetersiz kalır. Örnek LOLBin kullanımları: - certutil.exe -decode: payload decode etme - wmic.exe shadowcopy delete: VSS silme - mshta.exe: JS/VBS payload çalıştırma - regsvr32.exe /s /n /u /i: COM scriptlet - rundll32.exe: DLL injection
- certutil.exe -decode: Sysmon EventID 1 CommandLine -decode argümanı
- wmic shadowcopy delete: Sysmon EventID 1 + parent process anomalisi
- mshta.exe http URL: Process başlatma + ağ bağlantısı korelasyonu
- rundll32.exe komşu DLL: PE analizi + imzasız DLL yükleme tespiti
Ikincil Odak Noktasi
Bu bölümde öne çıkan çekirdek kavram host.name olarak verilir. Elastic EQL ile ransomware pre-encryption çok adımlı tespit. Credential dump'tan VSS silmeye kadar zincir: sequence by host.name with maxspan=2h [process where event.type=="start" and (process.name=="SharpHound.exe" or process.command_line like "Invoke-BloodHound" or process.command_line like "net groupDomain Admins*")] [process where event.type=="start" and (process.command_line like "mimikatz" or process.command_line like "sekurlsa" or winlog.event_data.TargetImage like "lsass")] [process where event.type=="start" and process.name in ("PsExec.exe","PsExec64.exe","wmiexec.py") and event.code=="7045"] [process where event.type=="start" and (process.command_line like "vssadmindelete*" or process.command_line like "bcdeditrecoveryenabledno" or process.command_line like "wbadmindelete*")] Bu sorgu 2 saat içinde BloodHound → credential dump → lateral movement → VSS silme zincirini tespit eder.
Operasyonel Dogrulama ve Raporlama
Ransomware exfiltration aşamasında Rclone ve MEGAcmd gibi araçların tespiti. Double extortion modelinde veri çalma kritik bir aşamadır: import pandas as pd df_proc = pd.read_parquet('process_events.parquet') df_net = pd.read_parquet('network_events.parquet') exfil_tools = { 'rclone.exe': ['copy','sync','move','mega:','gdrive:','s3:'], 'MEGAcmd.exe': ['put','sync'], 'MEGAsync.exe': [], 'WinSCP.exe': ['/upload','/synchronize'], 'FileZilla.exe': [] } exfil_events = [] for tool, args in exfil_tools.items(): tool_procs = df_proc[df_proc['Image'].str.lower().str.endswith(tool.lower())].copy() if args: tool_procs = tool_procs[tool_procs['CommandLine'].str.contains('|'.join(args),case=False,na=False)] if len(tool_procs) > 0: tool_procs['exfil_tool'] = tool exfil_events.append(tool_procs) if exfil_events: df_exfil = pd.concat(exfil_events) df_exfil_net = df_exfil.merge( df_net[['hostname','timestamp','dst_ip','bytes_out']], on=['hostname'], how='left' ) df_exfil_net['time_diff'] = abs((df_exfil_net['timestamp_x'] - df_exfil_net['timestamp_y']).dt.total_seconds()) correlated = df_exfil_net[df_exfil_net['time_diff'] < 300] print(f'Exfil aracı korelasyonu: {len(correlated)}') print(correlated.groupby('exfil_tool')['bytes_out'].sum().sort_values(ascending=False))
Bu bölümün pratik akışı şu sırayla ilerler:
- rclone
Cikti ve Kullanım Amaci
Ransomware ailelerine göre ayırt edici pre-encryption davranış göstergeleri farklılık gösterir. Bu farklar attribution ve incident response süreçlerini hızlandırır. Örnek aile bazlı göstergeler: - Conti: Cobalt Strike + Atera RMM + rclone exfil - BlackCat/ALPHV: Rust tabanlı + ESXi hedefi + intermittent encryption - LockBit: StealBit exfil + hızlı şifreleme + self-propagating - Hive: IPConfig + tasklist + net use + Rclone + IOCS dosyalara .hive ekleme
- Conti: Atera/ScreenConnect RMM aracı + rclone + Cobalt Strike
- BlackCat/ALPHV: Rust binary + ESXi/Linux hedefi + intermittent şifreleme
- LockBit: StealBit custom exfil aracı + ağ üzerinde otomatik yayılma
- Hive: GoLang binary + .hive uzantısı + IPConfig/net use keşif
Son Kavram ve Cikis
Bu bölümde öne çıkan çekirdek kavram yayılma olarak verilir. Ransomware olayına otomatik müdahale için SOAR playbook tetikleme. Pre-encryption sinyali alındığında izolasyon ve kanıt toplama: import requests import json from datetime import datetime SOAR_URL = 'https://soar.example.com/api/v1' SOAR_TOKEN = 'your_soar_token' def trigger_ransomware_playbook(hostname, risk_score, detected_stages, analyst='SOC_AUTO'): payload = { 'playbook_id': 'PLAY-RANSOMWARE-CONTAINMENT-001', 'severity': 'critical' if risk_score >= 70 else 'high', 'title': f'Ransomware Pre-Encryption Detected — {hostname}', 'description': f'Pre-encryption IOB score: {risk_score}. Stages: {detected_stages}', 'artifacts': [ {'type': 'hostname', 'value': hostname}, {'type': 'risk_score', 'value': str(risk_score)}, {'type': 'detected_stages', 'value': json.dumps(detected_stages)} ], 'actions': [ {'action': 'isolate_host', 'target': hostname, 'priority': 1}, {'action': 'collect_memory_dump', 'target': hostname, 'priority': 2}, {'action': 'block_c2_ips', 'target': hostname, 'priority': 3}, {'action': 'notify_ir_team', 'channel': 'slack', 'priority': 4} ], 'assigned_to': analyst, 'created_at': datetime.now().isoformat() } r = requests.post(f'{SOAR_URL}/incidents', json=payload, headers={'Authorization': f'Bearer {SOAR_TOKEN}'}) print(f'SOAR incident oluşturuldu: {r.json().get("incident_id")}') return r.json() result = trigger_ransomware_playbook( hostname='WORKSTATION-042', risk_score=85, detected_stages=['1_DISCOVERY','2_CREDENTIAL_DUMP','5_VSS_DELETE'] )
Bu Egitimden Ne Kazanirsiniz?
Bu icerik, Ransomware Pre-Encryption Davranış 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: Discovery aşaması, Lateral movement, Exfiltration, Impact aşaması, certutil.exe -decode, wmic shadowcopy delete, mshta.exe http URL, rundll32.exe komşu DLL, Conti, BlackCat/ALPHV. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.