加载中...
返回

DoS——拒绝服务攻击

网络安全理论复习开始了!

今天从最简单的开始,目标是在寒假期间整理完成《网络安全》这门课所涉及的知识。希望本系列文章能以清晰的思路将安全理论表述出来。

DoS

Denial of Service,拒绝服务,是现代网络安全领域很常见的一种攻击。所谓拒绝服务,就是通过一系列手段使得原本正常运行的服务器无法再为用户的请求提供服务与应答,从而使目标业务停滞。

我们经常能看到拒绝服务的例子:使用”呼死你“软件不断地拨打某人的电话,则其他人正常呼叫的时候他永远是占线的状态;网络”水军“控评,正常的评论和留言就无法被看到;黄牛使用恶意的抢票软件抢占所有电影票,使得正常渠道无法获得``````

在计算机网络的世界中,拒绝服务攻击可以是非常粗暴的物理攻击:砸毁服务器、切断网线等;更为常见且稍微有点技术含量的是利用计算机本身的漏洞,构造恶意的网络请求来使目标系统崩溃、主机宕机、重启等。

下面介绍一些常见的DoS攻击手法。

Ping of Death

Ping of Death(死亡之Ping)的原理是构造一个超大的IP包来使目标主机瘫痪。在详细解释这个手法之前,需要从ICMP协议入手,介绍Ping的基本知识。

ICMP

网际控制报文协议(ICMP)用于让主机或路由器报告差错和异常情况。ICMP报文包含在IP数据报中,作为IP数据报的数据部分,加上IP首部发送出去,因此,ICMP是一个网络层协议

ICMP报文的种类有两种,ICMP差错报告报文ICMP询问报文

ICMP差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况,共有5种类型:

  • 终点不可达。
  • 源点抑制。由于拥塞而丢弃数据报时,要求源主机减小发送速率。
  • 时间超过。
  • 参数问题。路由器或目的主机收到的数据报首部中有的字段不正确。
  • 改变路由(重定向)。路由器把重定向信息发给主机,下一次使用更好的路由。

ICMP询问报文有4种类型:

  • 回送请求和应答。主机向目标发送ICMP请求,如果途中没有异常,则目标收到消息后恢复ICMP响应、
  • 时间戳请求和应答。测试来回一次的传输时间。主机填充原始时间戳,接收方受到后填充时间戳返回。
  • 掩码地址请求和回答。
  • 路由器询问和通告。

PING

PING工作在应用层。它直接使用网络层的ICMP询问报文,而未使用传输层的TCP或UDP。如果一台主机能PING通另一台主机,证明至少存在着一条可用的物理通路。

Ping of Death

死亡之Ping攻击利用了计算机实现IP协议时存在的缺陷。早期操作系统处理IP分组时,只开辟了64KB的缓冲区用来存放收到的数据包。如果攻击者故意在ICMP Echo(即PING数据报)之后附加非常多的冗余信息,使最终的IP包的大小超过65535字节的上限,接收方在处理这么大的IP包时就会产生内存分配错误,引起系统崩溃、挂起或重启。

可以看到这种攻击的实现主要是由于IP协议栈的漏洞,那为什么叫做死亡之Ping呢?因为使用PING工具太容易完成这种攻击,以至于它也成为了这种攻击的首选武器。当然,除了PING之外的任何能够构造超大IP包的程序都能实现这个攻击。

Ping of Death攻击不好预防,因为IP存在分组机制,每个IP包看起来都非常正常。最好的办法是在系统实现层面进行完善,使内核不再对超过规定长度的包进行重组。

TearDrop

又是IP协议实现的问题。故事从IP分片讲起。

分片

我们知道,数据链路层的每个数据报能够承载的数据量是有上限的,这个上限称为最大传送单元(MTU)。因为IP数据报被封装在数据链路层的数据报中,因此链路层的MTU严格地限制着IP数据报的长度。IP包传送的路径上,有许许多多的链路,可能使用不同的链路层协议,而同时也可能有大小不一的MTU。当IP数据报的总长度大于链路MTU时,需要能够将IP数据报中的数据分装在两个或多个较小的IP数据报中,然后再作为链路层数据进行传送。这些较小的数据报称为

