İçeriğe atla
0 XP 0
13 dkderinleşmeyle 14 dk60 XP7 etkinlik

DNS ve beacon izleri

Bu derste
  • Beacon aralığını ortalama, sapma ve değişim katsayısıyla ölçer, DNS alt alanlarındaki kaçırılan veriyi çözer, DGA ile tüneli ayırırsın.
  • Bu derste düzenli aralıkla tekrarlayan beacon desenini ve DNS ile veri kaçırmayı tanıyacaksın.
  • Uzun ve anlamsız alt alan adları gördüğünde ne düşüneceğini bileceksin.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +60 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Bir zararlı yazılım makineye yerleştikten sonra sahibinden haber bekler. Komuta sunucusuna düzenli aralıklarla bağlanır ve yeni bir iş olup olmadığını sorar. Bu düzenli sinyale beacon denir. Saldırgan veri çıkarmak için de çoğu kez gürültüsü az bir yol arar ve DNS bu yolların başında gelir.

fin-pc12 olayında ikisi birden var. Bu derste önce beacon desenini sayılarla ölçeceksin. Sonra DNS sorgularına gizlenmiş veriyi bulup geri kuracaksın. Ardından algoritmayla üretilen alan adlarını tünelden ayıracak, en sonda yanlış pozitifleri eleyip savunmayı kuracaksın.

Keşifİlk erişimKalıcılıkYayılmaSızdırma
İlk erişimden komuta kanalına ve veri sızdırmaya giden zincir. DNS izi her adımda birikir.

Beacon'ı ölçmek

Beacon'ın gücü düzenliliğindedir, zayıflığı da oradadır. İnsan trafiği düzensizdir. Bir sayfa açılır, birkaç saniye içinde onlarca istek gider, sonra dakikalarca sessizlik olur. Beacon ise saat gibi çalışır.

Saldırganlar bunu bildiği için aralığa titreşim (jitter) ekler. Altmış saniyelik bir aralığa yüzde yirmi titreşim, bağlantıları 48 ile 72 saniye arasına dağıtır.

Titreşim deseni bulanıklaştırır ama silmez. Yeterli sayıda bağlantıya bakınca ortalama yine altmış çevresinde toplanır. Bu yüzden kısa bir pencereye bakıp desen yok demek, erken kapatılmış bir incelemedir.

Beacon'ı birkaç ölçüyle sayıya dökersin. Birincisi bağlantılar arasındaki sürenin ortalaması ve standart sapmasıdır. İkincisi değişim katsayısıdır, yani sapmanın ortalamaya oranı. Bu oran sıfıra yaklaştıkça trafik makineleşir.

İnsan trafiğinde oran çoğu kez 1'in üstüne çıkar. Üçüncüsü taşınan baytın tekdüzeliğidir.

Komut beklemeyen bir yoklama hep aynı boyutta gider, komut geldiğinde yanıt büyür. Bağlantı sayısı ve süresi de hesaba girer. Kısa açılıp kapanan yüzlerce bağlantı yoklamayı, uzun süren tek oturum ise etkileşimli erişimi ya da veri aktarımını gösterir.

$ tshark -r web01.pcap \
    -Y 'ip.dst == 203.0.113.19 && tcp.flags.syn == 1 && tcp.flags.ack == 0 && tcp.srcport != 49871' \
    -T fields -e frame.time_epoch | awk 'NR>1{printf "%.1f\n", $1-p} {p=$1}' > aralik.txt
$ head -6 aralik.txt
62.3
56.8
64.1
61.7
58.3
61.9
$ awk '{s+=$1; q+=$1*$1; n++} END {o=s/n; sd=sqrt(q/n-o*o); printf "n=%d ort=%.1f sapma=%.1f cv=%.2f\n", n, o, sd, sd/o}' aralik.txt
n=53 ort=60.0 sapma=6.8 cv=0.11
İlk komut ardışık bağlantılar arasındaki süreyi, ikincisi bu sürelerin özetini yazar. cv değişim katsayısıdır.

Komutları satır satır oku. Süzgeç yalnız bağlantıyı açan ilk paketi seçer: SYN işaretli, ACK işaretsiz. Böylece her bağlantı bir kez sayılır.

Son koşul 49871 portundan açılan uzun oturumu dışarıda bırakır. O oturum ilk yoklamayla aynı saniyede açıldı ve ölçüme girerse sıfıra yakın sahte bir aralık üretir. frame.time_epoch zamanı saniye cinsinden tek bir sayı olarak verir. İlk awk ardışık iki zaman arasındaki farkı yazar.

