DDOS入门介绍(二):常见攻击手段与原理

摘要

DDos常用的攻击方式有多种:如SYN Flood,DNS query, ICMP Flood, UDP Flood等。本文从DDOS攻击资源种类的角度对常见的攻击手段进行描述

DDos常用的攻击方式有多种:如SYN Flood,DNS query, ICMP Flood, UDP Flood等。本文从DDOS攻击资源种类的角度对常见的攻击手段进行描述

1. 基础知识

想要比较理解本文接下来的内容,需要对TCP有个简单的了解,本章节对相关概念做个简单的说明

1.1 TCP

1.1.1 TCP定义

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

OSI的七层模型以及说明如下:

DDOS入门介绍(二):常见攻击手段与原理

TCP工作在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——DataLink层;在第二层上的数据,我们把它叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment。 同时,我们需要简单的知道,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端。这个基本的流程你需要知道,就是每个数据都会经过数据的封装和解封装的过程

1.1.2 三次握手

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。握手的过程可以用下面的图来表示

DDOS入门介绍(二):常见攻击手段与原理

TCP三次握手的过程如下:

1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

2. 攻击分类

2.1 网络带宽资源攻击

由于服务器的网络设备,路由器,交换机等基础设施对数据包的处理能力存在一定的上限,当到达的数据路包超过对应的上限时,就会出现网络拥堵,响应缓慢的问题。攻击者可以利用该特性,控制大量主机向目标机器发送数据包,造成网络设备繁忙,而使正常的请求无法得到及时的响应,造成拒绝服务。

针对网络设备的攻击主要包括以下几种:

1. 直接攻击

2. 反射放大攻击

3. 链路攻击

2.1.1 直接攻击

  1. ICMP/IGMP

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。

IGMP,就是Internet Group Management Protocol的意思。该协议用来在ip主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系,但不包括组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。所有参与组播的主机必须实现IGMP。

攻击者使用大量的受控主机向目标机器发送大量的ICMP/IGMP报文,进行Flood攻击以消耗攻击目标的资源。

  1. UDP

UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

由于UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

UDP Flood是比较常见的DDoS攻击,经常采用小包以及大包两种方式进行攻击

- 小包:小包是指64字节的数据包,这是以太网上传输数据帧的最小值,在相同的流量下,数据包越小,包的数量就越多,由于网络设备收到数据包时都要对其进行检查校验,所以该种方式可以有效的增加网络设备的工作压力。

- 大包:大包是指1500字节以上的数据包,其大小超过了以太网的最大传输单元。该种攻击可以有效的占用网络接口的传输带宽,迫使被攻击目标在接收到UDP数据时对进行分片重组,造成网络拥堵。

2.1.2 反射放大攻击

反射攻击(DRDOS -Distributed Reflection Denial of Service)与DoS、DDoS不同,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,形成拒绝服务攻击。

发动反射攻击时,需要在互联网上找到大量的反射器,某些种类的反射攻击并不难实现,例如ACK反射,只需要再互联网上找开发的TCP端口即可,而这种服务器在互联网上非常广泛。

放大攻击是一种特殊的反射攻击,特殊之处在于反射器对网络流量具有放大的作用,是DDoS中常用的技术手段,基本原理相对简单。对于一个C/S服务,如果Server到Client的Reponse报文比Client到Server的request报文更大,则实现了流量的放大。为了在DDoS中使用放大技术还需要满足一个条件,即Server提供的服务是基于UDP这样的无连接协议。

当Server端提供某种基于UDP(理论上raw ip也可以)的服务,例如DNS、SMTP、NTP等,找到一些请求,其中Reponse报文比Request报文大,利用这些可以放大的请求,Attacker发送一个伪造源IP的Request报文,源IP伪造成受害者的IP地址,Server收到Request报文后向受害者回复“放大的”Reponse报文,这样就实现了流量的放大。原理大致如下:

DDOS入门介绍(二):常见攻击手段与原理

常见的协议以及其放大倍数:

DDOS入门介绍(二):常见攻击手段与原理

  1. ACK反射攻击

ACK反射攻击是一种比较常见的反射攻击技术,攻击者利用TCP三次握手的原理,将SYN的的源IP地址伪装成Target的IP与发射器尝试建立TCP连接,反射器的应答就会直接转发给Target,在攻击的过程中会通过控制大量受控主机执行该钟操作,从而使反射器响应的大量ACK应答发向Target,占用Target的网络带宽资源并造成拒绝服务。

  1. NTP放大攻击

NTP(Network Time Protocol)是一个常见的协议,用于提供时间同步服务。它是典型的基于UDP的协议,这个协议相当古老,在最初的设计中也没有考虑到认证,所以是一个理想的黑客利用对象。

