Ana içeriğe atla

 MCP İle canlı DFIR · saha günlüğü

Claude'a bir AIR konsolu verdim

Binalyze AIR'ı Model Context Protocol ile Claude'a bağladım; sıfır bir Windows 10'da baseline aldım, kalıcılık taktik ve teknikleri uyguladım, karşılaştırdım. Yolda birkaç şey kırıldı en çok onlardan öğrendim.

Bir SOC analistinin günü, çoğu zaman aynı ritüelle geçer: bir makinede "normal" nedir, "sapma" nedir, bunu elle kovalamak. Binalyze AIR bu işi otomatikleştiriyor ama ben bir adım daha ileri gitmek istedim. AIR'ı doğrudan Claude'a bağlarsam, forensic konsolu bir sohbet arayüzünden sürebilir miydim? Model Context Protocol (MCP) tam da bunu vaat ediyordu: bir aracı LLM'e "araç" olarak takmak. Bu yazı, o bağlantıyı kurma ve ilk gerçek drift avımı çıkarma günlüğüm.

Amaç baştan belliydi. Claude'un rolü bir katalizör olacaktı: teknik derinlik, strateji, plan stres-testi gereksiz uyarı üreten bir asistan değil, işi birlikte yürüten bir el. Ve her adımı kanıta bağlayarak ilerleyecektik; "herhalde şöyledir" yok, "bakalım öyle miymiş" var.

01 — BağlantıSessiz hatalar ve iki konsol

MCP server'ı bir iç ağ appliance'ına bağlamak, tek satırlık bir iş değil ama karmaşık da değil: base URL, API token, self-signed sertifika güveni ve org scope. Bunları oturttuğunda bağlantı birkaç dakikada geliyor. Zor olan bağlanmak değildi bağlantıya güvenmekti.

Çünkü hatalar sessizdi. Profiller oluşturdum, Claude "Successfully created" döndürdü; ama listeyi çektiğimde profiller ortada yoktu. Dakikalar önce sorunsuz çözülen bir profil UUID'i birden 404 vermeye başladı. İlk içgüdü "konnektör bozuldu" demekti. Bozulmamıştı. İki şey aynı anda doğruydu: varsayılan list çağrısı, organizationIds=0 açıkça verilmedikçe yalnız System nesnelerini döndürüyordu ve beni asıl yakalayan, oturumun ortasında konnektörün sandığımdan farklı bir AIR instance'ına bakıyor olmasıydı. Ortamda iki konsol vardı, .230 ve .120; "tamir ettim" sandığım an aslında konsol değiştirmiştim.

Bir LLM'e appliance sürdürdüğünde tehlikeli olan, kırmızı bir hata değil yanlış bağlama karşı verilen kendinden emin bir "başarılı"dır. Yeşil tik, doğrulama değildir.

Ders buydu ve tüm oturuma sindi: her yeşil tikin ardından "hangi konsol, hangi org?" diye sordum, ve bir "success" mesajını asla doğrulama saymadım, nesneyi UUID'iyle geri çekip teyit etmeden ilerlemedim.

nasıl yapılırBağla ve bağlamı doğrula
  1. Base URL'i şemayla ver (https://…), API token ve self-signed sertifika güvenini ayarla; ardından MCP server'ı yeniden başlat.
  2. Bağlandıktan sonra hangi konsola bağlandığını doğrula ortamda birden çok AIR instance varsa karışması an meselesi.
  3. list/get çağrılarında org'u açıkça geç (organizationIds=0); yoksa custom nesneler görünmez.
  4. Bir "success" mesajını doğrulama sayma oluşan nesneyi UUID'iyle geri çekip teyit et.

02 — KeşifClaude ne yapabiliyor?

Bağlantı gelince ilk yaptığım, yüzeyi haritalamak oldu. Rolüm AIR'da L3/L4 olduğu için araç yüzeyinin neredeyse tamamı açıktı. Ama asıl önemli olan, Claude'un bunları nasıl ele aldığıydı ve burada net bir sınır çizdik: okuma ve sorgu serbest, task atama (baseline, triage, acquisition) rutin, ama canlı endpoint'i etkileyen ve geri-dönüşsüz her şey (isolation, shutdown, uninstall, silme) önce benim onayımı istiyordu. Uygulanan fren AIR'ın izin modeli değil, "yanlışlıkla prod'u kapatma" endişesiydi.

03 — KatalogEvidence sözlüğünü tel üzerinden çıkarmak