片在目的地网络层被重新组装。对于一大堆杂乱无章的片,我们如何正确地重装成一个个独立的IP数据报呢?

IP协议使用首部的标识、标志和片偏移字段来完成对片的重组。我们看看IP数据报的首部:

第二行的标识字段占16位。它是一个计数器,每产生一个数据报就加一。分片时每个数据报片都复制一次标识号,以便能正确重装成原来的数据报。

标志位有3比特。实际上只有后面2个比特有意义。它们分别是:

  • MF位(More Fragment)。当MF = 1时,表示这个数据报后面还有后续的片;当MF = 0时表示这是最后一个片。
  • DF位(Don’t Fragment)。只有DF = 0时才允许将一个数据报分片。若DF = 1且数据报大小大于链路层的MTU,只能丢弃并发送ICMP错误信息。

片偏移占13位。既然一个数据报能被分成好几个小片,那么每个小片需要记录自己在原始数据报中的位置,否则怎么重组呢?片偏移的单位是8B,也就意味着除了最后一个片外,每个片中的有效载荷都是8的倍数(字节)

Teardrop

该攻击的原理是向目标主机发送一些分片的IP报文,并故意将片偏移字段设置成错误的值(与上一片重叠错开)。某些操作系统在处理这类分片的时候会出现系统崩溃、重启等现象。

这里主要以重叠为例。重叠是指第二片IP包的偏移量小于第一片的尾部,且算上第二片的长度也没有超过第一片的尾部。我认为更加准确的描述应该是IP分片的镶嵌,如下所示:

这时,我们要求第二个分片的长度,如果使用len2 = end2 - end1来计算,就产生了一个负值。

如果进一步使用memcpy(ip_package_start_addr + offset2, buffer, len2)来将第二个分片从缓冲区拷贝到重组IP包中,由于长度是一个负值,也就相当于一个unsigned的超大正值,就产生了溢出。

就我个人来说,其实还没有想清楚为什么要使用end2 - end1的办法来计算len2,明明长度字段就写在报头…

不过如果报头的长度字段也被伪造了,怎么办呢?Teardrop的防御办法是将接受到的数据报先缓存起来,然后先根据标识分组来进行检查,对于分片信息有错误的报文就直接丢弃。

不过,还是简单一点,没有什么是一个补丁无法解决的,如果有,那就两个。😤

LAND攻击

在TCP连接管理中,源地址、目的地址、源端口、目的端口是最为重要的几个参数。如果交由你来实现TCP连接监听,是否会向一个SYN包中的源IP直接发起ACK应答呢?

LAND攻击采用了特别构造的SYN包,其源地址和目的地址都被设置为目标服务器的地址。此举将导致接受服务器向它自己的地址发送一个SYN-ACK消息(第二次握手),然后再返回一次ACK消息(第三次握手),创建一个回环的空连接并保留下来,直到超时。

现在,大多数防火墙都能拦截类似的攻击包以保护系统。部分操作系统也通过安全补丁修复了这一漏洞。此外,路由器应同时配置上行和下行筛选器,屏蔽所有源地址与目的地址相同的数据包。

SYN FLOOD

还是SYN!

在TCP连接管理中,建立连接需要三次握手,如果你对此不太熟悉,可以看看我对TCP知识点的整理

TCP连接的第二次握手,即服务器收到一个SYN包之后,如果同意连接,便返回一个SYN-ACK应答,并在此步分配TCP连接资源(如在内存中开辟缓冲区等)。

而此时客户机还没有完成第三次握手,客户机资源还没有分配,故此时的连接称为半开连接

这种半开连接的数量是有限制的(废话),当服务器的连接资源被耗尽后,就不能再接受其他的TCP连接请求了。

所以,猥琐的Attackers在短时间内构造大量的SYN包,但就是不完成第三次握手,使得客户机资源几乎没有受到影响,但服务器资源被快速耗尽,造成拒绝服务的效果。

