11 Mayıs 2021 Salı

Qradar - Port Taramaların Tespiti - Dinamik IP Liste Kullanılarak Firewall'da Engellenmesi

Merhaba Arkadaşlar,

Bu yazımızda ilk olarak, Qradar'ın WAN'da konumlandırılmış Firewallardan almış olduğu logları kullanarak port taramalarını tespit edeceğiz. Daha sonra dış IP Adreslerimizde tarama gerçekleştiren bu kaynak IP Adreslerini Qradar'da bir referans tablosuna yazacağız. Referans tablosundaki IP Adresleri potansiyel saldırganlar olduğu için bunları API ile bir text dosyasına yazacağız. Bu text sayfasını bir IIS sunucuda host edeceğiz. Son olarak da kullanmış olduğumuz Firewallda bu text i engellenmesi için Dinamik IP Adresi olarak tanımlayacağız. 

İlk aşama olarak tespit ettiğimiz port taraması gerçekleştiren kaynak IP Adreslerini Qradar'da bir reference tablosuna yazmalıyız. Bu tabloyu oluşturmak için Qradar'da 

1-Admin > 2-Reference Set Management > 3-Add

Resim-1 (Admin)

Resim-2 (Reference Set Management)

Görsellerdeki aşamaları uygulayarak, Qradar'da "Port_Scan_IP" isminde bir reference set oluşturduk.


İkinci aşamamız olan Port Taramalarının tespiti ile devam edelim. Port taraması için öncelikle bir AQL tanımladık. AQL sorgumuzun döndüğü sonucu görmek için Resim-4 ' e tıklayabilirsiniz.

Resim-4 (AQL Araması)

AQL sorgu açıklamaları:
( logsourcename(logsourceid)='--Series -------'  kaynakları kısıtlayarak sadece belirli kaynaklar olan Firewallar için sorguyu çalıştırır.
 
NOT INCIDR('10.0.0.0/8',sourceip) ise kaynak IP Adresi private IP Adresi ise hesaba katma demektir.
group by sourceip,destinationip,destinationport 

group by sourceip,destinationip,destinationport ise bir kaynaktan bir hedefe bir port için birden fazla istek olsa da bunları tekilleştirir.

AQL sorgusu:
( logsourcename(logsourceid)='--Series -------' or 
logsourcename(logsourceid)='--Series ------' ) and 
( NOT INCIDR('10.0.0.0/8',sourceip) and NOT INCIDR('172.16.0.0/12',sourceip) and
NOT INCIDR('192.168.0.0/16',sourceip) ) 
group by sourceip,destinationip,destinationport

Port Taramalarının tespiti için tek başına bu sorgumuz yeterli değildir. Bu sorgumuzu başka bir sorgu ile "AND" işlemine tabi tutmamız gerekiyor. Peki bahsetmiş olduğumuz bu diğer sorgu nasıl olmalıdır ? Aynı Kaynak IP adresinden, Aynı Hedef IP Adrese farklı portlar için geliyorsa, her istek yapılan farklı portları 10 dakika içerisinde say. 10 dakika içerisinde aynı Kaynak IP Adresinden, aynı Hedef IP Adresine 10 dakika içinde 10'dan fazla farklı port için istek gelirse bu bir port taraması şeklinde kabul edeceğiz. Bu değerleri istediğiniz gibi değiştirebilirsiniz. 

Şimdi Qradar üzerinden iki farklı sorgunun AND işlemine tabi tutulmasını gerçekleştirelim. Aşağıdaki gösterilen sıra ile Qradar GUI'sinden kuralı tanımlayabiliriz. 6.Adım ve sonrası için görsel paylaşmak yeterli olacaktır.

1-Offenses > 2-Rules > 3-Action > 4-New Event Rule > 5-Events > 
6-RuleWizard: Rule Test Stack Editor

6. adımda 2 farklı sorgu girişimizi yapabileceğimiz kısım karşımıza çıkıyor. (Resim-5)

Resim-5 (6-RuleWizard: Rule Test Stack Editor)

Rule Test Stack Editor Ekranından filter ile 2 farklı sorgumuzu ekleyeceğiz. İlk olarak AQL sorgusunun eklenebilmesi için Filter kısmına "AQL" keyword ü ile "when the event matches AQL filter query" filterini ekleyebiliriz. Daha sonra yukarıdaki AQL sorgumuzu buraya ekleyerek dış IP Adreslerimize yapılan isteklerin tespitini sağlayabiliriz. ( Resim-6 )

AQL sorgumuzu AND işlemine sokacağımız diğer sorgu için "events are seen with the same" keyword ü ile filterda arama yaparak ekleyebiliriz. Aynı Kaynak IP Adresinden aynı hedef IP Adresine 10 farklı port için 10 dakikada gönderilen istek sayısı 10 u geçerse şeklinde 2.sorumuzu düzenleyebiliriz.  (Resim-6)

Resim-6 (Sorguların Eklenmesi)



Üçüncü aşamamız ise 2 sorgunun beraber çalıştığında ürettiği sonuçları bir reference tablosuna göndermek olacaktır. Rule Wizard'da bir kez daha "next" e tıklayarak devam edebiliriz. 
Add to a Reference Set i işaretledikten sonra ilk aşamada oluşturmuş olduğumuz Reference Set olan Port_Scan_IP'yi seçebiliriz. gösterebiliriz. Burada tarama tespit edildiğinde mail gönderilmesini isterseniz Email i de işaretleyebilirsiniz. (Resim-7)


Bir süre sonra portlarımızı tarayan IP Adreslerinin Reference tablomuzda oluştuğunu görebiliriz. (Resim-8)

Resim-8 (Port_Scan_IP)



Dördüncü aşamamız olan Reference tablosundaki verilerin API ile çekilerek bir text dosyasına yazma adımlarını gerçekleştirebiliriz.
Burada öncelikle "Interactive API for Developers" tabını kullanarak, oluşturduğumuz reference set e istekte bulunarak port taraması gerçekleştiren IP adreslerini çekmeyi deneyeceğiz. (Resim-9)


Açılan sayfada soldaki sekmeden reference_data > sets > {name} kısmını açmamız gerek. (Resim-10)


Şu anda get request ile "Port_Scan_IP" reference tablosunu çekeceğimiz URL ve Headerları elde edeceğiz. Daha sonra bu URL ve Headerları Qradar API'sine erişmek için geliştireceğimiz python kodunda kullanacağız. Parametresi "name" olan kısım için "Value" olarak reference tablo ismimiz olan Port_Scan_IP'yi girebiliriz. (Resim-11


Try it out! a tıkladıktan sonra Port taraması sonucu reference tablomuza eklenen IP adreslerini "Response Body" kısmında görebilirsiniz. Request URI istek yapacağımız URI ve Request Header ise istek yaparken ekleyecek olduğumuz header ları göstermektedir.(Resim-12)


Python "request" package ' i kullanılarak isteğimizi yapacağımız bir koda ihtiyacımız bulunmaktadır. (Kullanacağınız dili özgürce seçebilirsiniz.) "headers" ları Dictionary olarak oluşturduktan sonra isteğimize ekleyebiliriz. "auth" ile Qradar'a login olduğumuz username password girişlerini yapabiliriz.
verify=False diyerek de sertifika trust check i disable ettik. Public ortamlardaki kullanımda asla "False" a çekilmemelidir. Aşağıdaki kod ile Qradar API'si ile haberleşerek Reference tablosunu çekebiliriz.

import requests
import re

headers = {
    'Range': 'items=0-100000',
    'Version': '12.0',
    'Accept': 'application/json',
}

response = requests.get('https://qradar/api/reference_data/sets/Port_Scan_IP', headers=headers, auth=('username', 'password'), verify=False)



Beşinci aşamamız olarak Qradar'dan fetch ettiğimiz reference tablo datasını host etmeyi konuşacağız. Bunun için ilk olarak IIS Sunucumuzu aktif hale getirelim. Aşağıda eklemiş olduğum resimdeki adımları sırasıyla uygulayarak IIS Sunucuyu enable edebilirsiniz. Internetten kolayca bulabileceğiniz adımlardır. 

Resim-13 (IIS Kurulumu 1.Adım)

Resim-14 (IIS Kurulumu 2.Adım)

Resim-15 (IIS Kurulumu 3.Adım)

Resim-16 (IIS Kurulumu 4.Adım)

Resim-17 (IIS Kurulumu 5.Adım)

Resim-18 (IIS Kurulumu 6.Adım)

Resim-19 (IIS Kurulumu 7.Adım)

Resim-20 (IIS Kurulumu 8.Adım)

Resim-21 (IIS Kurulumu 9.Adım)

Önce IIS sunucu yönetim arayüzüne erişelim daha sonra da Sites tabında gerekli düzenlemeleri yapalım. Öncelikle IIS ' de host edilecek alanı gösterelim. Bunun için ilk olarak "Default Web Site" ı silebiliriz.(Resim-24)


"Default Web Site" silindikten sonra ise host edeceğimiz text dosyasını ekleyebiliriz. Add Website diyerek ilgili işlemi yapabiliriz. (Resim-24 / Resim-25)

Resim-24

Resim-25

C:/WEB klasörüne yükleyeceğimiz bir text IIS tarafından host edilecektir. Bu sebepten üstte yazığımızı kodu biraz daha geliştirmemiz gerekecektir. Qradar çekmiş olduğumuz dataları önce bir text file a yazacağız daha sonra bu text file ı Palo Alto Firewall un anlayabileceği formata çevireceğiz ve C:/WEB klasörüne taşıyacağız. Bu işlemi sağlayan kullanabileceğimiz Python kodumuz aşağıdaki gibidir. 

import requests
import re
import time

headers = {
    'Range': 'items=0-100000',
    'Version': '12.0',
    'Accept': 'application/json',
}

x=0

while True:
    x=x+1
    print("Dongu %s" %x)
    time.sleep(43200)
    response = requests.get('https://qradar/api/reference_data/sets/Port_Scan_IP', headers=headers, auth=('username', 'password'), verify=False)
    abc=response.text
    cde=re.findall("value\":\"([0-9.]+[0-9.]+[0-9.]+[0-9.]+)", abc)
    print(cde)

    with open('response5.txt', 'w') as f:
        print(cde, file=f)

    with open('response5.txt', 'r') as infile, open('C:\WEB\index.txt', 'w') as outfile:
        data = infile.read()
        data = data.replace("[", "")
        data = data.replace("]", "")
        data = data.replace("'", "")
        data = data.replace(",", "/32\n")
        data = data.replace(" ", "")
        outfile.write(data)


Yukarıdaki script bir döngüye sokularak yarım günde bir çalışacak hale getirildi. Yani günde 2 kere Qradar ile haberleşerek dinamik listemizi güncelliyor. Bunu dilediğiniz gibi ayarlayabilirisiniz. 
Artık Firewall tarafından kullanılabilecek dinamik listemiz hazır durumda. 
http://IPAdresi/index.txt ile dinamik listemize erişebiliriz.