Baseline profili tasarlamak için AIR'ın hangi artefaktları hangi kodlarla tanıdığını bilmem gerekiyordu. Ama katalog endpoint'i (/api/public/evidences) 404 döndü. Kod uydurmak DFIR'da en kötü seçenek sessizce boş bir profil üretirsin. O yüzden kodları tahmin etmedik; çalışan bir profilin cevabından okuduk.

DevTools Network — evidences ve full istekleri
Katalogu telden okumak. DevTools → Network → Fetch/XHR. UI, profil detayını çekerken full ve evidences isteklerini atıyor; cevabı kopyalayınca ham kod→etiket sözlüğü elimizde.
nasıl yapılırEvidence kataloğunu çıkar
  1. AIR konsolunda F12Network → filtre Fetch/XHR.
  2. Bir Acquisition Profile'ı aç; listede full ve evidences istekleri belirir.
  3. İlgili isteğe sağ tık → Copy → Copy response.
  4. JSON içindeki windows.evidenceList = bu instance'ın geçerli kod sözlüğü. Tahmin sıfır.

Bu adımda kavramsal bir bomba patladı ve tüm tasarımı değiştirdi: yerleşik Baseline Acquisition for Comparison profili Windows'ta 77 evidence toplar, ama compare motoru bunların hepsini diff'lemez yalnız kanonik kalıcılık/konfig setini. Toplamak ≠ diff'lemek. Bu ayrım, sonraki her kararın zeminiydi.

Kodları uydurmadım. Çalışan bir profilin cevabından okudum. DFIR'da "herhalde bu kodtur" demek, sessizce boş bir kanıt paketi üretmektir.

04 — BaselineProfili doğrulanmış kodlarla kurmak

Elimde geçerli sözlük olunca, Compare-scope disiplinini uygulayan bir profil tasarladık: win_client_core 9 çekirdek kalıcılık kodu (registry run, scheduled task, service, startup, drivers, installed apps, firewall, network adapter, hosts). Windows 7/10/11'de eksiksiz dolu olacak şekilde versiyon-farkındalıklı. Her kodu, çektiğimiz katalogla tek tek eşleştirdik bir varsayımım (crtnh'yi "sertifika deposu" sanmıştım) katalog sayesinde düzeldi; meğer "Cortana History"miş.

nasıl yapılırBaseline profilini MCP ile oluştur ve doğrula
  1. Seçtiğin her kodun katalogda gerçekten var olduğunu doğrula (typo/hayali kod = sessiz hata).
  2. create_acquisition_profile ile profili yarat, organizationIds:["0"] ver.
  3. Oluşturduktan sonra profili UUID'iyle get_acquisition_profile_by_id ile çek; evidence sayısı gönderdiğinle bire bir tutmalı.
TuzakorganizationIds=0. Varsayılan list_acquisition_profiles çağrısı yalnız System profillerini döndürüyor; custom profillerin "kayboluyor". Org parametresini açıkça vermezsen "profilim nerede?" paniğini yaşarsın. Bu tek satır, saatlerimi kurtardı.

05 — AvCanlı drift: T0 → değişiklik → T1 → compare

Sıra gerçek işe geldi. Sıfır kurulmuş bir Windows 10'a (temiz referans için ideal) baseline aldım, kontrollü kalıcılıklar ektim, tekrar aldım ve karşılaştırdım. Kalıcılıkları ATT&CK'e temiz eşleşecek şekilde seçtim: bir Run key (T1547.001), bir scheduled task (T1053.005), bir servis (T1543.003).

Tuzaksc = Set-Content. Servisi PowerShell'de sc create … ile kurmaya çalışınca hata aldım çünkü PowerShell'de sc, Set-Content cmdlet'inin alias'ı. Çözüm sc.exe ya da native New-Service. Küçük bir detay ama tespit açısından öğretici: alias'lar komut-satırı telemetrisini saptırır.
nasıl yapılırBaseline drift turunu koştur
  1. create_case → bir case aç (baseline task caseId ister).
  2. acquire_baselineT0 temiz referansı al; get_task_by_id ile Completed olduğunu doğrula.
  3. Makinede kontrollü kalıcılıkları ek (Run key + scheduled task + service).
  4. acquire_baselineT1 drift sonrası snapshot.
  5. İki baseline'ı karşılaştır. (Bende bir engel çıktı devamı aşağıda.)