从表1我们看到NTP可以实现556.9倍的放大效果,这来自于NTP的monlist命令。NTP monlist命令用来查询最近所有和Server通信的记录,服务器返回最多600个通信记录,这个倍数非常巨大,而在互联网上有大量的NTP服务器,可以通过僵尸网络分布式查询、放大。

通过该种方式,可以将攻击流量放大6,7百倍

DDOS入门介绍(二):常见攻击手段与原理

如上图所示,Server端提供NTP服务,Attacker发送了一个NTP monlist Request给Server,但其源IP地址不是自己的IP地址,而是攻击对象Target的IP地址,Server收到请求后会向Target(而不是Attacker)发送Reponse报文。由于Reponse包含了和Server的600条时间同步记录,比Request大很多,是由很多报文组成的,因此实现了放大。

  1. DNS放大攻击

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

DNS的放大攻击原理与NTP类似,该种方式主要是利用DNS服务器的EDNS以及dig特性对流量进行放大。

  1. SNMP放大攻击

简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。

SNMP的放大攻击原理与NTP类似,该种方式主要是利用SNMPv1的 Get请求以及SNMPv2 的GetBulk 请求对流量进行放大。

2.1.3 链路攻击

链路攻击主要的攻击对象是骨干网上的链路带宽资源,攻击过程大致如下

(1) 通过traceroute等手段判断各个僵尸主机预将要攻击的链路的位置关系,将僵尸主机分为两个部分,这两个部分分别位于攻击链路的两头

(2) 控制其中一头的僵尸主机与另一边的主机进行通信,并收发大量数据,这些数据就会经过被攻击链路到达另一端

对于骨干网络而言,这些僵尸主机相互收发的数据是真实存在的数据,很难将其与正常流量的数据进行区分。

2.2 系统资源攻击

2.2.1 TCP链接攻击

  1. TCP Flood

    TCP FLOOD是一种针对TCP/IP协议发起的攻击,其明显特征是被攻击者的主机上存在大量的TCP连接。

    在TCP 三次握手的过程中,服务器会创建并保存TCP的连接信息,这个信息会被保存在连接表结构中,连接表的大小是有限的,一旦连接数到达连接表的最大存储数量,服务器就会因为无法创建TCP连接。

攻击者可以利用大量受控机器与Target建立大量的TCP连接,使其无法接受正常的TCP连接请求,从而达到拒绝服务的攻击目的。

  1. SYN Flood

SYN- Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。这种攻击早在1996年就被发现,但至今仍然显示出强大的生命力。很多操作系统,甚至防火墙、路由器都无法有效地防御这种攻击,而且由于它可以方便地伪造源地址,追查起来非常困难。它的数据包特征通常是,源发送了大量的SYN包,并且缺少三次握手的最后一步握手ACK回复。

攻击者首先伪造地址对服务器发起SYN请求(我可以建立连接吗?),服务器就会回应一个ACK+SYN(可以+请确认)。而真实的IP会认为,我没有发送请求,不作回应。服务器没有收到回应,会重试3-5次并且等待一个SYN Time(一般30秒-2分钟)后,丢弃这个连接。

如果攻击者大量发送这种伪造源地址的 SYN请求,服务器端将会消耗非常多的资源来处理这种半连接,保存遍历会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行 SYN+ACK的重试。最后的结果是服务器无暇理睬正常的连接请求—拒绝服务。在服务器上用netstat –an命令查看SYN_RECV状态的话,就可以看到有大量的连接状态是”SYN_RECEIVED”

  1. PSH+ACK Flood

在 TCP 协议中,到达目的地的报文将进入TCP栈的缓冲区,直到缓冲区满了,报文才被转送给接收系统。此举是为了使系统清空缓冲区的次数达到最小。然而,发送者可通过发送 PSH 标志为 1 的TCP 报文来起强制要求接受系统将缓冲区的内容清除。TCP PUSH+ACK 攻击与 TCP SYN 攻击一样目的在于耗尽受害系统的资源。当攻击者向Target主机发送PSH和ACK标志设为1的TCP报文时, 这些报文将使Target系统清除所有 TCP 缓冲区的数据(不管缓冲区是满的还是非满),并回应一个确认消息。如果这个过程被大量受控主机执行,系统将无法处理正常的数据,造成拒绝服务。

  1. RST Flood

在TCP连接的终止阶段,通常是使用带有FIN报文的四次交互来切断与客户端与服务端的连接,但是当客户端或是服务端其中之一出现异常时,将无法完成四次挥手终止连接,此时就会使用RST报文将连接强制中断。

RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

假如 A和服务器B之间建立了TCP连接,此时C伪造了一个RST包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击了。C应该如何伪造RST包了?

