网络安全.docx
- 文档编号:14482204
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:44
- 大小:641.81KB
网络安全.docx
《网络安全.docx》由会员分享,可在线阅读,更多相关《网络安全.docx(44页珍藏版)》请在冰点文库上搜索。
网络安全
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攻击工具。
Windows系统下的SYN工具:
以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。
如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,Windows系统开放tcp139端囗,UNIX系统开放tcp7、21、23等端囗。
四、检测SYN攻击
检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。
我们使用系统自带的netstat工具来检测SYN攻击:
#netstat-n-pTCPtcp 0 010.11.11.11:
23124.173.152.8:
25882 SYN_RECV -tcp 0
010.11.11.11:
23236.15.133.204:
2577 SYN_RECV -tcp 0 0
10.11.11.11:
23127.160.6.129:
51748 SYN_RECV -tcp 0 0
10.11.11.11:
23222.220.13.25:
47393 SYN_RECV -tcp 0 0
10.11.11.11:
23212.200.204.182:
60427SYN_RECV -tcp 0 0
10.11.11.11:
23232.115.18.38:
278SYN_RECV -tcp 0 0
10.11.11.11:
23239.116.95.96:
5122SYN_RECV -tcp 0 0
10.11.11.11:
23236.219.139.207:
49162SYN_RECV -...
上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的,表明这是一种带有IP欺骗的SYN攻击。
我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:
#netstat-n-pTCP grepSYN_RECV grep:
22 wc-l324
显示TCP端囗22的未连接数有324个,虽然还远达不到系统极限,但应该引起管理员的注意。
五、SYN攻击防范技术
关于SYN攻击防范技术,人们研究得比较早。
归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。
1、过滤网关防护
这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。
防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。
过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。
·网关超时设置:
防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。
当客户端发送完SYN包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。
值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。
·SYN网关:
SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。
此时服务器由半连接状态进入连接状态。
当客户端确认包到达时,如果有数据则转发,否则丢弃。
事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。
·SYN代理:
当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。
SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。
2、加固tcp/ip协议栈
防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。
主要方法有SynAttackProtect保护机制、SYNcookies技术、增加最大半连接和缩短超时时间等。
tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。
·SynAttackProtect机制
为防范SYN攻击,Windows2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。
SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范SYN攻击的目的。
默认情况下,Windows2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加SynAttackProtect键值:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。
当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(routecacheentry)防范SYN攻击。
当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、windowsize和可滑动窗囗将被禁止。
我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整tcp/ip协议栈。
那么系统是如何检测SYN攻击发生的呢?
事实上,系统根据TcpMaxHalfOpen,TcpMaxHalfOpenRetried和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。
TcpMaxHalfOpen表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。
Windows2000 server默认值为100,Windows2000Advancedserver为500。
TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动SynAttackProtect机制。
Windows2000server默认值为80,Windows2000Advancedserver为400。
TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。
如果想调整以上参数的默认值,可以在注册表里修改(位置与SynAttackProtect相同)
·SYNcookies技术
我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。
为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYNcookies技术被设计出来。
SYNcookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYNcookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。
在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。
通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYNcookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。
当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。
如果相等,直接完成三次握手(注意:
此时并不用查看此连接是否属于backlog队列)。
在RedHatlinux中,启用SYNcookies是通过在启动环境中设置以下命令来完成:
#echo1?
?
/proc/sys/net/ipv4/tcp_syncookies
·增加最大半连接数
大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。
当然backlog队列需要占用大量的内存资源,不能被无限的扩大。
Windows2000:
除了上面介绍的TcpMaxHalfOpen,TcpMaxHalfOpenRetried参数外,Windows2000操作系统可以通过设置动态backlog(dynamicbacklog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于windowsocket的应用程序,比如ftp、telnet等。
AFD.SYS在注册表的位置:
HKLM\System\CurrentControlSet\Services\AFD\Parameters\EnableDynamicBacklog值为1时,表示启用动态backlog,可以修改最大半连接数。
MinimumDynamicBacklog表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。
MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐MaximumDynamicBacklog值不得超过2000。
DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。
Microsoft推荐该值为10。
LINUX:
Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。
在Redhat7.3中,该变量的值默认为256,这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。
我们可以通过以下命令修改此变量的值:
#sysctl-wnet.ipv4.tcp_max_syn_backlog=`2048`
SunSolarisSunSolaris用变量tcp_conn_req_max_q0来定义最大半连接数,在SunSolaris8中,该值默认为1024,可以通过add命令改变这个值:
#ndd-set/dev/tcptcp_conn_req_max_q02048
HP-UX:
HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:
#ndd-set/dev/tcptcp_syn_rcvd_max2048
·缩短超时时间
上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。
我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。
为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。
Windows2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接囗在注册表里的TcpInitialRtt注册值来完成。
重传次数由TcpMaxConnectResponseRetransmissions来定义,注册表的位置是:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersregistrykey
当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。
LINUX:
Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。
SunSolarisSolaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。
DDOS攻击的原理提供解决方法
从07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟。
DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形势十分严峻,超过1G的攻击流量频频出现,CNCERT/CC掌握的数据表明,最高时达到了12G,这样流量,甚至连专业的机房都无法抵挡。
更为严峻的是:
利用DDOS攻击手段敲诈勒索已经形成了一条完整的产业链!
并且,攻击者实施成本极低,在网上可以随便搜索到一大堆攻击脚本、工具工具,对攻击者的技术要求也越来越低。
相反的是,专业抗DDOS设备的价格十分昂贵,而且对于攻击源的追查难度极大,防护成本远远大于攻击成本。
本文将对DDOS攻击的原理做一个剖析,并提供一些解决方法。
一.DDOS攻击
什么是DDOS?
DDOS是英文DistributedDenialofService的缩写,意即"分布式拒绝服务",DDOS的中文名叫分布式拒绝服务攻击,俗称洪水攻击。
首先,我们来了解一下相关定义。
服务:
系统提供的,用户在对其使用中会受益的功能
拒绝服务:
任何对服务的干涉如果使其可用性降低或者失去可用性均称为拒绝服务。
拒绝服务攻击:
是指攻击者通过某种手段,有意地造成计算机或网络不能正常运转从而不能向合法用户提供所需要的服务或者使得服务质量降低
分布式拒绝服务攻击:
处于不同位置的多个攻击者同时向一个或者数个目标发起攻击,或者一个或多个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击,由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击。
图
如图所示,DDOS攻击将造成网络资源浪费、链路带宽堵塞、服务器资源耗尽而业务中断。
这种攻击大多数是由黑客非法控制的电脑实施的。
黑客非法控制一些电脑之后,把这些电脑转变为由地下网络远程控制的“bots”,然后用这些电脑实施DDOS攻击。
黑客还以每台为单位,低价出租这些用于攻击的电脑,真正拥有这些电脑的主人并不知道自己的计算机已经被用来攻击别人。
由于有数百万台电脑现在已经被黑客变成了“bots”,因此这种攻击将非常猛烈。
被DDoS攻击时的现象:
网络中充斥着大量的无用的数据包;
制造高流量无用数据,造成网络拥塞,使受害主机无法正常和外界通讯;
利用受害主机提供的服务或传输协议上的缺陷,反复高速的发出特定的服务请求,使受害主机无法及时处理所有正常请求;
严重时会造成系统死机。
由于网络层的拒绝服务攻击有的利用了网络协议的漏洞,有的则抢占网络或者设备有限的处理能力,使得对拒绝服务攻击的防治成为了一个令管理员非常头痛的问题。
尤其是目前在大多数的网络环境骨干线路上普遍使用的防火墙、负载均衡等设备,在发生DDoS攻击的时候往往成为整个网络的瓶颈,造成全网的瘫痪。
二.数据包结构
要了解DDOS的攻击原理,就要首先了解一下数据包的结构,才能知根知底,追本溯源。
首先来回顾一下数据包的结构。
2.1IP报文结构
图
2.2TCP报文结构
图
一个TCP报头的标识(codebits)字段包含6个标志位:
SYN:
标志位用来建立连接,让连接双方同步序列号。
如果SYN=1而ACK=0,则表示该数据包为连接请求,如果SYN=1而ACK=1则表示接受连接
FIN:
表示发送端已经没有数据要求传输了,希望释放连接。
RST:
用来复位一个连接。
RST标志置位的数据包称为复位包。
一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远端发送一个复位包。
URG:
为紧急数据标志。
如果它为1,表示本数据包中包含紧急数据。
此时紧急数据指针有效。
ACK:
为确认标志位。
如果为1,表示包中的确认号时有效的。
否则,包中的确认号无效。
PSH:
如果置位,接收端应尽快把数据传送给应用层,不必等缓冲区满再发送。
2.3UDP报文结构
图
2.4ICMP报文结构
图
三.DDOS攻击方式
3.1SYNFlood攻击
SYN-Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。
这种攻击早在1996年就被发现,但至今仍然显示出强大的生命力。
很多操作系统,甚至防火墙、路由器都无法有效地防御这种攻击,而且由于它可以方便地伪造源地址,追查起来非常困难。
它的数据包特征通常是,源发送了大量的SYN包,并且缺少三次握手的最后一步握手ACK回复。
3.1.1原理
例如,攻击者首先伪造地址对服务器发起SYN请求(我可以建立连接吗?
),服务器就会回应一个ACK+SYN(可以+请确认)。
而真实的IP会认为,我没有发送请求,不作回应。
服务器没有收到回应,会重试3-5次并且等待一个SYNTime(一般30秒-2分钟)后,丢弃这个连接。
如果攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源来处理这种半连接,保存遍历会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
最后的结果是服务器无暇理睬正常的连接请求—拒绝服务。
在服务器上用netstat–an命令查看SYN_RECV状态的话,就可以看到:
图
如果我们抓包来看:
图
可以看到大量的SYN包没有ACK回应。
3.1.2SYNFlood防护
目前市面上有些防火墙具有SYN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络安全