İkinci awk bu farkların sayısını, ortalamasını, standart sapmasını ve değişim katsayısını hesaplar. Sonuç 53 aralık, ortalama 60,0 saniye, sapma 6,8 saniye ve 0,11 katsayıdır. Aynı hesap bir kullanıcının tarayıcı trafiğinde çoğu kez 1'in üstünde çıkar. Yüzde yirmi titreşimli, altmış saniyelik bir beacon için beklenen değer de 0,11 dolayındadır.

Zamanlamayı bağlamıyla okursun. Gece üçte, kullanıcı oturumu kapalıyken düzenli bağlantı kuran bir iş istasyonu, gündüz aynı deseni kuran bir sunucudan çok daha şüphelidir.

Bazı kanallar saniyelerle değil saatlerle ölçülen aralıklarla yoklar ve bir saatlik kayıtta yalnız bir kez görünür. Böyle bir kanalı tam paket kaydından değil, günlerce saklanan akış kaydından ya da conn.log arşivinden yakalarsın. İnceleme penceresini, aradığın aralığın en az birkaç katı uzunlukta seçersin.

Etkinlik 1 / 7

Aşağıdaki bağlantı zamanları hangi davranışa işaret eder?

Önce kodu oku, sonra çıktıyı seç.

03:09:02  10.20.30.61 -> 203.0.113.19:443  1412 bayt
03:10:04  10.20.30.61 -> 203.0.113.19:443  1408 bayt
03:11:01  10.20.30.61 -> 203.0.113.19:443  1414 bayt
03:12:05  10.20.30.61 -> 203.0.113.19:443  1410 bayt

DNS'te veri kaçırma

DNS tarafı ayrı bir kapı açar. Zararlı yazılım her yoklamada alan adını çözer. Bu yüzden DNS kaydı, şifreli kanal görünmese bile hedefi verir. Aynı protokol veri taşımak için de kullanılır.

Veri parçalara bölünür, onaltılık ya da Base32 ile kodlanır ve alt alan adına yazılır. Sorgu kurumun çözümleyicisinden dışarı çıkar ve alan adının yetkili sunucusuna ulaşır. O sunucu saldırganındır ve sorguyu okur.

Yanıtın içine komut da koyabilir. DNS'e çoğu ağda izin verildiği için bu kanal güvenlik duvarına takılmaz.

Protokolün sınırları kanalın izini de belirler. RFC 1035'e göre bir etiket en çok 63 bayt, bütün ad en çok 255 bayt olabilir. Bu yüzden veri çok sayıda sorguya bölünür ve tek bir ana alanın altında yüzlerce benzersiz alt ad belirir. Sorgu tipi de ipucu verir.

A ve AAAA sorguları sıradandır. TXT ve NULL kayıtları yanıtta daha çok veri taşır, bu yüzden tünel araçları onları sever. Kurum ortalamasının çok üstünde TXT sorgusu yapan bir istemci incelemeyi hak eder. Zeek'in dns.log dosyası bu sayımları kolaylaştırır.

$ zeek-cut query < dns.log | sort -u | awk -F. '{print $(NF-1)"."$NF}' \
  | sort | uniq -c | sort -rn | head -3
    797 cdn-update-srv.example
     41 altaykargo.example
     12 telemetri.example

$ zeek-cut query qtype_name rcode_name < dns.log \
  | awk '$1 ~ /cdn-update-srv\.example$/ {print $2, $3}' | sort | uniq -c
     56 A NOERROR
    796 TXT NOERROR
İlk komut ana alan başına benzersiz ad sayar. İkincisi şüpheli alana giden sorguları tipe ve yanıt koduna göre ayırır.

Çıktıyı satır satır oku. İlk komut her benzersiz adı bir kez alır ve son iki etiketine, yani ana alana göre sayar. cdn-update-srv.example altında 797 farklı ad var, kurumun kendi alanı altında yalnız 41. Dışarıdaki bir alanın altında bu kadar çok ad olması tek başına tuhaftır.

İkinci komut o alana giden sorguları tipine ve yanıt koduna göre sayar. Ad ilk sütunda durduğu için eşleşmeyi awk o sütunda yapar. 56 A sorgusunun çoğu, beacon'ın her yoklamada adı yeniden çözmesidir.

796 TXT sorgusu ise her biri başka bir alt ad taşıyan kaçırma trafiğidir. Hepsinin NOERROR alması, yetkili sunucunun bu sorguları beklediğini ve yanıtladığını gösterir.

Etkinlik 2 / 7

Onaltılık kodlanmış alt alan taşıyan DNS sorgularını yakalayan düzenli ifade yaz.

Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.

a3f9c1.veri.cdn-update-srv.example eşleşmedi
b7d200.veri.cdn-update-srv.example eşleşmedi
www.altaykargo.example eşleşmedi
guncelleme.altaykargo.example eşleşmedi
4e8b0f.veri.cdn-update-srv.example eşleşmedi

