24 Eylül 2015 Perşembe

Python ile Packet Sniffing

Merhaba Arkadaşlar,

Bugün python script dili ile sniffer scripti hazırlamanın aşamalarını anlatacağım. İki farklı yöntemden bahsedeceğim; Birincisi herhangi bir kütüphaneden faydalanmadan bir sniffer nasıl yazılır sorusuna cevap vermeye çalışacağım.İkincisi ise daha önceden bahsetmiş olduğum Scapy kütüphanesini kullanarak bir sniffer hazırlamanın nasıl olduğunu göstereceğim.

Daha önce yayınlamış olduğum Python ile Socket programlama ve Scapy ile Host ve Port Tarama yazılarım konuya aşinalık kazanmak isteyen arkadaşlara faydalı olabilir. Aşağıdaki bağlantılardan bu yazılara ulaşabilirsiniz.

http://msesli.blogspot.com.tr/2015/06/python-ile-socket-programlama.html

http://msesli.blogspot.com.tr/2015/06/scapy-ile-host-ve-port-tarama.html

Teknik detaylara geçmeden önce bir packet sniffer'ın  nasıl çalıştığından bahsedelim. Packet sniffer belirlenen bir veya daha fazla ağ arayüzüne gelen paketleri yakalar. Bir ağ arayüzü sadece kendisini ilgilendiren paketleri dikkate almak için yapılandırılmıştır. Bütün paketlerin yakalanabilmesi için sniffer aracımız, ilgili ağ arayüzünü promiscous mode'a getirir. Promiscous mode, ağ arayüzünün paketleri herhangi bir kritere tabi tutmadan kabul ettiği çalışma modudur. Ağ arayüzünü bu çalışma mode'una almak için  yönetici yetkilerine sahip olunmalıdır.

Bir sniffer aracının çalışma prensibini özetlediğimize göre artık pyhton ile kendi aracımızı yazmaya başlayabiliriz.

import socket
import os
host="192.168.76.132"
if os.name=="nt":
      socket_protocol = socket.IPPROTO_IP
else:
      socket_protocol = socket.IPPROTO_ICMP
sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)
sniffer.bind((host,0))
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
if os.name=="nt":
      sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
while True:
      print sniffer.recvfrom(65565)
if os.name=="nt":
      sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

Satır satır kodumuzu inceleyecek olursak, ilk iki satırda işimize yarayacak modülleri scriptimize dahil ediyoruz. Daha sonra dinleme yapacak sistemin ip adresini "host" değişkenimize atıyoruz. Sonraki aşamada Linux ile Windows sistemlerdeki bir farklılıktan dolayı bir işletim sistemi sorgusu yapıyoruz. Eğer işletim sistemi Windows ise protokolden bağımsız bütün IP paketlerini yakalayabiliyoruz, eğer işletim sistemi Linux ise sadece ICMP paketlerini yakalayabiliyoruz. Sniffer aracımız bir sunucu gibi çalışacağı için önce bir socket oluşturuyoruz ve "host" değişkenimizde tuttuğumuz IP adresimize bu sunucuyu bağlamış oluyoruz. Bir sonraki aşamada yakalayacağımız paketlerin IP başlıklarının paketlere dahil edilmesini aktif ediyoruz. Eğer Windows işletim sisteminde isek ağ arayüzünü promiscous mode'da çalışmasını sağlıyoruz. Yakaladığımız paketleri ekrana yazdırmak için bir sonsuz döngü yarattıktan sonra yine eğer Windows sistemde isek ağ arayüzünü promiscous mode'dan çıkarıyoruz.

Yukarıdaki kodu bir metin editörü ile dosya açıp içine kopyalıyoruz ve "py" formatında kaydediyoruz. Daha sonra bu scripti çalıştırılabilir hale getirip çalıştırıyoruz. Aşağıdaki komutlarla bu işlemleri gerçekleştiriyoruz.

#nano sniffer.py
#chmod +x sniffer.py
#python sniffer.py

Scriptimiz çalıştıktan sonra yakalanacak paketleri bekliyor, farklı bir terminalden www.google.com adresine ping attığımızda bu paketlerin aracımız tarafından yakalandığı görülür. Ekran görüntüsü 1' den de görüceleği gibi bu yakalanan paketlerdeki veriler RAW data denilen ham halde elde edilmektedir. Tcpdump gibi profesyonel bir araçtaki bu paketleri görüntülemek için bu verileri decode işlemine tabi tutmamız gerekir ya da Scapy kütüphanesinin bize sağladığı imkanlardan faydalanmamız gerekir.

Ekran Görüntüsü 1: Yakalanan paketler

from scapy.all import *

def packet_capture(packet):
      print packet.show()
packet=sniff(prn=packet_capture)
wrpcap('sniffedpackets.pcap',packet)

Scapy kütüphanesi bu aşamada işimiz oldukça rahatlatacak. Kodumuzu inceleyecek olursak ilk önce scapy kütüphanesini scriptimize dahil ediyoruz. Daha sonra yakaladığımız paketlere yapacağımız işlemleri tanımlayacağımız methodu oluşturuyoruz. Pakete yapacağımız işlem ise verileri ekrana yazdırmak.Sonraki satırda yakaladığımız paketleri "packet" değişkenimizde tutuyoruz. Ardından bu paketleri "packet_capture" methodumuza yolluyoruz ve ayrıca"sniffedpackets.pcap" dosyasına yazıyoruz. Benzer şekilde bu scripti çalıştırılabilir hale getirip çalıştırıyoruz. www.google.com adresine ping atıp scriptimizin çalıştığı konsola geri döndüğümüzde anlık olarak yakalanan paketleri görebiliriz. Tabiki Wireshark ya da tcpdump gibi profesyonel araçlardaki gibi okunabilirlik söz konusu olmasa da ham veriden daha okunabilir olduğu söylenebilir. "Ctrl+C" kombinasyonuyla scriptin çalışmasını durduğumuzda "sniffedpackets.pcap" dosyası oluşturulur.

Ekran Görüntüsü 2:Yakalanan Paketlerin Konsolda incelenmesi

Yakalanan paketleri hem konsolda hemde "sniffedpacket.pcap" dosyasını Wireshark'ta açarak inceleyebiliriz. Konsoldaki çıktıya baktığımızda daha öncedeki yazılarımda da kullandığım Scapy programının çıktıları ile karşılaşıyoruz. Paketle ilgili parametreleri gayet net bir şekilde görebildiğimizden detaylı incelemeleri gerçekleştirebiliyoruz. Bundan daha iyisi tabiki bu paketleri Wireshark programı ile incelemek. Ekran Görüntüsü 3'te görülebileceği gibi Wireshark ile yakalanmış gibi ayrıntılı paket analizi yapmak mümkün.



Ekran Görüntüsü 3:Yakalanan Paketlerin Wireshark'ta İncelenmesi

Bugün bir sniffer aracı nasıl çalışır ve python ile bir sniffer aracı nasıl yazılır sorularının cevaplarını vermeye çalıştım. Scapy kütüphanesinin python ile program geliştiricilerinin işini ne kolaylaştırdığını bir kez daha görmüş olduk. Her ne kadar programımız Wireshark kadar profesyonel olmasa da, Wiresharkı çalıştırmamızın mümkün olmadığı ya da kaynak sıkıntısı çektiğimiz ortamlarda (Raspberry Pi vs.) işimize yarar bir araç geliştirmiş olduk. Bir sonraki yazıda görüşmek üzere.

Yararlandığım Kaynak:
Justin SERTZ,"BLACK HAT PYTHON"

Hiç yorum yok:

Yorum Gönder