Linux Üzerinde Suricata ile IDS/IPS Kurulumu ve Rule Yazımı

louise0357

Anka Team Junior
21 Tem 2023
574
225
Medellín
m9RCVr.png


Herkese Merhaba, ben Anka Red Team'den Louise0357. Bu yazımda Linux üzerinde Suricata aracı ile nasıl IDS/IPS kurulacağını ve yapılandırılacağını ele alacağım.



iwxqmay.png


IDS (Intrusion Detection System);

IDS (Intrusion Detection System), yani Saldırı Algılama Sistemi'nin kısaltmasıdır. IDS, ağ trafiğini ve sistem loglarını izleyerek, sisteminizdeki anormal aktiviteleri kayıt tutar veya sistem yöneticisine bildirir.

IDS, herhangi bir olaya müdahele etmez. Yani örneğin sisteminizde bir saldırı var ise bu saldırıyı önlemeye çalışmaz, sadece
bunun log'unu tutar veya size bildirir.


k96aomu.png



IPS (Intrusion Prevention System);


IPS (Intrusion Prevention System), Saldırı Önleme Sistemi'nin kısaltmasıdır. IPS'yi, IDS'nin geliştirilmiş versiyonu gibi düşünebilirsiniz. IDS, sadece saldırıyı tespit etmek amacıyla tasarlanmıştır. Yani IDS Saldırıyı önlemek için herhangi
çaba içerisine girmez. Fakat IPS hem saldırıyı tespit eder, hem de bu saldırıyı engellemek için
önlemler alır.

IPS'nin saldırıyı engelleme yöntemlerinden birkaç tanesi şunlardır;

- Belirli bir IP Adresinden gelen trafiği engelleyebilir.
- Ağ trafiğini izleyerek normal trafik akışını belirleyip, anormal aktiviteleri engelleyebilir.
- Belirli komut veya içeriği içeren işlemleri algılayıp engelleyebilir.


Kısaca IDS/IPS arasındaki temel fark, IDS'nin sadece saldırıları algılayıp kayıt tutması, IPS'nin ise saldırıları hem algılayıp hem de
bunu engellemesidir.



pDHFoUY.png



Suricata Kurulumu

Kurulum için aşağıdaki adımları izleyebilirsiniz;


Adım 1,
İlk öncelikle paketlerimizi ve sistemimizi güncelleyelim:

Kod:
apt-get update && apt-get upgrade



Adım 2,
Suricata için gerekli paketleri yükleyelim:

Kod:
sudo apt-get -y install libpcre3 libpcre3-dbg libpcre3-dev build-essential autoconf automake libtool libpcap-dev libnet1-dev libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libcap-ng-dev libcap-ng0 make libmagic-dev



Adım 3,
Normalde Suricata programı varsayılan olarak IDS olarak kurulur. Biz Suricata'yı hem IDS hem de
IPS için kullanacağımızdan dolayı aşağıdaki paketleri yükleyeceğiz:

Kod:
sudo apt-get -y install libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev libnfnetlink0


Adım 4,

Şimdi ise Suricata'yı yükleyeceğiz;
Kod:
wget http://www.openinfosecfoundation.org/download/suricata-2.0.3.tar.gz
tar -xvf suricata-2.0.3.tar.gz
cd suricata-2.0.3




Adım 5,
Suricata'yı IPS olarak kullanmak için;
Kod:
./configure –enable-nfqueue –prefix=/usr –sysconfdir=/etc –localstatedir=/var

Suricata'yı IDS olarak kullanmak için;
Kod:
./configure –prefix=/usr –sysconfdir=/etc –localstatedir=/var


Adım 6,

Suricata kurulumunu tamamlamak için aşağıdaki komutları kullanacağız;
Kod:
make
sudo make install
sudo ldconfig





pDHFoUY.png




Suricata'yı Yapılandırma

İlk öncelikle "nano /etc/suricata/suricata.yaml" komutu ile Suricata
yapılandırma dosyamızı açıyoruz.