Düzenli ifade tek başına yetmez. Bu kanalda saldırgan altı karakterlik kısa etiketler seçmiş. Kısa etiket daha çok sorgu üretir, ama uzunluk eşiğine takılmaz. Yalnız etiket uzunluğuna bakan bir kural bu yüzden bu kanalı kaçırır.

Uzunluğu, ana alan başına benzersiz ad sayısını ve sorgu tipini birlikte ölçersin. Sorguların gün içine nasıl dağıldığına da bakarsın. Hepsi aynı yöne işaret ediyorsa kanıt güçlenir.

Etkinlik 3 / 7

İç ağdaki bir istemci bir saatte aynı alan adının 200 farklı alt alanını sorguluyorsa ilk şüphen ne olur?

Parçaları birleştirmek ve DGA'yı ayırmak

Kaçırılan veriyi geri kurmak, olayın etkisini ölçer. Sorguları zamana göre sıralar, ana alanı ve sabit ara etiketi atar, kalan onaltılık parçaları uç uca eklersin. Sonra onaltılıktan bayta çevirirsin.

Gerçek araçlar parçalara sıra numarası da koyar, çünkü sorgular yolda sıra değiştirebilir. Bu kanalda ilk dokuz etiket bir dosya adını taşıyor, aşağıdaki komut ilk beşini çözer. Ardından gelen a3f9c1 gibi etiketler dosyanın sıkıştırılmış içeriğidir. Onları da aynı yolla birleştirir, ayrı bir dosyaya yazar ve özetini alırsın.

$ zeek-cut ts query < dns.log | grep '\.veri\.cdn-update-srv\.example$' \
  | sort -n | cut -f2 | cut -d. -f1 | head -5
6d7573
746572
695f6c
697374
657369

$ zeek-cut ts query < dns.log | grep '\.veri\.cdn-update-srv\.example$' \
  | sort -n | cut -f2 | cut -d. -f1 | head -5 | tr -d '\n' | xxd -r -p; echo
musteri_listesi
sort -n sorguları zamana göre dizer. xxd -r -p onaltılık metni bayta çevirir.

Etkinlik 4 / 7

Sıradaki dört etiket 5f3230, 32362d, 30392e ve 637376. Uç uca eklenmiş hâllerini çöz ve dosya adının kalanını bul.

Araçları sırayla dene. Yanlış araç bozuk çıktı verir.

5f323032362d30392e637376

Çözdüğün ad, raporun en önemli satırlarından biridir. Dışarı çıkan dosya bir müşteri listesi, yani kişisel veri taşıyor. 6698 sayılı Kanun'un 12. maddesi, kişisel verilerin hukuka aykırı yollarla başkalarınca elde edilmesi hâlinde veri sorumlusunun bunu en kısa sürede ilgiliye ve Kurula bildirmesini ister.

Hangi verinin ne zaman ve ne kadar çıktığını senin analizin belirler. Kayıt dışarı çıkan her parçayı taşıdığı için bu hesap tahmine değil, ölçüme dayanır.

Her tuhaf DNS deseni veri kaçırma değildir. Algoritmayla üretilen alan adları (DGA, T1568.002) başka bir sorunu çözer. Zararlı yazılım her gün tarihe ya da bir tohuma göre yüzlerce ad hesaplar. Saldırgan bunlardan yalnız birkaçını kaydeder.

Savunucu bir adı engellese bile ertesi gün başka bir ad devreye girer. Kayıtta iki desen birbirinden ayrılır. DGA'da ana alan adlarının kendisi rastgeledir ve çoğu sorgu NXDOMAIN, yani böyle bir ad yok yanıtı alır. Tünelde ise tek bir ana alan vardır, altında çok sayıda alt ad durur ve sorgular yanıt alır.

Adın rastgeleliğini karakter entropisiyle de ölçersin. İnsanların seçtiği adlar okunur hecelerden oluşur. DGA adları harfleri daha eşit dağıtır. Ama sözlükten kelime birleştiren DGA'lar bu ölçüyü atlatır, bu yüzden entropi tek başına karar vermez.

Etkinlik 5 / 7

Her gözlemi daha çok hangi desene uyduğuna göre ayır.

Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.

0/6 seçenek yerleşti.

Yanlış pozitifleri ayıklamak ve savunma

Tespit kuralını yazarken önce beyaz listeyi kurarsın. Yazılım güncelleme istemcileri, telemetri araçları ve güvenlik ürünleri de düzenli yoklar. Bazı güvenlik ürünleri dosya itibarını DNS üzerinden, uzun ve rastgele görünen alt adlarla sorar. Ayrımı adın görünüşü değil, ana alanın sahibi ve sorguyu yapan süreç yapar.