一个TCP连接都是四元组,由源IP、源端口、目标IP、目标端口唯一确定一个连接。所以,如果C要伪造A发给B的包,要在上面提到的IP头和TCP头,把源IP、源端口、目标IP、目标端口都填对。这里B作为服务器,IP和端口是公开的,A是我们要下手的目标,IP当然知道,但A的源端口就不清楚了,因为这可能是A随机生成的。当然,如果能够对常见的OS如windows和linux找出生成source port规律的话,还是可以搞定的,除此之外可以通过大量受控主机进行穷举的方式踩车A的连接端口。

除了需要解决A的端口问题,序列号问题也需要关注,序列号是与滑动窗口对应的,伪造的TCP包里需要填序列号,如果序列号的值不在A之前向B发送时B的滑动窗口内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动窗口的序列号。这个可以暴力解决,因为一个sequence长度是32位,取值范围0-4294967296,如果窗口大小像上图中我抓到的windows下的65535的话,只需要相除,就知道最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。通过在多个控制主机上进行穷举很快就能算出需要的值。

  1. Sockstress

Sockstress与前面的几个洪水型的攻击不同,该种攻击不需要在短时间内发送大量的攻击流量,此种攻击属于慢速攻击。

在TCP传输数据时,数据会先存在接受缓冲区,缓冲区的大小是由TCP窗口表示的,如果窗口大小设置为0,表示缓冲器已经被填满,发送端应该停止发送数据,直到接收端窗口发生了更新,Sockstress就是利用该原理长时间的维持TCP连接,达到拒绝服务的目的。

攻击方首先会完成三次握手建立连接,但是在三次握手的最后一个ACK应答中,将TCP窗口大小设置成0,随后进行一次数据请求。攻击目标把请求结果传给攻击方时,发现TCP窗口大小是0便停止数据传输,并发出TCP窗口探测包,询问攻击者TCP的窗口是否有更新,由于攻击者不会更新窗口大小,所以攻击目标会一直维护TCP连接等待数据发送,并不断的进行TCP窗口大小探测。当僵尸网络的受控主机数量较多时,Target的连接表会逐渐被耗尽,从而导致拒绝服务。

Sockstress的另外一种方式是将TCP窗口设置的很小,这样Target在传输数据时就需要把数据切分成多个小的分片进行发送,这会较大的消耗内存与CPU资源,导致拒绝服务。

2.2.2 SSL链接攻击

  1. THC SSL DoS

在进行SSL数据传输之前,通信双方首先需要进行SSL握手,协商加密算法交换加密秘钥,进行身份验证。通常这样的SSL只需要一次,但是在SSL协议中有个Renegotiation选项,通过该选项可以进行秘钥的重新协商以建立新的秘钥。

德国黑客组织“The Hacker’s Choice”发布了工具THC SSL DOS,与传统DDoS工具不同的是,只需要一台执行单一攻击的电脑就能迅速消耗服务器资源,造成服务器拒绝服务。

这个攻击的方式是攻击者可以在一个SSL连接中不停的快速重新协商,而协商加密算法的时候服务器CPU的开销是客户端的 15 倍左右。如果有大量的受控主机同时进行攻击,则会使服务器忙于协商秘钥而完全停止响应。

  1. SSL Flood

在SSL握手的过程中,无论客户端传送过来的数据是否有效,服务器都需要花费较多的CPU资源进行解密与数据的有效性验证,攻击者可以利用该特性进行洪水攻击。

对于攻击者而言,并不需要关心服务器端解密与验证的结果,所以也很容易快速构建出请求数据,且保证消耗的资源较少。

2.3 应用资源攻击

2.3.1 DNS服务攻击

  1. DNS Query Flood

DNS Query 洪水攻击是指向DNS服务器发送大量的查询请求以达到拒绝服务的效果。

该攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络上根本不存在的域名,被攻击的DNS服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS 服务器会向其上层DNS服务器递归查询域名信息。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。

根据微软的统计数据,一台DNS服务器所能承受的动态域名查询的上限是每秒钟9000个请求。而我们知道,在一台P3的PC机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的DNS服务器瘫痪,由此可见DNS服务器的脆弱性。目前最常用的DNS服务器软件是国内领先的WINMYDNS,以及国外的Bind等。

通常攻击者采用的手段包括:

  • 利用发包程序向DNS服务器发送不带任何负载的NULL数据包。由于数据包本身不符合协议规定,服务器在收到报文的时候将直接丢弃。因此这种攻击方式除非攻击流量比较大,否则不会有明显的效果。

  • 利用程序构造DNS解析请求固定的域名,由于DNS服务器在解析请求的时候会在系统cache存放上一次解析的结果,这种攻击方式也需要较大的流量。

  • 向DNS服务器发起解析请求随机的、不存在的域名;这样DNS服务器就需要进行频繁的字符串匹配,由于在本地无法查到对应的结果,服务器必须使用递归查询向上层域名服务器提交解析请求,引起连锁反应。

    目前尚没有防火墙能对DNS服务器的攻击进行防护,只有少数的专业防护设备可以做到。

    1. DNS NXDOMAIN Flood

