19.浅谈DOS与DDOS攻击的原理

  • Post author:
  • Post category:其他


在了解分布式拒绝服务攻击的原理之前,先要了解以下两个关键的基础原理

1.TCP饿死:

UDP这种传输方式不会控制自己在通信通道里的流量,可理解为不讲道理的人。他们来到了一个热闹地区的KFC中,但是他们不买东西只排队将所有食物的价格都问一遍,占满所有的座位和过道。而常规的TCP服务通过自己的弹窗机制来控制流量,好比讲道理的人,座位被占满了,TCP自然会离开KFC导致正常的服务不能进行。最终的结果就是UDP将整个通道打满堵死。

2.TCP三次握手和四次断开连接:

文字说不清楚,见下图

TCP头格式


seq:序列号;ack:确认序列号


双方均需要确认才可断开连接

关于双方在整个过程中每个时间段的状态名称·

分析完以上的两个原理便可继续

DOS攻击:一台或多台计算机对受攻击服务器的某一个端口发送大量无关的UDP报文,导致整个通道内的正常服务无法进行。

DDOS攻击:大量的肉鸡对服务器的不同端口发送巨型流量的UDP报文,无法通关关闭端口的方式来进行隔离,破坏力极强,严重会造成服务器当机。

根据攻击的时间和方式又可分将DDOS为以下几种

1.SYN Flood

2.ACK Flood

3.Connection Flood

4.HTTP Get Flood

对TCP饿死的应对方案

1.增加带宽,堵死了再买

2.CDN,各地部署子服务器,当子服务遭受到攻击时,其他地区的服务器和主服务器不会受到影响。

3.BGP流量清洗,通过BGP将通道内的无用UDP报文清洗干净再转给服务器



1





SYN


洪水攻击






要理解


dos


攻击,首先要理解


TCP


连接的三次握手过程


(Three-wayhandshake)











TCP/IP


协议中,


TCP


协议提供可靠的连接服务,采用三次握手建立一个连接。





第一次握手


:


建立连接时,客户端发送


SYN