Ve işte dürüst bir başarısızlık: MCP üzerinden compare_baseline, doğru task ID'leriyle bile response.result.map is not a function parse hatası verdi. Wrapper defekti. Kör "oldu" demek yerine olduğu gibi yazdım envanterime: compare — UI-only, MCP kırık. Karşılaştırmayı AIR arayüzünden çalıştırdım (DRONE differ), ve rapor açıldı.

06 — Sonuç532 deltadan 3 IOC'ye

Rapor açıldığında ilk gördüğüm sayı ürküttü: 445 Added / 52 Changed / 35 Deleted. Sıfır bir makine, bir saatlik pencerede 500'den fazla delta üretmişti. Benim üç kalıcılığım bu yığının içinde, sinyal oranı yaklaşık %0.7. İşte SOC'un asıl dersi burada: ham diff seni boğar; değer, gürültüyü ayıklamakta.

445
Added
52
Changed
35
Deleted
3
Gerçek IOC · ~%0.7

Sinyali gürültüden ayıran şey metadata oldu. Eklenen Run key kaydını açtığımda, detection mantığını doğrudan kuracağım alanlar oradaydı: dosya yok (file_exists:0), imzasız, ve C:\Users\Public altında dünya-yazılabilir bir staging dizini. Meşru bir Run key imzalı ve Program Files altında olur. 

UpdaterSvc Run key — unsigned, file_exists:0, Public path
Metadata IOC'yi ele veriyor. UpdaterSvcbeacon.exe: imzasız, dosya yok, kullanıcı-yazılabilir path. Her satır bir kırmızı bayrak.
Scheduled Tasks diff ve özet
Gürültünün anatomisi. Scheduled Tasks: 2 Added / 31 Changed. O 31 değişiklik neredeyse tamamen timestamp churn sinyal yalnız 2 ekleme.

Ama raporun asıl yıldızı beklemediğim yerden geldi: PowerShell ConsoleHost History. Differ, operatörün tam komut satırlarını yakalamıştı attribution, tradecraft, niyet. Dahası, başarısız sc create denemelerimi bile yakaladı. O başarısız komutlar hiçbir servis, hiçbir başka artefakt bırakmamıştı; ama niyet PSReadLine dosyasında duruyordu. Komut-satırı telemetrisinin neden vazgeçilmez olduğunun canlı kanıtı.

PowerShell ConsoleHost History — başarısız sc create dahil
Niyet, eylem başarısız olsa bile kalır. PSReadLine ConsoleHost_history, başarısız sc create dahil tüm komutları yakaladı.

Bir de adjudication dersi vardı: rapor, planlamadığım "korkutucu" kayıtlar da gösterdi yeni bir Credential Provider GUID'i, bir shell context-menu handler'ı. İkisi de meşru Windows bileşenleri, ilk-boot'ta kaydolmuş. Analistin görevi tam da bu: her korkutucu satırı IOC ilan etmemek, doğrulamak. "Neyin olmadığı" da bir o kadar önemliydi Users, Hosts, Network Adapters hepsi "No differences", yani yeni hesap yok, C2 redirect yok. Bu, olayın kapsamını daraltıyordu.

Ham diff seni boğar. 532 delta karşısında bir analistin işi, gürültüyü elemek ve metadata ile 3 IOC'yi çekmektir. Araç toplar; yorumlayan sensin.

07 — DerslerKırılanlardan öğrendiklerim

Bu yolculuğun en değerli kısmı, düzgün çalışan kısımları değil, kırılan kısımlarıydı. Çoğu eğitim ve demo happy-path gösterir; oysa gerçek saha, tuzaklarla dolu. Bende çıkan liste kısaca şöyle: https:// şeması olmadan MCP bağlanmaz; organizationIds=0 verilmeden custom profiller görünmez; PowerShell'de sc bir alias'tır; compare_baseline bu sürümde MCP'den kırık; ve en kavramsal olanı toplamak diff'lemek değildir.

LLM'i DFIR'a bağlamak, sihirli bir "her şeyi çöz" düğmesi değil. Onu değerli kılan şey, hızlı sorgulama-korelasyon-doğrulama döngüsü ve her adımı kanıta bağlama disiplini. Kod uydurmadık, katalogdan okuduk. "Oldu" demedik, listeyle teyit ettik. Compare kırılınca gizlemedik, envantere yazdık. Bir aracı bir modele bağlamak kolay; onu dürüstçe kullanmak asıl iş.