DNS NXDOMAIN Flood 攻击与DNS QUERY Flood 类似,只不过其查询的都是真实的域名。

在进行DNS NXDOMAIN Flood攻击时,会对DNS服务器进行多次查询,使DNS服务器的缓存中保存的都是攻击者的查询结果,最终导致正常用户的DNS解析请求的速度变慢。

有些DNS服务器会在获取不到域名的解析结果时,会通过递归方式向上层DNS服务器发送查询请求并等待应答,这进一步增加了服务器的资源损耗。

2.3.2 WEB服务攻击

  1. HTTP Flood

击者通过代理或僵尸主机向目标服务器发起大量的HTTP报文,请求涉及数据库操作的URI(Universal Resource Identifier)或其它消耗系统资源的URI,造成服务器资源耗尽,无法响应正常请求。例如门户网站经常受到的HTTP Flood攻击,攻击的最大特征就是选择消耗服务器CPU或内存资源的URI,如具有数据库操作的URI。

  1. Slowloris慢速攻击

上面介绍的几种攻击类型大多是洪水型,以多取胜,而Slowloris显得有点与众不同。

HTTP慢速攻击是利用HTTP协议的正常交互机制,先与目标服务器建立一个连接,然后长时间保持该连接不释放。如果攻击者持续与目标服务器建立这样的连接,就会使目标服务器上的可用资源耗尽,无法提供正常服务。

Slowloris攻击是利用web server的漏洞(或者说是参数配置不合理),直接造成拒绝服务。Slowloris是在2009年由著名Web安全专家RSnake提出的一种攻击方法,其原理是以极低的速度往服务器发送HTTP请求。由于Web Server对于并发的连接数都有一定的上限,因此若是恶意地占用住这些连接不释放,那么Web Server的所有连接都将被恶意连接占用,从而无法接受新的请求,导致拒绝服务。

怎么算是恶意的请求呢,可以构造一个局部http请求,也就是一个不完整的http请求。

一个正常的http请求,如下:

GET / HTTP/1.1/r/n HOST: host/r/n User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)/r/n Content-Length: 42/r/n/r/n '

最后的两个/r/n表示http请求头结束,如果我们去掉一个/r/n就表示这么包没完成,那么服务器就会等待客户端继续发送这个包的剩余部分,此时客户端再发送任意HTTP头,保持住连接即可。

当构造多个连接后,服务器的连接数很快就会达到上限。apache默认连接数150个,所以我们只要建立150个这样的连接,apache就无法再处理新的请求,拒绝服务。

  1. 慢速POST攻击

慢速POST与Slowloris类似,只是该方法是利用HTTP BODY的方式达到目标服务器其资源耗尽的目的,该攻击第一次在技术社区被正式披露是2015年的OWASP大会上,由Wong Onn Chee 和 Tom Brennan共同演示了使用这一技术攻击的威力。

Slow POST攻击利用的是POST请求方法,攻击者向目标服务器发送POST请求报文提交数据,数据的长度设置为一个很大的数值,但是在随后的数据发送中,每次只发送很小的报文,这样就是导致目标服务器一直等待攻击者发送数据。如果攻击者控制大量的僵尸主机向目标服务器发起这种攻击,将会导致服务器资源耗尽,无法正常提供服务。

  1. 数据处理过程攻击

WEB服务器在收到HTTP请求后需要检查请求的数据,通过构造恶意的请求数据内容,增加数据处理过程的资源消耗,造成拒绝服务的目的。常用的方式如下

  • 正则表达式拒绝服务:WEB应用通常会使用正则表达式进行字符串的匹配操作,一部分正则表达式引擎会使用一种被称为非确定性有限自动机(NFA)的实现方式来处理复杂的正则表达式。但是NFA也会时处理时间增加,尤其是在确定“否定匹配”时,正则匹配引擎需要对所有可能的匹配路劲全部进行测试。如果正则表达式写的不够好,需要测试的匹配数据会出现指数级的增长。 通过恶意程序只需要构造的较短的字符串,就可以强制正则引擎执行数亿次匹配操作。如果出现大量的类似操作,就会耗尽服务器资源,达到拒绝服务的目的。

  • Hash冲突拒绝服务:WEB应用在处理请求中的POST数据时,通常使用键值对的方式进行存储,Python,Java等语言中键值对的本质就是一个HASH表,正常情况下HASH表中KEY的冲突应该较少。如果攻击者构造的POST请求中KEY全部相同,则对HASH表操作就类似于对链表的操作,造成响应缓慢,资源消耗增加,最终可能导致拒绝服务。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: