网络基础之SYN Flood攻击
SYN Flood 的基本原理:
SYN Flood(同步泛滥技术)攻击手段。这种攻击手段一点也不新鲜,是一种最古老的攻击手段,用通俗的话讲,就是拒绝服务攻击(DDoS),该攻击利用TCP/IP协议天生的特点,通过大量的虚假IP地址建立不完整连接,使得服务器超载,陷入瘫痪状态。
要明白SYN Flood攻击的基本原理,还是要从 TCP 连接建立的过程开始说起:
为了在服务端和客户端之间传送 TCP 数据,必须先建立一个虚拟电路,也就是 TCP 连接, 建立 TCP 连接的标准过程是这样的:
首先,请求端(客户端)发送一个包含 SYN 标志的 TCP 报文,SYN 即同步(Synchronize),同步报文会指明客户端使用的端口以及 TCP 连接的初始序号;
第二步,服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 的报文,表示客户端的请求被接受,同时 TCP 序号被加一,ACK 即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文 ACK 给服务器端,同样 TCP ***被加一,到此一个 TCP 连接完成。
以上的连接过程在 TCP 协议中被称为三次握手(Three-way Handshake)。
问题就出在 TCP 连接的三次握手中,假设一个用户向服务器发送了 SYN 报文后突然死机或掉线,那么服务器在发出 SYN+ACK 应答报文后是无法收到客户端的ACK 报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送 SYN+ACK 给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为 SYN Timeout,一般来说这个时间是分钟的数量级(大约为30 秒-2 分钟);一个用户出现异常导致服务器的一个线程等待 1 分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源 数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的 CPU 时间和内存,何况还要不断对这个列表中的 IP 进行 SYN+ACK 的重试。
实际上如果服务器的 TCP/IP 栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了 SYN Flood 攻击(SYN 洪水攻击)。
实验环境:
攻击机:Kali Linux
靶 机:Windows XP
网卡连接:NAT(Vmnet 8)
IP地址:自动获取(通过Vmware软件自动分配IP地址)
-
实验步骤:
1、查看IP地址:
Kalinux: ifconfig eth0
Windows XP: ipconfig /all
判断2台主机IP地址在同一个IP网段。
2、连通性测试:
Windows XP:关闭防火墙
Kali Linux:ping WindowsXP的IP地址
3、SYN Flooding攻击
攻击前——Windows XP:打开任务管理器---性能(监控CPU资源的占用率)
Kali Linux:
hping3 -q -n -a 伪造源IP地址 -S -s 伪造源端口 --keep -p 攻击的目标端口 --flood 目标IP(WinXP)
例如:
hping3 -q -n -a 2.2.2.2 -S -s 53 --keep -p 445 --flood 192.168.26.129
4、查看攻击效果:
攻击后——查看Windows XP的CPU资源占用率是否为100%,或是居高不下。
5、在物理机上启动WireShark:
选择Vmnet8网卡---抓包---是否看到大量的源地址为2.2.2.2的TCP包
防御:
第一种是缩短 SYN Timeout 时间
由于 SYN Flood 攻击的效果取决于服务器上保持的 SYN 半连接数,这个值=SYN 攻击的频度 x SYN Timeout,所以通过缩短从接收到 SYN 报文到确定这个报文无效并丢弃改连接的时间,例如设置为 20 秒以下(过低的 SYN Timeout 设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。
第二种方法是设置 SYN Cookie
就是给每一个请求连接的 IP 地址分配一个Cookie,如果短时间内连续受到某个 IP 的重复 SYN 报文,就认定是受到了攻击,以后从这个 IP 地址来的包会被一概丢弃。
注:
上述的两种方法只能对付比较原始的 SYN Flood 攻击,缩短 SYN Timeout 时间仅在对方攻击频度不高的情况下生效,SYN Cookie 更依赖于对方使用真实的 IP 地址,如果攻击者以数万/秒的速度发送 SYN 报文,同时利用 SOCK_RAW 随机改写 IP 报文中的源地址,以上的方法无效。