17 Ekim 2015 Cumartesi

Python ile ilkel bir IDS/IPS Örneği

Ağ trafiğini izleyecek ve web sunucuya gelecek olan isteklerin içerisinde belirli saldırı desenlerini arayacak, bulduğu saldırı desenlerini kayıt altına alacak ve istenirse saldırıyı yapan IP adresini engelleyecek basit bir IDS/IPS sistemi uygulaması yazmıştım. Burada dursun... Belki birilerinin işine yarar..

#!/usr/bin/env python
# coding: utf-8
#----------------------------------------------------

# packet capture & decoding
import pcapy,dpkt   # bu kütüphaneleri yüklemek gerekiyor. standart python ile gelmiyorlar.
import socket, sys, os

attack_pattern='' #saldırı desenlerini taşıyan değişken
ipban=1 # ipban değeri 1 olursa saldırgan IP adresi iptables ile engellenenir.

def create_attack_pattern(): #3. adım saldırı desenleri oluşturulur
    global attack_pattern
    F=open("attack_patterns.txt","rb")
    attack_pattern=F.read().split("\n")
    
class network_monitor:
    def __init__ (self):
        pass

    def start (self): # 5. adım...
        # TODO: specify a device or select all devices
        # dev = pcapy.findalldevs()[0] # ağ aygılarından ilk aygıtı seçmeyi sağlar.
        dev = 'wlan0' #Dinleyeceğimiz aygıt adı
        p = pcapy.open_live(dev, 65536, False, 1)
        p.loop(-1, self.handle_packet)

    def handle_packet (self, header, data):
        global attack_pattern,ipban,banned_ips
        
        eth = dpkt.ethernet.Ethernet (data) #etherner datasını almak için kullanıyoruz.
        if eth.type == dpkt.ethernet.ETH_TYPE_IP: #ethernet tipine bakyoruz. IP paketiyse işleme alıyoruz.
            ip = eth.data
            tcp = ip.data
            src_ip = socket.inet_ntoa(ip.src) #kayna ip adresini buluyoruz.
            dst_ip = socket.inet_ntoa(ip.dst) #hedef ip adresini buluyoruz.
            
            try:
                if tcp.dport == 80 and len(tcp.data) > 0: #tcp portu 80 ise ve aktif veri varsa aşağıdakiler yapılacak...
                    http = dpkt.http.Request(tcp.data)
            
                    # saldırı desenleri uri de var mı bakalım...
                    for i in attack_pattern: # saldırı desenleri içerisinde dolaşalım
                        if http.uri.find(i)>0: # gelen istekte saldırı var mı kontrol edelim.
                            # desen eşleşiyorsa saldırı var diyelim..
                            # bu kısımda veritabanına ekleme yapılacak...
                            
                            logline= "Saldırı: %s > %s %s %s%s " %(src_ip,dst_ip,http.method,http.headers['host'],http.uri)
                            if ipban==1: # saldırı varsa ve ipban değişkeni 1 ise bloklama yapalım
                                print "Çalıştırılacak Komut: iptables -A INPUT -s %s -j DROP"%src_ip
                                # komutu çalıştırmak için alt satırı açmamız gerekir:)
                                #os.system("iptables -A INPUT -s %s -j DROP"%src_ip) # Linux için saldırgan IP adresini engelleyelim...
                                # windows için netsh komutları http://itblog.gr/213/configuring-windows-firewall-from-the-command-line/
                                #os.system("netsh advfirewall firewall add rule name=\"Block some stuff\" dir=in action=block remoteip=%s enable=yes"%src_ip) # Windows için saldırgan IP adresini engelleyelim...
                            print logline # saldırı mesajını ekrana yazalım... :)

                    
            except:
                pass

def main():
    create_attack_pattern() # 2. adım 
    network_monitor ().start () # 4 .adım

if __name__=="__main__":
    main () #1. adım

Hiç yorum yok:

Yorum Gönder