Skip to content

Latest commit

 

History

History
161 lines (84 loc) · 9.3 KB

DDoS.md

File metadata and controls

161 lines (84 loc) · 9.3 KB

DDOS 应用层拒绝服务攻击

DDOS 又称分布式拒绝服务,全称是 Distributed Denial of Service。其原理是利用合理请求,造成资源过载,导致服务不可用。

我们可以将服务看作一个大型火车站,其轨道数量以及泊道的数量,直接影响了这座火车站的服务水平。轨道少了,火车进不了站,泊道少了,可以停泊的火车也少了。同一时段,如果有大量的火车进站,就会造成拥堵。

主要大型事件

  • 2007年5月,爱沙尼亚三周内遭遇三轮DDoS攻击,总统府、议会、政府部门、主要政党、主流媒体和大型银行网站均陷入瘫痪,北约顶级反网络恐怖主义专家前往救援。

  • 2016年10月,美国DNS服务商Dyn遭遇DDoS攻击,包括Twitter、Spotify、Airbnb、Visa等网站无法访问,大半个美国集体断网,媒体形容此次事件为“史上最严重DDoS攻击”。

  • 2018年9月,再惠网络短信接口受到不明来源的类DDOS攻击,导致服务异常。

攻击你的带宽(UDP flood)

UDP协议是一种无连接的服务,在UDP Flood 中,攻击者通常发送大量伪造源IP地址的小UDP包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100k bps的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。

ICMP flood

ICMP(Internet控制报文协议)用于在IP主机、路由器之间传递控制消息,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。通过对目标系统发送海量数据包,就可以令目标主机瘫痪。

上述传统的流量型攻击方式技术含量较低,伤人一千自损八百,攻击效果通常依赖受控主机本身的网络性能,而且容易被查到攻击源头,单独使用的情况已不常见。

NTP flood

NTP是标准的基于UDP协议传输的网络时间同步协议,由于UDP协议的无连接性,方便伪造源地址。攻击者使用特殊的数据包,也就是IP地址指向作为反射器的服务器,源IP地址被伪造成攻击目标的IP,反射器接收到数据包时就被骗了,会将响应数据发送给被攻击目标,耗尽目标网络的带宽资源。一般的NTP服务器都有很大的带宽,攻击者可能只需要1Mbps的上传带宽欺骗NTP服务器,就可给目标服务器带来几百上千Mbps的攻击流量。

因此,“问-答”方式的协议都可以被反射型攻击利用,将质询数据包的地址伪造为攻击目标地址,应答的数据包就会都被发送至目标,一旦协议具有递归效果,流量就被显著放大了,堪称一种“借刀杀人”的流量型攻击。

原理如下:

ddos1

  1. 攻击者发送虚假的UDP请求;

  2. 伪造源IP地址:将请求包中的源IP地址替换成受害者的IP地址,这些请求包中通常不会出现攻击者自己的IP地址;

  3. 每个请求包都发往一个随机的反射服务器;

  4. 经过伪造的数据包通过网络传输最终到达反射服务器;

  5. 反射服务器接收到这些虚假的请求包,遵从约定的协议规则,发送响应;

攻击系统/应用

SYN flood

TCP建立连接过程需要经过三次握手,在三次握手成功之后,建立连接,进而进行数据传输;假设有客户端和服务器,客户端向服务器发起连接请求:

  1. 客户端向服务器发送SYN报文,包括客户端使用的端口号和初始序列号。

  2. 服务器收到SYN之后向客户端回复SYN-ACK报文。

  3. 客户端收到SYN-ACK之后向服务器发送确认后的ACK报文。

经过上述三个步骤,整个连接建立过程结束;

上述过程中,在服务器收到SYN报文之后,会在内部建立连接请求控制块,该控制块用于跟踪连接建立过程和状态,控制块的生命周期如下:

  1. 如果收到最后一个握手ACK报文,该控制块会转换成为正式的连接控制块;

  2. 如果迟迟未收到最后的那个ACK报文,服务器会通过定时器重发SYN-ACK,直至超时,销毁请求控制块;

在SYN flood攻击时,首先伪造大量的源IP地址,分别向服务器发送大量的SYN包,服务器会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP地址不会应答,服务器没有收到回应,会重试35次,大约持续2030秒,如果超时,才会丢弃这个连接。

攻击者大量伪造这种请求,服务器会消耗大量的资源(CPU和内存)来处理这种半连接,同时还要不断对这种连接进行重试,最后服务器没有资源回应正常连接,导致拒绝服务。