((SYN=i)


到服务器,并进入


SYN SEND


状态,等待服务器确认


;



第二次握手


:


服务器收到


SYN


包,必须确认客户的


SYN (ACK=i+1 )


,同时自己也发送一个


SYN





((SYN=j)}





SYN+ACK


包,此时服务器进入


SYN_RECV


状态


;[1]



第三次握手


:


客户端收到服务器的


SYN+ACK


包,向服务器发送确认包


ACK(ACK=j+1)


,此包发送完毕,客户端和服务器进入


ESTABLISHED


状态,完成三次握手,客户端与服务器开始传送数据。





在上述过程中,还有一些重要的概念


:[1]



半连接


:



收到


SYN


包而还未收到


ACK


包时的连接状态称为半连接,即尚未完全完成三次握手的


TCP


连接。








半连接队列


:


在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的


SYN





(SYN=i )


开设一个条目,该条目表明服务器已收到


SYN


包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于


SYN_ RECV


状态,当服务器收到客户的确认包时,删除该条目,服务器进入


ESTABLISHED


状态。



Backlog


参数


:


表示半连接队列的最大容纳数目。



SYN-ACK


重传次数


:


服务器发送完


SYN-ACK


包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息、从半连接队列中删除。注意,每次重传等待的时间不一定相同。








半连接存活时间


:


是指半连接队列的条目存活的最长时间,也即服务从收到


SYN


包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为


Timeout


时间、


SYN_RECV


存活时间。





上面三个参数对系统的


TCP


连接状况有很大影响。






SYN


洪水攻击属于


DoS


攻击的一种,它利用


TCP


协议缺陷,



通过发送大量的半连接请求,耗费


CPU


和内存资源。



SYN


攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上


SYN


攻击并不管目标是什么系统,只要这些系统打开


TCP


服务就可以实施。从图


4-3


可看到,服务器接收到连接请求


(SYN=i )


将此信息加入未连接队列,并发送请求包给客户端


( SYN=j,ACK=i+1)


,此时进入


SYN_RECV


状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合


IP


欺骗,


SYN


攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的


IP


地址,向服务器不断地发送


SYN


包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的


SYN


包将长时间占用未连接队列,正常的


SYN


请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。过程如下


:[1]




攻击主机


C(


地址伪装后为


C')—–


大量


SYN





—->


被攻击主机









C&apos;<——-SYN/ACK





—-


被攻击主机








由于



C’


地址不可达,被攻击主机等待


SYN


包超时。攻击主机通过发大量


SYN


包填满未连接队列,导致正常


SYN


包被拒绝服务。另外,


SYN


洪水攻击还可以通过发大量


ACK


包进行


DoS


攻击。






【防御方法】





第一种是



缩短


SYN Timeout


时间






第二种方法是



设置


SYN Cookie



,就是给每一个请求连接的


IP


地址分配一个


Cookie


,如果短时间内连续受到某个


IP


的重复


SYN


报文,就认定是受到了攻击,以后从这个


IP


地址来的包会被一概丢弃。



>netstat -n -p tcp >result.txt






SYN Cookie








当服务器收到一个


SYN


报文后,

不立即分配缓冲区

,而是利用连接的信息生成一个


cookie


,并将这个


cookie


作为将要返回的


SYN





ACK


报文的初始序列号。





当客户端返回一个


ACK


报文时,根据包头信息计算


cookie


,与返回的确认序列号(初始的序列号+


1


)的前


24


位进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。





【缺陷】



SYN Cookies


的使用不与任何协议定义冲突,照理来说它该和所有的


TCP


实现兼容。然而,当


SYN Cookies


使用的时候,会发生两种值得注意的变化:





首先,服务器只能编码八种


MSS


数值,因为只有


3


位二进制空间可用。





其次,这个服务器必须拒绝所有的


TCP


选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃


SYN


队列条目。





尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到


——


这些改变只在被攻击时值得注意。在这样的情况下,牺牲


TCP


选项来保护连接一般被认为是合乎情理的。



Linux


内核从


2.6.26


版本开始为


TCP


选用项加入了有限的支持,通过把它们编码在时间戳内实现。





较新的


TCP Cookie


传输(


TCPCT


)标准被设计用来克服


SYN Cookies


的这些问题,并且在各种方面改进这套机制。不像


SYN Cookies





TCPCT


是一个


TCP


拓展并且要求两端点都支持


TCPCT







2





ACK Flood


攻击







TCP


连接建立之后,



所有的数据传输


TCP


报文都是带有


ACK


标志位的,



主机在接收到一个带有


ACK


标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则



主机操作系统协议栈会回应


RST


包告诉对方此端口不存在。



通常状态检测防火墙所做的事情与此类似,只不过防火墙只拦截非法的数据包,而不主动回应。



对比主机以及防火墙在接收到


ACK


报文和


SYN


报文时所做动作的复杂程度,显然


ACK


报文带来的负载要小得多。所以在实际环境中,只有当攻击程序每秒钟发送


ACK


报文的速率达到一定的程度,才能使主机和防火墙的负载有大的变化。当发包速率很大的时候,



主机操作系统将耗费大量的精力接收报文、判断状态,同时要主动回应


RST


报文,正常的数据包就可能无法得到及时的处理



。这时候客户端(以


IE


为例)的表现就是访问页面反应很慢,丢包率较高。



但是状态检测的防火墙通过判断


ACK


报文的状态是否合法,借助其强大的硬件能力可以较为有效的过滤攻击报文。



当然如果攻击流量非常大(特别是千兆线路上,我们曾经观察到


200~300Mbps


左右的


ACK Flood


),由于需要维护很大的连接状态表同时要检查数量巨大的


ACK


报文的状态,防火墙也会不堪重负导致全网瘫痪。

3


、死亡之


ping (pingofdeath)


ICMP(InternetControlMessageProtocol





Internet


控制信息协议


)






Internet


上用于错误处理和传递控制信息。



最普通的


ping


程序就是这个功能。而在


TCP/IP





RFC


文档中对包的最大尺寸都有严格限制规定,许多操作系统的


TCP/IP


协议栈



都规定


ICMP


包大小为


64KB


,且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。


“PingofDeath”


就是故意产生畸形的测试


Ping





PacketInternetGroper


)包,声称自己的尺寸超过


ICMP


上限,也就是加载的尺寸超过


64KB


上限,使未采取保护措施的网络系统出现内存分配错误,导致


TCP/IP


协议栈崩溃,最终接收方宕机。








【防御方法】






1


、用高级设置法预防


Ping

2


、用网络防火墙阻隔


Ping






使用防火墙来阻隔


Ping


是最简单有效的方法,现在基本上所有的防火墙在默认情况下都启用了


ICMP


过滤的功能。



3






启用


IP


安全策略防


Ping




4






修改


TTL


值防


Ping






许多入侵者喜欢用


TTL


值来判断操作系统,他们首先会


Ping


一下你的机子,如看到


TTL


值为


128


就认为你的系统为


Windows NT/2000


,如果


TTL


值为


32


则认为目标主机操作系统为


Windows 95/98








如果为


TTL


值为


255/64


就认为是


UNIX/Linux


操作系统。既然入侵者相信


TTL


值所反应出来的结果,那么我们不妨修改


TTL


值来欺骗入侵者,达到保护系统的目的



5


、防火墙在处理


Ping of Death


攻击报文时,是通过判定数据包的大小是否大于


65535


字节,如果数据包大于


65535


字节,则判定为攻击报文,直接丢弃。




4





UDP


泛洪


UDPflood


攻击:如今在



Internet





UDP


(用户数据包协议)的应用比较广泛,



很多提供


WWW





Mail


等服务设备通常是使用


Unix


的服务器,它们



默认打开一些被黑客恶意利用的


UDP


服务。如


echo


服务会显示接收到的每一个数据包,而原本作为测试功能的


chargen


服务会在收到每一个数据包时随机反馈一些字符。



UDPflood


假冒攻击就是利用



这两个简单的


TCP/IP


服务的漏洞



进行恶意攻击,通过伪造与某一主机的


Chargen


服务之间的一次的


UDP


连接,回复地址指向开着


Echo


服务的一台主机,通过将


Chargen






Echo


服务互指,



来回传送毫无用处且占满带宽的垃圾数据,在两台主机之间生成足够多的无用数据流,



这一拒绝服务攻击飞快地导致网络可用带宽耗尽。





【防御方法】



UDP


协议与


TCP


协议不同,是无连接状态的协议,并且


UDP


应用协议五花八门,差异极大,因此针对


UDP Flood


的防护非常困难。其防护要根据具体情况对待:




判断包大小,如果是大包攻击则使用防止


UDP


碎片方法:根据攻击包大小设定包碎片重组大小,通常不小于


1500.


在极端情况下,可以考虑丢弃所有


UDP


碎片。





攻击端口为业务端口:根据该业务


UDP


最大包长设置


UDP


最大包大小以过滤异常流量。





攻击端口为非业务端口:一个是丢弃所有


UDP


包,可能会误伤正常业务


;


一个是建立


UDP


连接规则,要求所有去往该端口的


UDP


包,必须首先与


TCP


端口建立


TCP


连接。不过这种方法需要很专业的防火墙或其他防护设备支持。

5





Land





LandAttack


)攻击








