DDOS浅谈

一、DDOS攻击的来源

任何攻击都不会凭空产生,DDOS也有特定的来源。绝大多数的DDOS攻击都来自于僵尸网络。僵尸网络就是由数量庞大的可联网僵尸主机组成,而僵尸主机可以是任何电子设备(不仅是X86架构的设备,更多反而是物联网中的ARM架构设备),只要被植入僵尸程序即可!

僵尸网络有一个特点:控制者和僵尸主机之间存在一对多的关系,在控制者发布命令后就可以断开与僵尸网络的连接,之后控制命令会在僵尸主机之间自行传播和执行。

  僵尸网络架构一般有以下两种:

    1、client—to—server型:

      client—to—server型僵尸网络是一种典型的星型拓扑,由若干僵尸主机和控制服务器两部分组成。

这种僵尸网络相对比较传统,僵尸主机在被植入僵尸程序后会主动连接一个固定的地址(即控制服务器),然后由控制服务器进行集中管理。

      这类的僵尸网络控制相对较容易,而且能快速分发控制者的命令,但是这种控制方式也存在两个重要的不足:

        ①、控制服务器一旦故障则整张网络失效

        ②、从僵尸主机侧可以查出控制服务器的地址(容易被抓)

     P2P型:

相比client—to—server型P2P型就显得略微复杂一些。在P2P型僵尸网络中充当控制服务器的节点不再单一,而是每台僵尸主机既扮演控制服务器的角色又扮演客户端角色。这样就解决了传统client—to—server型僵尸网络控制服务器单点故障的问题。当然,随之而来的是更加复杂的网络拓扑维护算法。

这种僵尸网络每台僵尸主机都有一张有限的邻居表,并周期性的向其邻居表内的主机发送keeplive包来维护整个僵尸网络。每台僵尸主机在被植入僵尸程序的时候会将上游的邻居表一同植入,并将上游僵尸主机作为主下一跳,邻居表内的其他主机作为备下一跳(主失效后备上位,确保网络不中断),然后继续感染其他主机,在成功感染下一台主机后将对自身邻居表进行优化(将自身作为邻居表中的一员,并随机删掉一个老邻居)后传递给被感染主机,以此递归循环下去,最终构成一张庞大的僵尸网络。(学过网络的同学一定觉得这跟路由协议如出一辙)

那么攻击者是怎样来控制这样一张僵尸网络呢? 攻击者只需要与这张网络中的任意一台僵尸主机进行通信(一般需要经过认证)即可从此节点注入其控制命令,然后指令就如同蜻蜓点水的水波一样向周围扩散,直到扩散至这张网络的边缘。当然,在僵尸主机收到指令后会先判断该指令是否已经存在,如已存在则不处理(僵尸网络也需要防环)

站在监察者的角度来说,通过捕获一个节点可以发现此僵尸网络的许多僵尸主机,但却很难看到其全貌(这根绳子不知道捋到什么时候算个头)

 

二、DDOS攻击类型:

  攻击服务端的:

    1、攻击带宽型:

      ①、直接攻击目标型:

      向目标发送大量数据包,以占满被攻击者的带宽,从而实现拒绝服务的目的。例:

        UDP洪水攻击:

这是一种最简单粗暴的方法,利用UDP协议直接向目标发送大量的数据包来堵塞对方带宽。但是这种方法对自身要求也极高,属于伤敌一千自损也一千的行为(假如对方带宽10G,那自己这边也需要10G的带宽才可以)。

往往攻击者在带宽资源方面处于劣势,这时他们就会想,有没有可以以小博大的方法呢?有!那就是利用反射攻击。。。即:自身发出1G的流量,经过反射器放大后变为10G甚至更大的流量!

反射攻击的原理:

攻击者使用僵尸主机向放大器发送大量请求数据包,这些数据包的特别之处在于源IP地址为被被攻击目标的IP地址。反射器在收到数据包时会认为数据包是由攻击目标所发来的请求,所以会将响应数据发送给攻击目标。当大量的响应数据包发向攻击目标时就会耗尽攻击目标的网络带宽,造成拒绝服务攻击。

反射攻击一般用来做放大攻击使用,很多网络协议的请求和响应数据量差别很大(有的协议最大响应数据可以是请求数据的成百上千倍),反射放大攻击也正是利用了这点,故反射器的放大倍数越大攻击所产生的流量也就越大。

在互联网上可以用来做反射器的设备很多,通常只需无需认证或握手就行。因为增加了一个反射步骤,所以更加难以溯源攻击来源。

下面列举一些比较常见的反射放大攻击类型:

DNS反射攻击

NTP反射攻击

SNMP反射攻击 

       ②、攻击中间链路型:

攻击链路型与攻击目标型相比,最根本的区别在于攻击的目标不同。攻击链路型攻击的目标不是作为互联网端点的服务器带宽资源,而是骨干网上的链路带宽资源。当黑客将用户到达目标服务器中间的链路带宽资源耗尽时,用户的流量就不能正确转发至目标服务器了,从而造成拒绝服务工具。(不过这种攻击有一个副作用,就是被攻击骨干网下游的所有服务器都将受牵连。笔者所在公司就曾因为微博被打而误伤)

 

 

    2、攻击系统资源型:

很多云安全厂商在宣传时都会以“我们防住了XXXGB流量的DDOS攻击”来描述攻击的猛烈程度,这种宣传方式容易让人误以为只有大流量才是DDOS。实际上是除了带宽资源,DDOS攻击还可以是消耗系统(比如CPU、内存、网络连接表等)。例如SYN洪水攻击,很多时候人们容易把它认为是消耗带宽型的DDOS攻击,实则不然,它最大的危害在于消耗系统连接表资源。

在消耗系统资源型中大致可分为这么三类:

①、消耗网络连接表型

  在TCP三次握手进行中,服务器会创建并保存TCP连接的信息,这个信息通常被保存在连接表结构中。但是连接表的大小是有限的,linux默认一个端口最大支持1024个连接(可以通过ulimit -n来查看支持最大连接数),一旦服务器的连接表满了就无法再创建新的TCP连接了。

  此时,攻击者就可以利用大量僵尸主机,通过建立大量恶意的TCP连接占满被攻击目标的连接表,使目标无法接受新的TCP连接请求,从而达到拒绝服务的目的。

②、消耗内存型

在服务端优化了最大连接数后连接数将不再是瓶颈,但是每条连接总要占用内存资源吧,这么说来只要和目标建立足够多的TCP连接就可以将目标设备内存占满了。但是有个前提,就是建立TCP连接后不能撒手。

相比其他洪水攻击来讲这种方式在速度上可以不用那么快,不是一拳就把对方打到,而是在前面压力不释放的前提下一点一点的给对方累加压力,直到到达对方的性能瓶颈为止。这种攻击也俗称:慢速DOS攻击!

  面对web服务有这么几种常见的维持长链接手段:

1、将content-length设为一个较大的值,但是每次http body只缓慢的发送一个较小的值,这样将一个大数据分多次且有间隔时间的发送就可延长和服务端的连接

2、攻击者将自身的TCP窗口调为一个很小的值,这样目标就会将一个较大的数据切成很小的块分多次返回,以此来拖延传输时长

3、在http协议中规定,http头部以连续的'\r\n\r\n'作为结束标志,因此攻击者可以一直不发'\r\n\r\n'好让服务端以为客户端的请求还没发送完毕而处于等待状态

  经典的慢速DOS攻击工具:slowhttptest

③、消耗CPU型

在系统资源里还有最重要的一项资源,那就是cpu! 如果目标设备开启的服务里有需要大量计算的地方那对于攻击者来说将会是很大的诱惑。比如说你提供的服务有3项功能,其中一项明显比另外两项更加消耗cpu资源,那攻击者就可以专挑你这个最耗cpu的功能来疯狂使用,直至将你的cpu资源耗尽!

最常见的消耗cpu攻击为ssl攻击。在ssl协议握手过程中需要使用非对称密钥算法进行加解密运算,而非对称加解密运算又十分消耗cpu资源,所以ssl协议成了攻击者实行DOS攻击的乐土。攻击者可以通过反复不断地进行ssl协商来耗尽目标cpu资源,以达到拒绝服务的目的

经典的SSL协商DOS攻击工具:thc-ssl-dos

 

