Showing posts with label Suricata. Show all posts
Showing posts with label Suricata. Show all posts

Wednesday, September 7, 2016

Suricata "Content" Parametresi

Suricata saldırı tespit/engelleme sistemi -beklendiği üzere- şifrelenmemiş paketlerin "veri" (payload) kısmına da bakarak saldırı örüntülerini (pattern) tespit edebilmektedir.
 
Bu tespitleri yapabilmek için Suricata imzalarında bir "content" alanı bulunmaktadır. Bu yazımızda Suricata imzalarındaki "content" alanıyla ilgili bilgi vermeye çalışacağız.
 
Öncelikle içeriğinde "content" geçen rastgele bir örnek imza aşağıda verilmiştir:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET USER_AGENTS Lowercase User-Agent header purporting to be MSIE"; flow:established,to_server; content:"user-agent|3a 20|Mozilla/4.0|20|(compatible|3b 20|MSIE|20|"; http_header; content:!"|0d 0a|VIA|3a 20|"; http_header; classtype:trojan-activity; sid:2012607; rev:4;)

Örnekten de görülebileceği gibi bir Suricata imzasının içerisinde birden fazla "content" alanı da olabilmektedir.
 
"content" parametresiyle, gelen paketin veri (payload) kısmında aranacak harf-rakam kombinasyonunun tırnak içerisine yazılması gerekiyor. Örneğin Suricata imzasında content:"SALDIRIYORUM ULEYYNNN!!" yazmış olduğunuz takdirde Suricata, gelen paketlerin veri kısımlarında "SALDIRIYORUM ULEYYNNN!!" içeriği olan paketleri tespit edecektir.
 
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"YABAN SALDIRISI!!!"; flow:established,to_server; content:"SALDIRIYORUM ULEYYNNN!!"; classtype:yaban-activity; sid:2222220; rev:3;)
 
"content" parametresinin içerisine harflerin, rakamların ya da özel karakterlerin hexadecimal karşılıkları da yazılabilmektedir.

Suricata imzasının içerisine yazacağımız; content: "|53 41 4c 44 49 52 49 59 4f 52 55 4d 20 55 4c 45 59 59 4e 4e 4e 21 21|" ile content:"SALDIRIYORUM ULEYYNNN!!" aynı anlama gelmektedir. Harflere karşılık gelen hexadecimal değerler aşağıda verilmiştir.
S = 53, A =41, L = 4c, D = 44, I = 49, R = 52,I = 49, Y = 59, O = 4f, R = 52, U = 55, M = 4d, = 20, U = 55, L = 4c, E = 45, Y = 59, Y = 59, N = 4e, N = 4e, N = 4e, ! = 21, ! = 21
Normal karakterler iki adet "<örnek>" (tırnak) arasına yazılırken, hexadecimal karakterler iki tane |<örnek>| (pipe) arasına yazılmaktadır.

Bazı karakterler imzanın okunmasında karışıklığa yol açtıklarından dolayı bu karakterleri Suricata imzasının içerisine iki tırnak arasına yazmak mümkün olmamaktadır. Bu karakterleri imzanın içerisine mutlaka hexadecimal olarak yazmak gerekmektedir. Bu karakterler ve hexadecimal karşılıkları aşağıda verilmiştir:
" = |22|
; = |3B|
: = |3A|
| = |7C|
Buna bir örnek vermek gerekirse; Suricata imzasının içerisine content:"http://" yazılamamaktadır. Bunun yerine content:"http|3A|//" yazılabilmektedir. 
"content" parametresinin içeriği büyük-küçük harf duyarlıdır. Yani content:"SALDIRIYORUM ULEYYNNN!!" ile content:"saldiriyorum uleyynnn!!" aynı anlama gelmemektedir. Büyük-küçük harf duyarlılığımı iptal etmek için imzanın içerisinde "nocase" parametresinin kullanılması gerekmektedir.
 