qwpxbrt.png


HOME_NET kısmını kendi ağımıza göre yapılandırıyoruz. ve daha sonra EXTERNAL_NET kısmını ise

"!$HOME_NET" Olarak ayarlıyoruz.

Daha sonra kullandığınız interface'ın ismini konfigürasyon dosyasındaki eth0 olan yerlere yazıyoruz. Çünkü
konfigürasyon dosyasında default olarak interface name eth0'dır.

İnterface name düzenlemesini yaptıktan sonra rule'larımızın çalışması için konfigürasyon dosyasında
bunların ismini cismini tanıtmamız gerekiyor.



9ke55mg.png



Burada rule'ların olduğu dizin resimde görüldüğü gibi "/var/lib/suricata/rules" imiş.


rule-file kısmında ise default olarak suricata.rules Rule'u tanımlı. fakat biz bunu yorum satırına alıp kendi Rule'larımızı

tanıtacağız. Şimdi örnek bir test Rule'u oluşturacağım. bundan dolayı rule-files kısmına resimdeki gibi test.rules yazıyorum.

Ayarlarımızı yaptıktan sonra konfigürasyon dosyasını kaydedip çıkabiliriz.




pDHFoUY.png



Suricata Rule'u Nasıl Yazılır?
IDS Rule yazımı;

Rule'ların yer aldığı dizin ( "/etc/suricata/rules" ) altında biz nano ile yeni bir Rule yazacağız.


edjmzpw.png


Şimdi belirli bir domain'e istek gider ise alert veren bir rule yazalım;

Kod:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"Zararlı bir Websiteye HTTP İsteği gönderildi"; flow:to_server, established; content:"Host|3a| zararli.com"; http_host; sid:100001; rev:1;)



burayı kısım kısım anlayalım :) ;


"alert http $HOME_NET any -> $EXTERNAL_NET any"

bu kısım rule'umuzun hangi trafiği izleyeceğini belirtir. Biz burada $HOME_NET tarafından $EXTERNAL_NET tarafına giden HTTP trafiğini izliyoruz.



"(msg:"Zararlı bir Websiteye HTTP İsteği gönderildi"; )"

bu kısımda ise rule alert verdiği zaman neden alert verildiğinin açıklamasını ifade ediyoruz.




"content:"Host|3a| zararli.com"; http_host;"

burada monitor edilecek içeriği belirtiyoruz. Biz burada HTTP Header'ının

Host field'ında zararli.com ifadesini monitor ediyoruz. Yani böyle bir durum gerçekleştiğinde alert veriyoruz.


"sid:100001; rev:1;"

Burada ise Rule'umuzun benzersiz id'sini ve versiyonunu belirtiyoruz. Bu kısım, alert durumunu etkilemeyecektir.



k96aomu.png


SSH Brute force saldırısı durumunda alert veren bir Rule daha yazarak pekiştirelim :)

Kod:
alert tcp any any -> $HOME_NET 22 (msg:"SSH Bruteforce saldırısı yapılıyor"; flow:to_server, established; content:"SSH-"; depth:5; threshold:type threshold, track by_src, count 5, seconds 60; sid:100002; rev:1;)


"alert tcp any any -> $HOME_NET 22"
bu kısımda tcp protokolünde herhangi bir kaynaktan bizim 22 portumuza gelen istekleri izliyoruz.


"msg:"SSH Bruteforce saldırısı yapılıyor";"
bu kısımda rule alert'inin açıklamasını belirtiyoruz.


flow:to_server, established;
bu kısımda bağlantı yönünü ve bağlantı durumunu belirtiyoruz. to_server ile servera giden bağlantılara ve
zaten kurulmmuş olan bağlantıları izliyoruz.



"content:"SSH-"; depth:5;"
bu kısımda SSH Headerında "SSH-" ibaresini arıyoruz ve en fazla 5 karakter derinliğinde arama yapıyoruz.