对抗SYN flood的方法

  • SYN Cookie/SYN Proxy

为每一个IP地址分配一个"Cookie",并统计每一个IP地址的访问频率。如果短时间内收到大量来自于同一个IP地址的数据包,则认为收到攻击,之后来自于这个地址的包将会被丢弃。

  • Safe Reset技术

该技术实际上是对正常的TCP连接建立过程进行了干预性的校验;过程如下:

(1) 客户端发送SYN报文;

(2) 防火墙模拟服务器向客户端回复SYN-ACK,其中的确认序号设置为一个错误的序号,并且通过客户端信息计算一个Cookie值作为SYN-ACK的序号发给客户端;

(3) 客户端收到错误的SYN-ACK之后,正常会发送RST结束连接;

(4) 防火墙收到RST后,检测其Cookie,如果检测通过,则后续请求放行,进入流程(5);如果未收到RST或者Cookie校验未通过,则做丢包处理;

(5) 客户端重新发送SYN报文; 防火墙放行状态,不会干预连接建立请求;客户端与服务器正常完成三次握手建立连接;

CC攻击

"CC攻击"的前身是一个叫fatboy的攻击程序,当时黑客为了挑战绿盟的一款反DDOS设备而开发了它。当时绿盟有一款叫“黑洞(Collapasar)”的反DDOS设备,黑客将fatboy所实现的攻击方式叫作 ChallengeCollapasar,这就是CC攻击的由来。

CC攻击的原来比较简单,就是对一些资源消耗比较大的接口不断发起正常的请求,以达到消耗服务器资源的目的。Web应用中,查询数据库、读写文件等操作,都会比较消耗资源。

CC攻击的方式也有很多,在一些流量比较大的页面中,嵌入CC攻击的请求。或者,通过代理服务器不断对某一个接口发起请求。

对抗CC攻击的方法

  • 限制请求频率

通过IP与Cookie定位一个客户端,如果客户端请求在一定时间内过于频繁,则对之后来自该客户端所有请求重定向到一个404页面。

  • 使用验证码

对于一些异常接口,要求输入验证码

验证码:(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

slowloris攻击

一提起攻击,第一反应就是海量的流量,海量的报文。但是有一种攻击却反其道而行之,以慢著称。

HTTP协议规定,HTTP Request以rnrn结尾表示客户端发送结束,服务端开始处理。 那么,如果永远不发送\r\n\r\n会如何?SlowLoris就是利用这一点来做DDoS攻击。攻击者在HTTP请求头中将Connection设置为Keep-Alive,要求Web Server保持TCP连接不要断开,随后缓慢的每隔几分钟发送一个key value格式的数据到服务端,如a:b\r\n,导致服务端认为HTTP头部没有接收完成而一直等待。如果攻击者使用多线程或者傀儡机来做同样的操作,服务器的WEB容器很快就被攻击者占满了TCP连接而不再接受新的请求。


补充

ReDOS

正则表达式如果写得不好,如果被人利用,也会消耗大量资源,这种攻击方式被称为ReDos。

比如 ^(a+)+$

console.time('a');
/^(a+)+$/.test('aaaaaaaaaaaaaaaaaaaax');
console.timeEnd('a')

console.time('b');
/^(a+)+$/.test('aaaaaaaaaaaaaaaaaaaaax');
console.timeEnd('b')

html5下的僵尸网络

我们设想一下网络中是否可以存在这样一个僵尸节点:用户在日常上网时打开一个正常的网页浏览,但在用户不知情的情况下,此网页的背后正在疯狂地向外发送大量的数据请求,此时攻击源实际上就是用户的浏览器。只要用户不关闭这个网页,数据请求就会一直发送。如果这样的僵尸节点存在,那么众多的此僵尸节点必然会构成僵尸网络。

Web Worker

Web Worker 是运行在后台的 Javascript,独立于其他脚本,不会影响页面的性能。下面简单列举一下Web Worker能够做什么。

  1. 可以加载一个JS进行大量的复杂计算而不挂起主进程,用户可以在Worker运行期间做点击、选取内容等等任何事情;

  2. 可以通过postMessage,onmessage方法进行线程通信;

  3. 可以在Worker中通过importScripts(url)加载另外的脚本文件;

  4. 可以使用 setTimeout,clearTimeout,setInterval,clearInterval等方法;

  5. 可以使用XMLHttpRequest来发送请求,以及访问navigator的部分属性。

demo


2018上半年互联网 DDoS 攻击趋势分析