17 Ekim 2015 Cumartesi

Linuxlarda Bellek İmajı Almak

Modern linux sistemlerden bellek imajı almak için Linux Memory Grabber (lmg) ve Linux Memory Extractor (LiME) araçları kullanılabilir. Bu araçları bir flashdisk'e toplayalım...

#flash diskin mount olduğu dizine geçelim... 
cd /media/harun/flash
#lmg aracını indirelim...
git clone https://github.com/halpomeranz/lmg.git lmg-src 
#lmg scriptini flash diskin kök dizinine alalım.. çalıştırması kolay olur.. :)  
cp lmg-src/lmg  .
chmod +x lmg 
#static-dwarfdump.tgz paketini açalım... 
tar zxvf lmg-src/static-dwarfdump.tgz  
#LiME aracını indirelim
git clone https://github.com/504ensicsLabs/LiME.git lime 
#LiME aracını lmg için yamalayalım. Lime Makefile için küçük bir yama yapıyoruz.
cd lime/src/
patch < ../../lmg-src/lime-Makefile.patch 
#flash diskin kök dizinine geçelim...
cd ..
cd .. 
# lmg komutunu çalıştıralım ve bellek imajını alalım...

./lmg
Dumping memory in "lime" format to /mnt/capture/kali-2015-10-17_15.59.01
This could take a while...Done! Cleaning up...Done!
Grabbing a copy of /bin/bash...Done!
Compile profile for this system? [N|y] y
make -C //lib/modules/4.0.0-kali1-amd64/build CONFIG_DEBUG_INFO=y M="/mnt/volatility/tools/linux" modules
make[1]: Entering directory '/usr/src/linux-headers-4.0.0-kali1-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
  CC [M]  /mnt/volatility/tools/linux/module.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /mnt/volatility/tools/linux/module.mod.o
  LD [M]  /mnt/volatility/tools/linux/module.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.0.0-kali1-amd64'
dwarfdump -di module.ko > module.dwarf
make -C //lib/modules/4.0.0-kali1-amd64/build M="/mnt/volatility/tools/linux" clean
make[1]: Entering directory '/usr/src/linux-headers-4.0.0-kali1-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
  CLEAN   /mnt/volatility/tools/linux/.tmp_versions
  CLEAN   /mnt/volatility/tools/linux/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-4.0.0-kali1-amd64'
  adding: module.dwarf (deflated 91%)
  adding: boot/System.map-4.0.0-kali1-amd64 (deflated 79%)
 

Bellek imajı almak için gerekli çekirdek modülleri derlendi, yüklendi, bellek imajı ve bu imajı volatility aracı ile incelmek için gerekli olan profile dosyası capture dizinin altına kayıt edildi... :)

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