Alan adının kayıt tarihine de bakarsın. Birkaç gün önce kaydedilmiş ad, saldırı altyapısının klasik işaretidir. Üç hata sık yapılır: düzenli yoklamayı her zaman kötü saymak, kısa pencereye bakıp desen yok demek ve titreşimi gerçek rastgelelik sanmak.

Savunma DNS'i tek bir noktadan geçirmekle başlar. İç istemciler yalnız kurum çözümleyicisini kullanır. Dışarı giden 53 ve 853 portlarını kapatır, tarayıcıların DoH ayarını kurum çözümleyicisine yönlendirirsin. Çözümleyicideki RPZ, yani yanıt politikası bölgesi, bilinen kötü alanlara yanıt vermez.

Sysmon'un 22 numaralı olayı DNS sorgusunu yapan süreci kaydeder. Böylece ağdaki sorguyu uç noktadaki süreçle birleştirirsin. Çözümleyici günlüğünü de uzun saklarsın.

Sorgu kayıtları küçüktür ve aylarca tutmak ucuzdur. Geriye dönük av çoğu kez bu arşivle sonuç verir.

PS> $e = Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=22} |
>>   Where-Object Message -like '*veri.cdn-update-srv*' | Select-Object -First 1
PS> ($e.Message -split "`r?`n") -match '^(UtcTime|ProcessId|QueryName|QueryStatus|Image):'
UtcTime: 2026-09-14 00:21:47.338
ProcessId: 4980
QueryName: a3f9c1.veri.cdn-update-srv.example
QueryStatus: 0
Image: C:\Users\Public\svcupd.exe
Sysmon olay kaydından 22 numaralı DNS olayı. İletinin yalnız gereken satırları süzüldü.

Çıktıyı satır satır oku. İlk komut Sysmon günlüğünde 22 numaralı olayları alır ve iletisinde şüpheli alan geçen ilk kaydı seçer.

İkinci komut iletiyi satırlara böler ve beş alanı süzer. QueryName sorgulanan alt adı, Image sorguyu isteyen süreci verir. ProcessId 4980, bellek analizinde bulunan svcupd.exe süreciyle aynıdır.

QueryStatus 0, sorgunun hatasız tamamlandığını söyler. UtcTime alanı UTC'dir, Türkiye saatine çevirmek için üç saat eklersin. Ağ kaydı sorgunun ne zaman ve nereye gittiğini, Sysmon ise kimin sorduğunu söyler.

Derinleş:RITA beacon puanı nasıl hesaplanır

Beacon avını elle yapmak yavaştır. Açık kaynak RITA aracı bu işi Zeek günlükleri üzerinde otomatik yapar. Güncel 5.x sürümü her kaynak ve hedef çifti için 0 ile 1 arasında bir beacon puanı üretir.

Puan dört alt puanın ağırlıklı toplamıdır. Zaman puanı, bağlantılar arası sürelerin çarpıklığına ve ortanca mutlak sapmasına bakar. Aralıklar ne kadar simetrik ve dar dağılıyorsa puan o kadar yükselir.

Veri boyutu puanı aynı ölçüleri taşınan bayta uygular. Histogram puanı bağlantıların yirmi dört saate nasıl yayıldığını ölçer. Süre puanı ise çiftin gün içinde kaç saat boyunca tutarlı biçimde görüldüğüne bakar.

Ağırlıklar yapılandırma dosyasından değişir. Bu tasarımın önemli bir sonucu var. Titreşim zaman puanını düşürür, ama boyut, histogram ve süre puanları yüksek kalır. Bu yüzden titreşimli bir kanal yine listenin üst sıralarına çıkar.

Bulgularını kalıcı bir tespit kuralına çevirirsin. Kural tek bir eşiğe değil, birkaç ölçünün birlikte aşılmasına bakar. Örneğin bir saat içinde aynı ana alanın yüzden fazla benzersiz alt adını soran istemci alarm üretir. Aynı hedefe günde elliden çok bağlantıyı 0,2'nin altında bir değişim katsayısıyla açan makine de öyle.

Eşikleri önce kendi ağının geçmiş verisinde denersin. İlk hafta çıkan alarmları inceler, meşru olanları beyaz listeye ekler, sonra kuralı devreye alırsın. Saatte ya da günde bir yoklayan yavaş kanallar için aynı kuralı haftalık arşivde de çalıştırırsın.

Etkinlik 6 / 7

Doğru mu, yanlış mı?

Titreşim eklenen bir beacon kanalı zamanlama analiziyle artık tespit edilemez.

Etkinlik 7 / 7

Düzenli aralıklarla komuta sunucusunu yoklayan trafiğe ne ad verilir? ____

Bu derste bir hata mı gördün? Bildir