Land


攻击中,黑客利用一个特别打造的


SYN








它的原地址和目标地址都被设置成某一个服务器地址进行攻击







此举将导致接受服务器向它自己的地址发送


SYN-ACK


消息,


结果这个地址又发回


ACK


消息并创建一个空连接,每一个这样的连接都将保留直到超时,






Land


攻击下,许多


UNIX


将崩溃,


NT


变得极其缓慢(大约持续五分钟)。





【防御方法】





防火墙在处理



Land


攻击报文时,通过检查


TCP


报文的源地址和目的地址是否相同,或者


TCP


报文的源地址是否为环回地址,如果是则丢弃。



6


、泪滴攻击





对于一些大的


IP


数据包,往往需要对其进行拆分传送,这是为了迎合链路层的


MTU


(最大传输单元)的要求。比如,一个


6 000


字节的


IP


包,在


MTU





2 000


的链路上传输的时候,就需要分成


3





IP


包。在


IP


报头中有一个偏移字段和一个拆分标志(


MF


)。如果


MF


标志设置为


1


,则表示这个


IP


包是一个大


IP


包的片段,其中偏移字段指出了这个片段在整个


IP


包中的位置。例如,对一个


6 000





节的


IP


包进行拆分(


MTU





2 000


),






3


个片段中偏移字段的值依次为


0





2 000





4 000






这样接收端在全部接收完


IP


数据包后,就可以根据这些信息重新组装这几个分次接收的拆分


IP


包。在这


里就有一个安全漏洞可以利用了,就是



如果黑客们在截取


IP


数据包后,把偏移字段设置成不正确的值,这样接收端在收到这些分拆的数据包后,就不能按数据包中的偏移字段值正确组合这些拆分的数据包,但接收端会不断尝试,这样就可能致使目标计算机操作系统因资源耗尽而崩溃。




【防御方法】




检测这类攻击的方法是对接收到的分片数据包进行分析,计算数据包的片偏移量(


Offset


)是否有误。反攻击的方法是添加系统补丁程序,丢弃收到的病态分片数据包并对这种攻击进行审计。尽可能采用最新的操作系统,或者在防火墙上设置分段重组功能,由防火墙先接收到同一原包中的所有拆分数据包,然后完成重组工作,而不是直接转发。因为防火墙上可以设置当出现重叠字段时所采用的规则。




7





IP


地址扫描攻击