Ve itiraf edeyim: sıfır bir Windows 10'un, bir saatte 500 delta üretip içinde 3 gerçek IOC sakladığını canlı görmek bir SOC eğitiminde saatlerce anlatabileceğim her şeyi tek bir ekrana sığdırdı. Ayakları yere basan lab budur.


Bu yazı, Binalyze AIR'ın MCP üzerinden Claude'a bağlandığı canlı bir DFIR oturumunun günlüğüdür. Kodlar ve kalıcılık örnekleri kontrollü bir lab ortamında, zararsız placeholder binary'lerle çalıştırılmıştır.

Session 01 · endpoint DESKTOP-VEVC2BO · Windows 10

Yorumlar

Bu blogdaki popüler yayınlar

  Splunk'ı Claude'a Bağlamak   Yapay zekâ bir SIEM'in içine girdiğinde ne olur? Doğal dil ile indeks sorgulama, sourcetype keşfi ve canlı healthcheck, gerçek bir lab ortamından notlar. *   Giriş: "Terminal Yorgunluğu" ve Bir Fikir   SOC'de yeterince yıl geçirdikten sonra fark edersiniz: asıl yorgunluk alarm sayısından değil, bağlam değiştirme maliyetinden gelir. Splunk'ta bir sorgu açarsınız, sonucu analiz edersiniz, başka bir sekmeye geçersiniz, tekrar dönersiniz. Bu döngü saatlerce sürer. Bir gün şunu düşündüm: Splunk'a doğal dil ile konuşabilsem ne olurdu? " Son 24 saatte 4625 eventlerini getir, system kullanıcılarını dışla " diyebilsem? Cevap, Model Context Protocol (MCP) ile geldi. Bu makale o serüveni anlatıyor, kurulumdan, canlı ortamdaki gerçek bulgulara kadar.   MCP Nedir? Neden Önemli?   MCP (Model Context Protocol), büyük dil modellerini dış araçlara ve veri kaynaklarına bağlayan açık bir standarttır. Anthro...
  Claude Desktop ile XSOAR Entegrasyonu: CortexSynapse MCP Sunucusunun Sıfırdan Devreye Alınması Bir Vaka Çalışması – Kâmil AKDAĞ, MSc Bu makale, Cortex XSOAR 6.13'ün, CortexSynapse açık kaynak MCP sunucusu üzerinden Claude Desktop'a bağlanması; süreç boyunca karşılaşılan üç ardışık entegrasyon hatasının teşhisi ve kalıcı çözümünü içerir. TL;DR (Çok Uzun; Okumadım) Cortex XSOAR'ı Claude Desktop'a MCP üzerinden bağlamak için CortexSynapse Docker imajını kullanırken üç farklı sorunla karşılaşıldı: SSL sertifika doğrulama hatası: Yanlış env değişkeni ismi ( XSOAR_VERIFY_SSL yerine kodda VERIFY_SSL bekleniyor). HTML 303 redirect cevapları: XSOAR_API_URL değerinin sonundaki / çift slash'a yol açıp XSOAR'ı API yerine UI'ya yönlendiriyor. HTTP 400 "string into Go value" hatası : MCP sunucusunun istek body'sini double-encode etmesi; codegen tarafından üretilen üç dosyada json=body yerine json=(json....
AI Entegrasyonlarında Güvenlik Riski   Bir geliştirici yeni bir Claude Desktop eklentisi keşfediyor. Kuruyor, config'e ekliyor, uygulamayı yeniden başlatıyor. Birkaç saniye içinde saldırgan sistemin tam kontrolünü ele geçiriyor, hiçbir tıklama, hiçbir onay gerekmeden. Bu makale, tam olarak bunun nasıl gerçekleştiğini anlatıyor. MCP protokolü yapay zekaya gerçek dünya ile etkileşim gücü verirken, her yeni bağlantı noktası potansiyel bir saldırı vektörü haline gelir ve sadece “veri sızıntısı” tehdidi ile karşı karşıya kalmazsınız. MCP’yi Anlamak Anthropic tarafından geliştirilen Model Bağlam Protokolünün sitesinde yer alan tanımı şöyledir: Bugün, yapay zekâ asistanlarını içerik depoları, iş araçları ve geliştirme ortamları da dahil olmak üzere verilerin bulunduğu sistemlere bağlamak için yeni bir standart olan  Model Bağlam Protokolü'nü  (MCP) açık kaynaklı hale getiriyoruz. Amacı, öncü modellerin daha iyi ve daha alakalı yanıtlar üretmesine yardımcı olmaktır [1] ...