受到SYN FLOOD影响的系统有很多!这主要是由于这种攻击的几个细节:

  • 连接请求是正常的(所以不好防),但是源IP地址往往是伪造的,并且是一台不可达的机器,否则被伪造的机器会重置这些半开连接;
  • 半开连接也是有超时限制的,所以发送SYN包的速度要远大于服务器清除半开连接的速度;
  • 任何连接到Internet上并提供基于TCP的网络服务,都能成为攻击目标;
  • 这种攻击很难追踪!因为源地址往往不可信且不在线。

对于SYN FLOOD的防御,最常见的就是使用一个代理来接收TCP请求。这类代理可以通过真实客户端和伪造客户端的行为差异来对连接进行清洗,且由于代理的工作是单一的,能够进行硬件和操作系统TCP/IP协议栈的特别优化,或者开辟巨大的半开连接队列,具有较好的韧性。采用一系列策略(如Cookie源认证、reset认证,见参考资料8)确定对方连接的可用性之后,可以将源IP加入白名单,使其之后可以直连服务器;或者由代理向服务器发起连接,进行数据转发。

此外,在主机层面可以延缓TCP连接资源的分配。如SYN Cache技术:先完成第二次握手,但是并不立即分配资源,而是在一个专用Cache中保存这个半开连接的信息,直到收到正确的ACK再分配资源。

Smurf

Smurf攻击是一种病毒攻击,以最初发动这种攻击的程序“Smurf”来命名。这种攻击方法结合使用了IP欺骗和ICMP回复的办法,使得大量流量涌向目标网络或系统,造成拒绝服务的效果。

攻击者向一个具有大量主机和因特网连接的广播地址发送ICMP Echo请求,并用受害者的IP作为源地址;广播上的每台机器响应这些Echo请求,同时向受害者发送ICMP Echo-Reply应答;受害主机会被这些大量的应答包淹没。

这种攻击已经很少见,大多数的网络已经对这种攻击免疫了。挫败一个Smurf攻击的最简单的方法就让路由器在收到向一个广播地址的ICMP Echo信息时丢弃它。

HTTP Flood

常见的服务器在处理对某些URI的访问时需要消耗计算资源或系统资源,如果攻击者通过代理或僵尸主机向目标URI进行大量HTTP请求,将造成服务器资源的耗尽。以最典型的HTTP GET请求为例,针对服务器上某个文件进行快速的反复的读取,能造成服务器资源的减少;除了Web服务器之外,大量的HTTP请求可能产生大量的数据库查询,可以在几秒内使数据库停止响应。

你应该会对这类攻击产生一种熟悉感,HTTP FLOOD和SYN FLOOD不是有点相似么?是的,其防御手段也相去不远。

SYN FLOOD可以借助TCP代理来管理连接,而HTTP FLOOD也可以借助HTTP代理来解析HTTP请求。TCP代理通过Cookie源认证、reset认证等手段来甄别恶意程序和正常客户端,而HTTP的代理可以利用重定向、验证码等手段来甄别僵尸主机和正常客户端;除此之外,当目的IP流量触发警告阈值时,这样的代理可以对HTTP的源IP流量进行统计,对某个异常源流量进行限速;此外,代理还能监控源IP对某个URI的访问,当某个源主机短时间集中访问计算资源多的URL时,可以将其加入动态黑名单。

HTTP 慢速攻击

2012年的OWASP大会上,由Wong Onn Chee和Tom Brennan共同演示。

该攻击的基本原理是对HTTP服务器建立一个连接,指定一个比较大的content-length,然后以非常低的速度发包,维持住这个连接不断开。

显然,如果客户端不断地建立这种连接,服务器的可用连接资源会被逐渐占满,导致拒绝服务。而在客户端使用单线程方式建立较大数量的无用连接的代价非常低廉,使得这类攻击的成本也较低。

HTTP慢速攻击主要根据HTTP协议的内容分成三类:

  • Slow Headers。Web应用在处理HTTP请求之前要先接收完所有的HTTP头部,因为头部中包含了一些可能用到的重要信息。攻击者利用这点建立HTTP连接,保持慢速发送HTTP头部,且一直不发送头部终止符(两个连续的\r\n),这样服务器就认为对方的头部还没有发完,一直维持连接,占用资源。
  • Slow Body。攻击者发送一个HTTP Post请求,该请求的content-length很大,使得服务器误以为对方要发送很大的数据。但是客户端每次只发少量数据,使该连接一直保活。
  • Slow Read。客户端与服务器建立连接并发送一个HTTP请求,客户端发送完整的请求给服务端,收到回应后一直保持这个连接,以很低的速度读取Response。比如客户端很长一段时间不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时之前才读取一个字节,以消耗服务器的连接资源。