Örneğin; content:"SALDIRIYORUM ULEYYNNN!!"; nocase; ile content:"saldiriyorum uleyynnn!!"; nocase; aynı anlama gelmektedir.
Peki bir Suricata imzası içinde iki adet "content" parametresi olması durumunda Suricata nasıl davranmaktadır? Öncelikle bu, anlaması biraz zor bir algoritmaya dayanmaktadır. Bu algoritmanın ayrıntılarına girmeyeceğiz. Genel olarak; "content" parametresi içerisindeki "daha uzun" (longer) ve "en çok değişen" (varied) harf/rakam kombinasyonları tercih edilmektedir.
 
Örneğin: Suricata imzası içerisinde content:"SALDIRIYORUM ULEYYNNN!!" ve content:"YAKALA oni!" parametrelerinin bulunduğunu kabul edelim. Birinci "content"in içerisinde 23 karakter bulunmakta, ikinci "content"in içerisinde de 11 karakter bulunmaktadır. Bu durumda Suricata content:"SALDIRIYORUM ULEYYNNN!!" parametresine öncelik verecektir.
 
"En çok değişen" kavramına da bir örnek vermeye çalışalım: content:"SALDIRIYORUM ULEYYNNN!!" ile content:"S|41|LD|49|R|49|YORUM ULEYY|4E||4E||4E|!!" arasında bir karar verilmek istenmesi durumunda Suricata content:"S|41|LD|49|R|49|YORUM ULEYY|4E||4E||4E|!!" parametresini tercih edecektir. Çünkü ikinci "content"in bizim tabirimizle "değişen parçaları" daha fazladır. (|41|, |49| vb...)

Suricata imzalarında "daha az değişen" veya "daha kısa" olan değişkenlere öncelik vermek istediğimiz takdirde de "fast_pattern" adlı parametreyi kullanmamız gerekmektedir. Örneğin, Suricata'ya daha uzun ve değişeni daha çok olan content:"SALD|49|R|49|YORUM ULEYY|4E||4E||4E|!!" yerine daha kısa ve değişeni olmayan content:"az bi dakka!" parametresini tercih ettirmek istiyorsak bunların imzanın içerisine aşadaki gibi yazılması gerekmektedir:
content:"SALD|49|R|49|YORUM ULEYY|4E||4E||4E|!!"; content:"az bi dakka!"; fast_pattern;
 
(İki adet "en çok değişen" ve iki adet "daha uzun" parametrelerine sahip olan "content" için bkz. https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Fast_Pattern_Determination_Explained)
 
Suricata imzasındaki "content" parametresi http trafiği için de özelleştirilmiştir. "content" parametresinin http trafiğinde nasıl kullanıldığını da başka bir yazıya bırakalım.

Friday, August 5, 2016

Suricata Rule Thresholding


Three types of threshold values can be defined in Suricata rules: limit, threshold and both. I want to make some further explanations about them because this concept may be a bit confusing.

The notation of rule thresholding in Suricata is shown below:

threshold: type <threshold|limit|both> track , count <M>, seconds <T>

type threshold
Type threshold alerts every M times we see this event during the time interval.

threshold: type threshold track by_src, count 4, seconds 360;

In the above example the rule generates "1" alarm everytime the event is met "4" times in "360" seconds.

The figure below depicts "type threshold":

type limit
Type limit alerts on the 1st M events during the time interval, then ignores events for the rest of the time interval. 

threshold:type limit, track by_src, count 4 , seconds 360;

In the above example the rule generates "4" alarms if the event is met first "4" times in "360" seconds. After the detections it doesn't generate any alarms in the rest of the 360 seconds.

The figure below depicts "type limit":
 
type both
Type both alerts once per time interval after seeing M occurrences of the event, then ignores any additional events during the time interval.

threshold:type both, track by_src, count 4 , seconds 360;

In the above example the rule generates "1" alarm if the event is met "4" times in "360" seconds. After the detection it doesn't generate an alarm in the rest of the 360 seconds.

The figure below depicts "type both":







Wednesday, January 13, 2016

Suricata'da IP İtibar (IP Reputation) Ayarlarının Yapılması

