TCP协议通过三次握手建立连接,如果我只做第一次握手,向你发送一个SYN请求,后边就不管了,你就要在半连接队列里维护我的这个连接,并每隔一段时间向我我返回ACK确认,直到这个连接超时。
如果我向你发送大量的SYN请求,你就要维护大量的半连接队列并不停的返回ACK确认,当半连接队列溢出或资源耗尽时,你的电脑就卡死了,这一招叫 SYN Flood 或者 SYN泛洪。
如果不了解ARP协议,请先看我的另一篇文章 TCP协议详解
1、hping3实现SYN Flood
攻方:Kali + hping3
冤大头:Win7
1.1、主机探测
用Kali自带的Nmap扫描当前网段的存活主机 nmap -sP 192.168.126.0/24
。
比如我的IP是 192.168.126.131,那我就扫 192.168.126.0/24 这个网段。
从扫描结果可以判断出来,192.168.126.130 就是这次试验的倒霉蛋了。
到Win7上验证一下IP。
1.2、扫描端口
用Nmap扫描倒霉蛋开放的端口 nmap 192.168.126.130
从扫描结果中选择一个端口,这里选445。
1.3、泛洪、卡死!
使用Kali自带的hping3工具,执行 hping3 -S -p 445 --flood 192.168.126.130
-s
是使用SYN,-p
指定端口,--flood
是尽快发包不显示回复,后面的IP是冤大头的地址。
Win7很快就会卡死,我这里任务管理器都点不动了。
Ctrl + c停止命令后,可以看到CPU使用记录里,刚才已经顶到头了。
2、SYN Flood原理分析
SYN Flood 通过发送大量SYN请求,使目标维护大量半连接队列,从而消耗资源。也就是只进行前两次握手,到达下图中SYN-RCVD状态时就停住了。所以被攻击者会出现大量SYN-RCVD状态的半连接。
实验中,使用了目标的445端口,未执行时,先看冤大头的445端口,没有什么连接。
Kali执行几秒钟后停掉,再看冤大头,出现了一大堆SYN_RCVD状态的半连接,这时候冤大头就已经汗流浃背了。
3、SYN Flood防御
防御SYN可以优化系统配置,比如修改SYN timeout,降低半连接队列的超时时间。
或者设置SYN cookie,短时间内收到重复发SYN请求的主机,就丢弃这个主机的报文。
或者用防火墙,防火墙替服务器接收客户端的SYN请求,等TCP连接建立成功后再跟服务器建立连接,防火墙的性能通常比较好,可以替服务器承担很多压力。