"threshold:type threshold, track by_src, count 5, seconds 60;"
bu kısımda her kaynaktan (by_src) 60 saniyede en fazla 5 SSH Brute force denemesini izliyoruz.



"sid:100002; rev:1;"
Burada ise yine Rule'umuzun benzersiz id'sini ve versiyonunu belirtiyoruz. Bu kısım, alert durumunu etkilemeyecektir.



k96aomu.png


IPS Rule yazımı;

Belirli bir websiteye giden istekleri engelleyen bir rule yazalım;
Kod:
drop http $HOME_NET any -> any any (msg:"zararli.com websitesine erişim engellendi"; flow:to_server; content:"Host|3a| zararli.com"; http_header; sid:100004; rev:1;)





"drop http $HOME_NET any -> any any"
bu kısımda bizim ağımız tarafından herhangi bir hedefe http isteği gönderilmesini engelliyoruz.




"(msg:"zararli.com websitesine erişim engellendi"; )"
bu kısımda log'a düşerken buraya girdiğimiz açıklama yazar.


"flow:to_server;"
bu kısımda bağlantının nereden nereye kurulduğunu belirtiyoruz. Burada biz server'a doğru
giden bağlantıları belirtiyoruz.



"content:"Host|3a| zararli.com"; http_header;"
bu kısımda ise HTTP Header'ına Host field içeriğini zararli.com olarak filtreleriz. Bu sayede
sadece zararli.com'a giden istekleri engelleriz.


"sid:100004; rev:1;"
bu kısımda yine aynı şekilde rule'un benzersiz id'si ve versiyonunu belirtiyoruz.



k96aomu.png



IPS Rule olayını da pekiştirmek için bu sefer SSH Brute force saldırılarını algılayıp engelleyen bir rule
yazalım.

Kod:
drop tcp any any -> $HOME_NET 22 (msg:"SSH Brute-force girişmesi engellendi"; flow:to_server; content:"SSH-"; depth:5; threshold:type limit, track by_src, count 5, seconds 60; sid:100006; rev:1;)


yine bu Rule'u mercek altına alıp inceleyelim;


"drop tcp any any -> $HOME_NET 22"
bu kısımda herhangi bir kaynaktan $HOME_NET yani bizim 22 portumuza gelen istekleri filtreliyoruz.



"(msg:"SSH Brute-force girişmesi engellendi"; )"
Bu kısımda ise istek engelleme işlemini log'a geçilirken buraya yazdığımız açıklama ile beraber geçilir.




"flow:to_server, established;"
bu kısımda ise yine belirli bir clientten bizim servera gelen istekleri ve canlı olan istekleri alıyoruz.


"content:"SSH-"; depth:5;"
bu kısımda SSH Headerında "SSH-" ibaresini arıyoruz ve en fazla 5 karakter derinliğinde arama yapıyoruz.


"threshold:type limit, track by_src, count 5, seconds 60;"
Burada ise her kaynaktan (by_src) gelen SSH brute force denemelerini 60 saniyede en fazla 5 kez izliyoruz.



"sid:100006; rev:1;"
Burada da yine rule'umuzun benzersiz id'sini ve versiyonunu belirtiyoruz.



Artık Suricata'mızı başlatabiliriz;
Kod:
systemctl start suricata

komutu ile Suricata'mızı başlatıyoruz ve artık rule'larımız çalışmaya başlayacaktır :)



pDHFoUY.png



Yazımı okuduğunuz için teşekkür ederim.
Diğer konulara göz atın;

Linux Privilege Escalation - Linpeas Toolu Kullanımı

https://turkhackteam.org/konular/sql-enjeksiyon-zafiyetini-kullanalim.2061227/
Apache 2.4.49-50 LFİ to RCE

https://www.turkhackteam.org/konular/wordpressi-taniyalim.2061212/
SQL injection attack, listing the database contents on non-Oracle databases WriteUp (Port Swigger)


kbrn6ph.png


logo.png
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.