Suricata saldırı tespit/engelleme sistemi IP kara listesinde (IP blacklist) olan IP adreslerinden ya da bu IP adreslerine doğru olan trafiği de yakalayabilmektedir. Saldırı engelleme modunda kurulu ise bu trafiği engelleyebilmekte, saldırı tespit modunda ise bu trafikle ilgili alarm üretebilmektedir.
Bu yazıda, bunun için Suricata'da yapılması gereken ayarlardan bahsetmeye çalışacağım.
Suricata'nın yapılandırma (konfigürasyon) dosyası olan suricata.yaml dosyası içerisinde "IP reputation" bölümü bulunmaktadır. Bu bölümün altını değiştirerek Suricata'da IP itibar ayarları yapılmaktadır. Suricata'nın örnek bir "IP Reputation" bölümü aşağıdaki gibidir:
#IP Reputation
 reputation-categories-file: /etc/suricata/iprep/categories.txt
 default-reputation-path: /etc/suricata/iprep
 reputation-files:
  - reputation.list
IP itibar ayarı yaparken ilk önce kara listeye dahil edilecek IP adreslerinin bir sınıflandırmaya tabi tutulması gerekiyor. Bu sınıflandırmanın yer aldığı dosyanın varsayılan (default) ismi /etc/suricata/prep/ dizininde bulunan categories.txt dosyasıdır. (Dosya isimleri ya da dosya yol'u tabii ki farklı olabilir. Burada varsayılan isimler kullanılmıştır.)
categories.txt isimli dosyanın formatı aşağıdaki gibi bir CSV dosyasıdır:
root@suricata:/etc/suricata/iprep$cat categories.txt
1,HACK,Hack Siteleri
2,MP3,MP3 Siteleri
3,SPYWARE,Spyware Listesi
categories.txt dosyasının içeriğindeki satırlar "üç" bölümden oluşmaktadır:
, ,
Sınıfladırmaya öncelikle bir numara vermek durumunudayız: . Bu numara 1 ile 60 arasında olmak zorundadır. Yani IP itibar listemizde en fazla 60 kategori olabilmektedir.
Sınıflandırmaya kısa bir de isim veriyoruz: . Bu isimlerin bire bir aynısı, iprep.rules dosyasına saldırı kuralı (attacking rule) yazarken kullanılmaktadır.
Sınıflandırma için bir de açıklama yazıyoruz:
Sınıflandırma dosyasının yol'unu da suricata.yaml yapılandırma dosyası içerisinde reputation-categories-file: /etc/suricata/iprep/categories.txt şeklinde belirtiyoruz.
IP itibar ayarlarının yapıldığı dizini de yine suricata.yaml yapılandırma dosyası içerisinde belirriyoruz: default-reputation-path: /etc/suricata/iprep
Sınıflandırma dosyasının içeriğini doldurduktan sonra hangi IP adreslerinin engelleneceğini ya da hangi IP adreslerine karşı alarm üretileceğini belirlememiz gerekiyor. Bu listeyi de default-reputation-path: /etc/suricata/iprep dizinine reputation.list dosyası adıyla koyuyoruz. Bu dizinin altında birden fazla liste olabilir. badhosts.listzararli_ip.listmalware.list gibi.
reputation.list ya da benzeri dosyaların içeriği aşağıdaki gibidir:
root@suricata:/etc/suricata/iprep$cat reputation.list
63.71.76.111,1,100
66.28.56.113,1,100
210.60.141.1,1,100
24.215.5.116,1,100
83.149.65.117,1,100
85.17.73.137,2,50
216.74.109.140,2,50
64.239.80.146,2,50
198.65.238.151,2,50
195.144.11.157,3,125
abidancegubidance.com,3,125
abeedeekgubeedeek.com,3,125

reputation.list dosyası da categories.txt dosyası gibi yine bir CSV dosyasıdır ve üç alandan oluşmuştur:
, ,
Kara listemizde olan IP numarasını (216.74.109.140) ya da alan ismini (abidancegubidance.com) ilk bölüme yazıyoruz.
Daha sonra bu IP numarasının ya da alan adının sınıflandırma numarasını belirtiyoruz. Bu numara 1 ile 127 arasında olmak durumundadır.
Son alana da bu IP numarasının ya da alan adının skor değerini yazıyoruz.
Kara listedeki IP adreslerine (IP blacklist) ya da alan isimlerine birçok internet sitesinden erişilebilmekte ve bu kara listede yer alan IP adresleri/alan isimleri indirilebilmektedir. Bunlardan paralı olanlar olduğu gibi ücretsiz olanlar da mevcuttur. Bu kara listenin bir örneğine https://sslbl.abuse.ch/blacklist/ adresinden erişilebilir.
Buraya kadar categories.txt ve reputation.list dosyalarının içeriklerini belirledik. Bu dosyalar, bu halleriyle bir şey ifade etmezler. Bu dosyalar için kural(lar) yazmamız gerekmektedir. IP itibar (IP Reputation) kurallarını herhangi bir Suricata kuralı içerisine yazarsak da çalışacaktır. Fakat IP itibar kurallarını /etc/suricata/rules/iprep.rules altına yazmayı tercih ettik. Aşağıda örnek bir iprep.rules lural dosyası bulunmaktadır. (Aşağıdaki imzalar deneme amaçlı oluşturuldukları için kurallarda tutarsızlıklar olabilir.)
alert tcp any any -> any any (msg:"BU NASIL BIR TRAFIK YA? COK AYIP BU!"; iprep:any,SPYWARE,=,125;)
alert tcp any any -> any any (msg:"AHAN DA DUTDUM SENI!";iprep:dst,SPYWARE,=,125;)
alert tcp any any -> any any (msg:"HACKINGAM PALACE"; iprep:any,HACK,=,100; sid:10005; rev:1;)
alert tcp any any -> any any (msg:"HACKLEME BENI HACKLERIM SENI"; iprep:src,HACK,=,100; sid:10006; rev:1;)
alert tcp any any -> any any (msg:"NE SALDIRIYDI BE!"; iprep:dst,MP3,=,50; sid:10007; rev:1;)
alert tcp any any -> any any (msg:"YETTI GARI"; iprep:both,MP3,<,100; sid:10008; rev:1;)
Şimdi bu kural seti içerisindeki bazı satırları inceleyelim:
alert tcp any any -> any any (msg:"HACKINGAM PALACE"; iprep:any,HACK,=,100; sid:10005; rev:1;)
IP itibarı (IP Reputation) için Suricata saldırı imzasının (kuralının) içerisine iprep parametresini eklememiz gerekiyor. iprep parametresi dört alandan oluşmaktadır:
<any/src/dst/both>: Trafiğin kaynağı belirtilmektedir. Buradaki örnekte kaynak ya da hedef IP kısmında kara listedeki bir IP adresi görülürse alarm üretilmektedir.
HACK: Burada yazan ifade categories.txt dosyası içerisindeki ikinci alanın aynısı olmak zorundadır. (1,HACK,Hack Siteleri) Buradaki kural için bir sınıflandırma belirtmiş oluyoruz bu şekilde.
=,<,>: Burada reputation.list dosyasının üçüncü alanındaki değerle bir kıyaslama yapılmaktadır. (83.149.65.117,1,100) Buradaki örnekte sınıflandırma numarası "1" olan IP adresleri için geçerli bir kural vardır. Sınıflandırma numarası "1" olan IP adresinin "score" değeri de "100" olarak verilmiştir. Bu kurala denk gelen bir trafik olduğu zaman da kurada yer alan tırnak içerisindeki uyarıyı vermektedir. (HACKINGAM PALACE)
categories.txt
1,HACK,Hack Siteleri
reputation.list
83.149.65.117,1,100
Suricata kuralı
alert tcp any any -> any any (msg:"HACKINGAM PALACE"; iprep:any,HACK,=,127; sid:10005; rev:1;)
Konuyu özetleyen bir resmi de aşağıya ekliyorum:

Thursday, January 7, 2016

Suricata'nın Saldırı Trafiği Haricindeki Kayıtları Tutma(ma)sı

Suricata, beta sürümü ilk defa 2009 yılının Aralık ayında ve ilk kararlı sürümünün de 2010 yılının Temmuz ayında piyasaya sürülmüş olan açık kayaklı bir saldırı tespit/engelleme sistemi yazılımıdır. (http://suricata-ids.org) Suricata, OISF (Open Information Security Foundation) adlı bir sivil toplum kuruluşu tarafından geliştirilmiştir. (http://oisf.net)

Bu yazımızda Suricata'nın özelliklerine değinmeyeceğiz. Bu yazımızda değineceğimiz hususu aşağıya yazmaya çalıştım.

Suricata, -diğer tüm saldırı tespit sistemleri gibi- ağa gelip giden tüm trafiği dinleyecek şekilde ağ topolojisi üzerinde konumlandırılır. Saldırı tespit sistemleri, dinledikleri ağ trafiği içerisinde kendi saldırı imza veri tabanlarına (signatures) karşılık gelen trafikleri alarm (alert) oluşturacak şekilde bir kayıt (log) dosyasına yazarlar. Yani saldırıları kayıt (log) altına alırlar.
Suricata, dinlediği ağ trafiği içerisinde saldırı veri tabanıyla eşleşmeyen trafiği -yani saldırı haricindeki trafiği- de bir kayt (log) dosyasına yazabilir. Yani ağa gelip giden tüm trafiği dinliyor ve sizin seçmiş olduğunuz protokole göre bu trafiği de kayıt (log) altına alabiliyor. Örneğin herhangi bir saldırı örüntüsü içermeyen; SSH (TCP 22), HTTP (TCP 80), NTP (UDP 123), SMTP (TCP 25),... gibi trafikleri de kayıt altına alabilmektedir. Suricata bu kayıtları "json" kayıt formatında tutabilmektedir. Bu kayıt dosyasının varsayılan (default) ismi “eve.log”dur. (/var/log/suricata/eve.log)
Saldırı olmayan trafiğin kayıtlarını (log) tutmak istemiyorsak Suricata'nın yapılandırma (konfigürasyon) dosyası olan suricata.yaml dosyasının içeriğinde değişiklik yapmamız gerekmektedir. suricata.yaml dosyası içerisinde "app-layer" başlığı altındaki parametreler, saldırı örüntüsü içermeyen ağ trafiğinin dinlenmesini sağlamaktadır.
Aşağıda örnek bir suricata.yaml dosyasının "app-layer" başlığı altındaki bazı parametre değerleri gösterilmektedir. Aşağıdaki örnekte Suricata saldırı tespit sisteminin sadece SMB trafiğini eve.json isimli kayıt (log) dosyasına kaydetmesi sağlanmıştır. Bunun haricinde kalan hiçbir trafik kayıt (log) dosyasına kaydedilmemektedir. Sadece imza veri tabaındaki saldırılara karşılık gelen saldırı kayıtları (log) ve SMB trafiği kayıt (log) altına alınmaktadır.
**********
app-layer altında yapılan değişiklikler aşağıda açıklanmıştır:
  
-app-layer:
--protocols:
---tls:
----enabled: no (HTTPS trafiğinin kaydı engellenmiştir.)
----detection-ports:
-----dp: 443
---dcerpc:
----enabled: no (DCE/RPC trafiğinin kaydı engellenmiştir.)
---ftp:
----enabled: no (FTP trafiğinin kaydı engellenmiştir.)
---ssh:
----enabled: no (SSH trafiğinin kaydı engellenmiştir.)
---smtp:
----enabled: no (SMTP trafiğinin kaydı engellenmiştir.)
---imap:
----enabled: no (IMAP trafiğinin kaydı engellenmiştir.)
---msn:
----enabled: no (MSN trafiğinin kaydı engellenmiştir.)
---smb:
----enabled: yes (SMB trafiğinin kaydına izin verilmiştir.)
----detection-ports:
-----dp: 139
**********
Suricata ile ilgili olarak şimdilik bu kadar. Yukarıda yazdığım özelliği bulmak biraz vaktimi aldığı için çözümü paylaşmak istedim.