据统计,在所
・
TCP握手协议
|
・
SYN攻击原理
|
・
SYN攻击工具
|
・
检测SYN攻击
|
・
SYN攻击防范技术
|
有黑客攻击事件中,
SYN
攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得
2000
年
YAHOO
网站遭受的攻击事例,当时黑客利用的就是简单而有效的
SYN
攻击,有些网络蠕虫病毒配合
SYN
攻击造成更大的破坏。本文介绍
SYN
攻击的基本原理、工具及检测方法,并全面探讨
SYN
攻击防范技术。
一、
TCP
握手协议
在
TCP/IP
协议中,
TCP
协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送
syn
包
(syn=j)
到服务器,并进入
SYN_SEND
状态,等待服务器确认;
第二次握手:服务器收到
syn
包,必须确认客户的
SYN
(
ack=j+1
),同时自己也发送一个
SYN
包(
syn=k
),即
SYN+ACK
包,此时服务器进入
SYN_RECV
状态;
第三次握手:客户端收到服务器的
SYN
+
ACK
包,向服务器发送确认包
ACK(ack=k+1)
,此包发送完毕,客户端和服务器进入
ESTABLISHED
状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的
SYN
包(
syn=j
)开设一个条目,该条目表明服务器已收到
SYN
包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于
Syn_RECV
状态,当服务器收到客户的确认包时,删除该条目,服务器进入
ESTABLISHED
状态。
Backlog
参数:表示未连接队列的最大容纳数目。
SYN-ACK
重传次数 服务器发送完
SYN
-
ACK
包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到
SYN
包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为
Timeout
时间、
SYN_RECV
存活时间。
二、
SYN
攻击原理
SYN
攻击属于
DOS
攻击的一种,它利用
TCP
协议缺陷,通过发送大量的半连接请求,耗费
CPU
和内存资源。
SYN
攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上
SYN
攻击并不管目标是什么系统,只要这些系统打开
TCP
服务就可以实施。从上图可看到,服务器接收到连接请求(
syn=j
),将此信息加入未连接队列,并发送请求包给客户(
syn=k,ack=j+1
),此时进入
SYN_RECV
状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合
IP
欺骗,
SYN
攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的
IP
地址,向服务器不断地发送
syn
包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的
SYN
包将长时间占用未连接队列,正常的
SYN
请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
三、
SYN
攻击工具
SYN
攻击实现起来非常的简单,互联网上有大量现成的
SYN
攻击工具。
1
、
windows
系统下的
SYN
工具
以
synkill.exe
为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和
TCP
端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的
TCP
端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的
TCP
端囗,通常,
windows
系统开放
tcp139
端囗,
UNIX
系统开放
tcp7
、
21
、
23
等端囗。
四、检测
SYN
攻击
检测
SYN
攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源
IP
地址是随机的,基本上可以断定这是一次
SYN
攻击。我们使用系统自带的
netstat
工具来检测
SYN
攻击:
# netstat -n -p TCP
tcp
0
0 10.11.11 .11:23
124.173.152.8:25882
SYN_RECV
-
tcp
0
0 10.11.11.11:23
236.15.133.204:2577
SYN_RECV
-
tcp
0
0 10.11.11.11:23
127.160.6.129:51748
SYN_RECV
-
tcp
0
0 10.11.11.11:23
222.220.13.25:47393
SYN_RECV
-
tcp
0
0 10.11.11.11:23
212.200.204.182:60427 SYN_RECV
-
tcp
0
0 10.11.11.11:23
232.115.18.38:278
SYN_RECV
-
tcp
0
0 10.11.11.11:23
239.116.95.96:5122
SYN_RECV
-
tcp
0
0 10.11.11.11:23
236.219.139.207:49162 SYN_RECV
-
...
上面是在
LINUX
系统中看到的,很多连接处于
SYN_RECV
状态(在
WINDOWS
系统中是
SYN_RECEIVED
状态),源
IP
地址都是随机的,表明这是一种带有
IP
欺骗的
SYN
攻击。
我们也可以通过下面的命令直接查看在
LINUX
环境下某个端囗的未连接队列的条目数:
#
netstat -n -p TCP | grep SYN_RECV | grep :22 | wc -l
324
显示
TCP
端囗
22
的未连接数有
324
个,虽然还远达不到系统极限,但应该引起管理员的注意。