3、攻击应用资源型:

  一些应用程序可能自身就存在拒绝服务漏洞,此时不用大量的僵尸主机,只需要使用一台设备向目标程序发送指定恶意代码就可使目标服务程序崩溃,以此达到拒绝服务攻击的目的。

 

4、攻击场景举例(彩蛋!  站在攻击者视角来进行一次DDOS攻击,请勿用于实际环境):

①、DNS攻击:

小明想让某小区不能上网。但由于自己手头带宽资源有限,没有能力来堵塞小区出口带宽。于是小明就想,大家上网除了要使用网络外还需要什么呢?对!DNS服务器!而且小区用户的DNS大多是使用DHCP的方式来获取的,那就是说有很大概率他们用的是同一台服务器,而且这台服务器的地址很容易获取到(假设这里的DNS服务器地址是1.1.1.1)。

现在被攻击目标就确定了,只需要把这台DNS服务器搞定就可以搞定一片用户。那么这台DNS服务器该怎么拿下呢? 渗透?一时半会儿恐怕搞不定。。。 社工?好像有点难度。。。 拒绝服务?好像可以琢磨琢磨。。。

小明想,DNS的正常业务逻辑是提供域名解析服务,那只需要让它超负荷工作就能起到拒绝服务攻击的目的了呢。那怎么才能让它超负荷工作呢?正常情况下DNS服务器收到一个查询请求后先看是否能命中自己的缓存,如果不命中才会向上级DNS进行查询。。。就是这!DNS的缓存机制缓解了它很大一部分压力,我只需要让它的缓存机制失灵就可以增大它的压力了!于是小明使用多台肉鸡向该DNS服务器疯狂发送不同域名的解析请求,导致该DNS服务器的缓存不断被刷新,而大量解析请求不能命中缓存从而必须消耗额外的资源进行迭代查询,最终导致这台DNS不堪重负不能及时处理正常的业务请求。

随后小区居民纷纷向运营商投诉宽带不给力,网太卡甚至网不通。(网络工程师们哭晕在厕所,又躺枪!)

 

②、WEB攻击

小明这次又瞄上了某网站,为了让用户不能正常的访问该网站小明真是挠破了头,侦查了半个月也没找到可以渗透的点。于是小明决定来个鱼死网破,直接D它!

还是由于上面那个原因,小明这种个体户手里的带宽资源比较有限,打大流量的DDOS不太现实。然后小明就想了,虽然我手里的肉鸡都比较“瘦”,但麻雀虽小五脏俱全啊,它再“瘦”也总有65535个端口吧! 打打慢连接攻击消耗消耗目标设备的内存还是可以的嘛!

小明想,既然目标提供的是web服务,那只需要和目标建立HTTP后不撒手就好了。在HTTP的头部信息中正好有一种头部信息可以用在这里,那就是Content-Length。当web服务器收到含有Content-Length的请求时,服务会将该字段的值作为http请求包的body长度,利用这个特点就可以长时间与web服务器保持连接。如果目标服务器上新来的全是这种只握手不撒手的连接,那用不了多久服务端的内存资源就耗尽了。想到这里小明还有有点小激动呢。。。

心动不如行动,于是小明将手里肉鸡的每个端口都尽可能的利用起来,向目标发送一个Conetent-Length为10000的POST请求,然后将POST body以非常缓慢的速度一个字节一个字节的向web服务器发送。此时,目标服务器需要一直维持与小明的连接来等待其数据传输结束。由于小明一台肉鸡就可产生几万的并发,那么没用多少台肉鸡就成功将目标服务器内存撑满(假设目标服务器内存为32G,32G内存最大也就支持几十万并发),最终导致目标服务器不能与新来的正常用户建立连接。

  

  攻击客户端的:

在传统概念里一般提到DDOS一般都是打服务端,其实不然,攻击客户端侧也有类似的攻击。比如说RST洪水攻击!

