Erdem YILDIZ

Siber Güvenlik Araştırmacısı
Python Geliştiricisi
Linux Hayranı

Python ile Local Ağ'da Açık Makineleri Keşfetmek

Merhaba arkadaşlar bugün python ile yazmış olduğum script'te Active yada Passive seçeneğine göre local ağınızda olan makinaları bulan script'in amacını , kodlarını ve video ile kullanımı göstereceğim. Haydi bir giriş yapalım...

Arkadaşlar bu scripteki amacım şuydu.Geçtiğimiz günlerde bir blog yazısı okudum.Bu yazı'da local ağda hiçbir cihaz ile iletişime geçmeden ağdaki açık makineleri bulmak için bir script kullanılmıştı.Bu script kullanıcıya Active ve Passive olarak 2 adet özellik sunuyor.Ben bu script'in nasıl çalıştığını anladıktan sonra kendim yazmak istedim.

  • Active Saldırı: Bu saldırı türünde siz bağlı bulunduğunuz ağ'ın size verdiği ip adresini script'e parametre olarak vererek script arka planda ICMP packet'leri üretip hangi host'ların açık olduğunu sizlere kısa süre sonra gösterecektir.Bu yöntemin adından'da anlaşılabileceği gibi local ağdaki diğer cihaz'larla temas kurduğu için Active adını almıştır.
  • Passive Saldırı: Bu saldırı türün'de ise ağa dahil olduğunuz cihazın adını (Wifi , Ethernet vs.) parametre olarak veriyorsunuz. Bu işlemden sonra sizin NIC (Network Interface Card)'iniz "Promisc" mod'a çevirilerek ağ'da size gelen packet'ler bilgisayarınız tarafından drop'lanmadan kabul edilir hale getiriliyor.Daha sonra bu packet'i gönderin kişinin kaynak bilgisi alınıp sizlere gösterilecektir.Böylece local ağınızdaki diğer makineler'le haberleşemeden hangi ip adreslerinin ayakta olduğunu öğrenebiliriz.
Passive mod Active moddan daha yavaştır.
                                        # DDOS.py
                                        # -*- coding: utf-8 -*-

                                        import subprocess
                                        import os
                                        import sys
                                        import time
                                        import socket
                                        import struct
                                        import binascii
                                        import threading

                                        class Passive():
                                            def __init__(self):
                                                    print "[!] Passive Attack"
                                                    card = raw_input("[*]	Enter using network device name :")
                                                    self.ONcommand = "sudo ip link set {} promisc on".format(card)
                                                    self.OFcommand = "sudo ip link set {} promisc off".format(card)
                                                    self.arr = []
                                            def ON(self):
                                                    time.sleep(2)
                                                    os.system(self.ONcommand)

                                            def OFF(self):
                                                    time.sleep(5)
                                                    os.system(self.OFcommand)

                                            def Capture(self):
                                                try:
                                                    self.s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
                                                except socket.error:
                                                    print "Socket was created"

                                                    packet = self.s.recvfrom(65565)

                                                    ethernet_header = packet[0][0:14]
                                                    ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)

                                                    arp_header = packet[0][14:42]
                                                    arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)

                                                    ethertype = ethernet_detailed[2]
                                                    mac = binascii.hexlify(arp_detailed[5])
                                                    ip  = socket.inet_ntoa(arp_detailed[6])
                                                if ethertype == '\x08\x06' and ip not in self.arr:
                                                        print "*************************************************\n"
                                                        print "Captured ARP Broadcast | This host is alive your network"
                                                        print "Source MAC:      ", mac
                                                        print "Source IP:       ", ip + "\n"
                                                        print "*************************************************\n"
                                                        self.arr.append(ip)
                                                time.sleep(2)

                                            def Run(self):
                                                self.ON()

                                                while True:
                                                    try:
                                                        self.Capture()
                                                    except KeyboardInterrupt:
                                                        print "[*]	Exiting"
                                                        break

                                                self.OFF()

                                        class Active():
                                            def __init__(self):
                                                print "[!] Active Attack"
                                                tmp  = raw_input("[*]	Enter your ip adress :")
                                                print "-"*42
                                                self.IP = tmp.split(".")[0] + "." + tmp.split(".")[1] + "." + tmp.split(".")[2] + "."

                                            def Run(self):
                                                for i in range(1,6):
                                                    threading.Thread(target=self.AttackStart , args=( (i-1)*51 , i*51)).start()


                                            def AttackStart(self,b,s):
                                                for i in range(b,s):
                                                    if i != 0:
                                                        tmpIP = self.IP + str(i)
                                                        tmpCommand = "ping -c 1 {} -W 1".format(tmpIP)
                                                        proc = subprocess.Popen(tmpCommand, stdout=subprocess.PIPE, shell=True )
                                                        (out , err) = proc.communicate()
                                                        if "bytes from" in out:
                                                            print tmpIP ," is alive"




                                        if __name__ == "__main__":
                                                print "Welcome my Net-discover script"
                                                print "Select attack type"
                                                print "[*]      Active  --> 1"
                                                print "[*]      Passive --> 2"
                                                select = raw_input("#>")
                                                os.system("clear")
                                                if select == "2":
                                                    P = Passive()
                                                    P.Run()
                                                if select == "1":
                                                    A = Active()
                                                A.Run()






                                        

Aşağıdaki video'da Passive saldırıda aynı ağda olan sanal makinerle local ağımada kullanılmayan makinelere ping attım.Bunun sebebi şudur ki.Local ağ'da bir host başka bir host ile haberleşecek'se ve onun mac adresini bilmiyorsa bir Arp Broadcast packeti üreterek onu ağa bırakı ve bu packet tüm network boyunca her bir host'a gider.Benim "Passive" modda çalışan script'imde makinama gelecek olan Arp Broadcast'leri yakalayacağını için böyle birşey yaptım.

Yukarıda paylaşmış olduğum kodda bir sıkıntı yada yapılabilecek iyileştirmeler için bana ulaşabilirseniz çok sevinirim.Okuduğunuz için çok teşekkür ederim.Esen kalın :)