31 Ekim 2012 Çarşamba

Windows Sunucularda Gerçek Zamanlı SYN-Flood Tipi Saldırı Tespiti - Nass oluyor da oluyor?


Bu yazıda network ya da güvenlik ekibinden gereken ilgi ve alakayı bulamayan ve kendi göbeğini kendisi kesmek isteyen Windows sistem yöneticileri için özellikle SYN-Flood tipindeki saldırıları gerçek zamanlı nasıl tespit edebileceklerini anlatacağım.Daha önce ziyaret etmemiş olanlar için hatırlatayım, blogun düstur'u mümkün olduğunca "az bilineni anlatmak",bu nedenle Syn Flood nasıl bir saldırı tipidir,felsefesi nedir, hangi araçlarla yapılır gibi kolay erişilebilir bilgiler için bu linki tıklayabilirsiniz. :)

İlk paragrafta belirttiğim gibi saldırıyı gerçek zamanlı tespit etmek amacımız.Dolayısıyla

netstat -ano | find "SYN_RECEIVED"

gibi komutlar pek işinize yaramaz (bu komut ve türevlerine SYN saldırı tespit etme komutu diyenler bile var ),ağır bir saldırı anında komut satırını bile açmakta zorlanırsınız, netstat komut çıktısını almak dakikalar bile sürebilir.Bu nedenle başka bir yol izleyeceğiz, performans ölçütleri ( counters ).


Resim 1

İlk akla gelebilecek Packets Received/sec, Bytes Received/sec gibi ölçütleri kullanmamamızın nedeni bu ölçütlerin sunucu kullanımıyla doğru orantılı olarak artan değerler verecek olması.Yani bu değerlerin artması sunucunuzun saldırıya maruz kaldığı anlamına gelmez.Dolayısıyla bu değerlerin artması her zaman kafanızda "mı acaba?" sorusunu getirecektir,sunucu kaynaklarınızın kullanımıyla ilgili gerçekten doğru baseline'lar hazırladıysanız başka tabi.Bu yüzden kullanacağımız ve bize daha kesin sonuç verecek olan ölçüt TCPv4 sınıfı altındaki "Connection Failures" ölçütü. Microsoft bu ölçütün açıklamasını şöyle yapıyor;

"Servis başladığından beri başarısız olan bağlantı sayısını verir. SYN-SENT veya SYN-RCVD durumundan CLOSED durumuna geçen veya SYN-RCVD durumundan LISTEN durumuna geçen TCP bağlantıları başarısız sayılır."

SYN Flood tipindeki saldırılarda da bu olur zaten, hedef SYN bayraklı paketi alır ve soket SYN-RCVD durumuna geçer.Hedef gönderdiği SYN-ACK bayraklı paketin cevabı olarak beklediği ACK bayraklı paketi alamayınca beklemeye geçer,beklediği süre boyunca da ACK cevabını alamadığından soketi kapatır ( CLOSED ).Bu da kullanacağımız ölçütün değerini bir artırır.

Resim 2 
(http://www.faqs.org/rfcs/rfc793.html)

Normal şartlar altında bu ölçütün değerinin çok artmasını beklemeyiz. Bu ölçüt açıklamada yazdığı gibi servis başladığından yani işletim sistemi açılmasından itibaren başarısız bağlantıların sayısını tutmaya başlar,bu biraz iyi biraz kötü bir özellik. Kötü tarafı saniyede oluşan başarısız bağlantı sayısını görememeniz ve bu nedenle SYN flood saldırısı olup olmadığını önünüze Performans Monitoring uygulamasını açmadan gerçek zamanlı tespit edebilmek için biraz takla atmanız gerekmesi. Diğer bir deyişle yapmamız gereken bu ölçütün değerinin ne kadar hızlı arttığını tespit etmek.Malesef Microsoft bize ConnectionFailure/sec ya da HalfOpenConnections/sec gibi ölçütler verene kadar bunu tespit etmenin başka bir yöntemi yok.

Aşağıda eklediğim VBScript ile atılabilecek taklalardan birini örnek olarak göstermeye çalıştım. Scripti istediğiniz gibi evirebilir,çevirebilir,geliştirebilir,kullanabilirsiniz. Yaptığı iş basit,1'er saniye aralıklarla (WScript.Sleep 1000)  5 kere (numunesayisi) bu ölçütün değerini okuyup bu değerleri dizi elemanları olarak atıyor. Daha sonra saldirivarmi isimli fonksiyonda bu değerler artış göstermiş mi ve bu artış belirtilen eşik değerini (artishizi) aşıyor mu kontrol ediyor, değerler eşik değerini geçerek artıyorsa Alarm fonksiyonunu çağırıyor. Siz bu fonksiyon içine mail,sms,duman gönderme gibi yetenekler ekleyebilirsiniz.Bu scripti kullanarak en fazla 5-10 saniye içinde saldırıdan haberdar olabilirsiniz.

SynFlood_Detector.vbs
----------------------------------------------

numunesayisi=5
artishizi=1000
Dim failcount()
ReDim failcount(numunesayisi)
Set objCimv2 = GetObject("winmgmts:root\cimv2")
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colItems = objRefresher.AddEnum _
    (objCimv2, _ 
    "Win32_PerfFormattedData_Tcpip_TCPv4").ObjectSet
objRefresher.Refresh

While (True)
For i=0 to 4
    For Each objItem in colItems
failcount(i)=objItem.ConnectionFailures
Wscript.Sleep 1000
        objRefresher.Refresh
    Next
Next
If saldirivarmi(failcount)="var" Then
Alarm()
End If
Wend

Function saldirivarmi(dizi)
for y=0 to 3
If (dizi(y+1)-dizi(y))< artishizi Then
varmiyokmu="yok"
Exit For
Else
varmiyokmu="var"
End If
next
saldirivarmi=varmiyokmu
End Function

Function Alarm()
WScript.Echo "Saniyede "&artishizi&" ConnectionFailure esik degeri asildi.Muhtemel SYN Flood Saldirisi."
End Function
-----------------------------------------------------

Windows 2008 ve Syn Flood saldırıları - Nass oluyor da oluyor?
Syn Proxy'nin bilinmeyenleri - Nass oluyor da oluyor?

Hiç yorum yok:

Yorum Gönder