在已经建立TCP握手的连接中,如果收到对方发来的RST置位的TCP包,该TCP连接将强制断开。正是利用这点,攻击者可以冒充客户端来向服务端发送RST报文以打断客户端与服务端的连接,起到对客户端拒绝服务的目的。但是想要让服务端接受自己伪造的RST报文需要端口号和序列号都对得上才行。大多数环境下攻击者又难以捕获实际流量,此时攻击者就可以利用大量僵尸主机冒充客户端向服务端发送随机的端口号和序列号组合来撞运气,一旦撞对了该客户端就将失去与服务端的连接关系。

 

 

三、DDOS的缓解方案

  DDOS这种攻击现在谁也不能保证可以100%根治,只能是最大限度的缓解这种攻击带来的影响。常用的缓解DDOS手段有三种:

  1、CDN:

CDN技术的初衷其实是为了提高互联网用户对网站静态资源的访问速度。但由于其分布式的特点,用户访问过来的流量其实是分散在不同机房的。同样的,它也能够对分布式拒绝服务攻击的流量产生稀释分散作用。

其实CDN的本质就是在互联网范围内设置多个节点作为代理缓存,并将用户的访问请求导向最近的缓存节点,以减少网络访问延迟的一种技术。

那用户是怎么就被导向最近的缓存节点了呢?这个里面就要用到DNS调度了。在DNS系统中,一个域名会对应一张IP地址表,当收到域名解析请求时,DNS会查看DNS请求的源IP地址,再根绝这个源IP地址来决定将域名解析解析至哪个CDN节点。当CDN节点收到用户的请求时,首先在其缓存内容中寻找用户请求的资源,如果找到则直接返回给用户;如果找不到,则CDN节点会作为代理服务器向源站请求该资源,获取资源后再将结果缓存并返回给用户。

根据这个原理,在发生DDOS时,DNS会将来自不同位置的攻击流量分散到就近位置的CDN节点上,从而达到稀释流量、缓解攻击的效果。

不过这种方式也有两个弱点: 1、如果攻击者攻击的不是域名,而是一个IP的话就没辙了 2、这种技术只适用于静态业务,对于动态业务就没辙了(所以游戏业务往往是DDOS的重灾区)

  2、IP_Anycast

IP_Anycast是一种基于路由协议实现负载均衡的技术。在网络中部署多台IP地址相同的服务器,并使用动态路由协议对外进行宣告,此时由于路由开销原因对于请求报文会被网络路由到拓扑中最近的一台服务器上去。

其实IP_Anycast本质上也是通过分布式部署来稀释攻击流量,从而达到缓解DDOS攻击的效果

3、流量清洗系统

在市面上有这样一种流量清洗系统,它一般由DDOS攻击预警模块和DDOS攻击清理集群两部分组成。 攻击预警模块负责攻击发现,攻击清理集群负责流量清洗。

流量清洗系统可以从全部的网络流量中区分出正常流量和恶意流量,然后将恶意流量丢弃,只将正常的流量交付给后端业务服务器。

流量清洗系统部署方式:

在网络入口处部署一个分光器来将流量镜像一份给DDOS攻击预警模块,当攻击预警模块发现攻击流量时将进入机房内的流量牵引至DDOS攻击清理集群进行流量清洗,清洗完后将干净流量再回注至后端业务服务器

清理集群常用的恶意流量检测方式有这么几种:

基于威胁情报的过滤:对数据包的源IP地址进行检查,将其和威胁情报库内的IP进行比对,如果存在于威胁情报库则丢弃相应数据包。

特征码匹配:特征码分为静态特征码和动态特征码。静态特征码是与事先规定好的特征码进行比对;动态特征码是基于机器学习现场学习攻击特征。

速率检查与限制:一些攻击方法在数据包载荷上可能不存在明显特征,没有办法进行攻击特征匹配。这时就可以通过速率检查来进行清洗了

协议完整性校验:大多数攻击往往只发送攻击请求,而不接收服务器响应数据,此时清理集群就可以代替后端业务服务器向数据包的源IP地址进行应答,如果数据包的源IP没有响应则认为该IP为攻击者IP。

向客户端发起挑战:对于协议完整性校验可以还有漏网之鱼,这时可以主动向客户端发送一个问题,需客户端进行正确应答后方可通过,例如验证码等。

 

 

posted @ 2019-08-14 10:03  白桦林_HK  阅读(1425)  评论(0编辑  收藏  举报