IP


地址扫描攻击是攻击者运用


ICMP


报文(如


Ping





Tracert


命令)探测目标地址



,或者使用


TCP/UDP


报文对一定地址发起连接,通过判断是否有应答报文,以确定哪些目标系统确实存活着并且连接在目标网络上。




【防御方法】




防火墙对收到的


TCP





UDP





ICMP


报文进行检测,当某源


IP


地址连续发送报文的目的


IP


地址与前一个报文的目的


IP


地址不同时,则记为一次异常,当异常次数超过预定义的阈值时,则认为该源


IP


的行为为


IP


地址扫描行为,防火墙会将该源


IP


地址加入黑名单。



8





Smurf


攻击



Smurf


攻击通过使用将回复地址设置成受害网络的广播地址的


ICMP


应答请求


(ping)


数据包,来淹没受害主机,最终导致该网络的所有主机都对此


ICMP


应答请求做出答复,导致网络阻塞。更加复杂的


Smurf


将源地址改为第三方的受害者,最终导致第三方崩溃。




攻击的过程是这样的:


Woodlly Attacker


向一个



具有大量主机和因特网连接的网络的广播地址发送一个欺骗性


Ping


分组(


echo


请求)



,这个目标网络被称为反弹站点,而欺骗性


Ping


分组的源地址就是


Woolly


希望攻击的系统。




这种攻击的前提是,路由器接收到这个发送给


IP


广播地址(如


206.121.73.255


)的分组后,会认为这就是广播分组,并且把以太网广播地址


FF:FF:FF:FF:FF:FF:


映射过来。这样路由器因因特网上接收到该分组,会对本地网段中的所有主机进行广播。




读者肯定能够想到下面会发生什么情况。网段中的所有主机都会向欺骗性分组的


IP


地址发送


echo


响应信息。如果这是一个很大的以太网段,可以会有


500


个以上的主机对收到的


echo


请求进行回复。




由于多数系统都会尽快地处理


ICMP


传输信息,


Woodlly Attacker


把分组的源地址设置为目标系统,因此目标系统都很快就会被大量的


echo


信息吞没,这样轻而易举地就能够阻止该系统处理其它任何网络传输,从而引起拒绝为正常系统服务。




这种攻击不仅影响目标系统,还影响目标公司的因特网连接。如果反弹站点具有


T3


连接(


45Mbps


),而目标系统所在的公司使用的是租用线路(


56Kbps


),则所有进出该公司的通讯都会停止下来。


这种攻击现在已经很少见


,


大多数的网络已经对这种攻击免疫了


.


【防御方法】




配置路由器禁止


IP


广播包进网





配置网络上所有计算机的操作系统,禁止对目标地址为广播地址的


ICMP


包响应。





被攻击目标与


ISP


协商,有


ISP


暂时阻止这些流量。




对于从本网络向外部网络发送的数据包,本网络应该将其源地址为其他网络的这部分数据包过




9





Fraggle


攻击





类似于


Smurf


,使用


UDP


应答消息而非


ICMP






UDP


端口


7





ECHO


)和端口


19





Chargen


)在收到


UDP


报文后,都会产生回应。在


UDP





7


号端口收到报文后,会回应收到的内容,而


UDP





19


号端口在收到报文后,会产生一串字符流。它们都同


ICMP


一样,会产生大量无用的应答报文,占满网路带宽。攻击者可以向子网广播地址发送源地址为受害网络或受害主机的


UDP


包,端口号用


7





19.


子网络启用了此功能的每个系统都会向受害者的主机做出响应,从而引发大量的包,导致受害网络的阻塞或受害主机的崩溃;子网上没有启动这些功能的系统将产生一个


ICMP


不可达的消息,因而仍然消耗带宽。也可将源端口改为


Chargen


。目的端口为


ECHO


,这样会自动不停地产生回应报文,其危害性更大。





【防御方法】





检查进入防火墙的


UDP


报文,若目的端口号为


7





19


,则直接拒绝,并将攻击记录到日志,否则允许通过。




10


、电子邮件炸弹








电子邮件炸弹是最古老的匿名攻击之一,通过设置一台机器不断的大量的向同一地址发送电子邮件,攻击者能够耗尽接受者网络的带宽。





【防御方法】



对邮件地址进行配置,自动删除来自同一主机的过量或重复的消息。



11


、畸形消息攻击







各类操作系统上的许多服务都存在此类问题,由于这些服务在处理信息之前没有进行适当正确的错误校验,在收到畸形的信息可能会崩溃。



【防御方法】




打最新的服务补丁。



版权声明:本文为u014590757原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。