防御此类攻击的最简单办法就是设置一个超时时间和最小速率。如果客户端不能在配置时间发送完头部或body数据,服务器会返回一个408 REQUEST_TIME_OUT错误;如果客户端不能在指定时间内接受完数据,也会引发超时。

这样的防御措施实际上在网络条件不好的情况下会误伤正常用户,比如从中国大陆下载国外服务器上的大文件时,可能引发超时。

DDoS

分布式拒绝服务攻击(Distributed Denial of Service),是DoS攻击的改进版本。传统的DoS攻击是一对一的攻击,这在算力飞涨的今天已经效果较差了。

所谓分布式,就是控制大量的主机同时发动DoS攻击(如SYN FLOOD),规模越大,则流量成倍地上升,效果非常强悍。

CC攻击(Challenge Collapsar)

CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。这类攻击具有真实性高、检测困难、防御困难的特点。

在物联网快速发展的时代,物联网设备的安全却刚刚起步。许多IoT设备使用默认密码,且被控制之后往往没有任何症状,这使得IoT设备成为了发动DDoS攻击的理想肉鸡。世界上最大的僵尸网络Mirai就包含大量的物联网设备,它们曾发起大规模的分布式拒绝服务攻击,导致美国东海岸大面积断网。


篇幅有限,对于DoS的检测就不详细展开了。目前,常见的DoS检测是基于异常的检测,即通过监视审计系统记录系统上的异常情况。比如当日志记录到某一时段爆发大量的流量,超出了平时的统计阈值时,可能表示此时段系统受到了DoS攻击。

参考资料

[1] 百度百科.ping(网络诊断工具)[EB/OL]

https://baike.baidu.com/item/ping/6235

[2] 百度百科.ICMP[EB/OL]

https://baike.baidu.com/item/ICMP/572452

[3] 百度百科.Ping of Death[EB/OL]

https://baike.baidu.com/item/Ping%20of%20Death

[4] 小白教程.死亡之ping的工作原理以及如何预防[EB/OL]

https://www.schoolw3c.com/ping-of-death/

[5] 王道论坛.2021年计算机网络考研复习指导[M].北京:电子工业出版社,2020:147-157

[6] 孤君.IP首部[EB/OL].2019-03-17

https://blog.csdn.net/Wu000999/article/details/88617237

[7] 快快网络.什么是Teardrop攻击?我们要如何防御Teardrop攻击?[EB/OL].2019-03-13

https://www.jianshu.com/p/3ac57cfb3743

[8] 一只IT小小鸟.DDoS攻击–Syn_Flood攻击防护详解(TCP)[EB/OL].2018-08-22

https://blog.csdn.net/qq_34777600/article/details/81946514

[9] Java.Sheng.SYN Flood原理及防护[EB/OL].2016-04-16

https://blog.csdn.net/woaigaolaoshi/article/details/51166340

[10] 百度百科.land攻击[EB/OL]

https://baike.baidu.com/item/land%E6%94%BB%E5%87%BB/4759470?fr=aladdin

[11] 百度百科.Smurf攻击[EB/OL]

https://baike.baidu.com/item/Smurf%E6%94%BB%E5%87%BB/9112141?fr=aladdin

[12] fcm.HTTP Flood攻击与防御原理[EB/OL].2015-10-19

https://forum.huawei.com/enterprise/zh/thread-293931.html

[13] 中国网科技.Mirai僵尸网络再作乱 360:物联网设备成隐私泄露重灾区[EB/OL].2020-12-07

http://tech.china.com.cn/roll/20201207/372546.shtml

[14] wpjamer.CC攻击原理及防范方法[EB/OL].2018-05-12

https://www.cnblogs.com/wpjamer/p/9030259.html

有朋自远方来,不亦说乎?
Built with Hugo
Theme Stack designed by Jimmy