防 Ddos-DDoS 攻击原理

闲谈 1,938
闲谈 1,938

相比常规的渗透测试攻击来说,DDoS 攻击比前者更具危害性,为什么这么说呢?因为发动一次大规模的 DDoS 攻击只需要拥有一定数量的僵尸网络即可,而完成一个渗透测试是需要长期及一定的技术水平才可以。而实施后者(DDoS)的门槛相对前者来说低了许多,而造成的危害后果却不亚于前者,可以说 DDoS 攻击是目前最强大、最难防御的攻击之一。本文由阿里巴巴的高级专家编写,带领大家认识及了解这种攻击的防御办法。

敌情篇 ——DDoS 攻击原理

  1. DDoS 攻击基础

DDoS(Distributed Denial of service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大、最难防御的攻击之一。

按照发起的方式,DDoS 可以简单分为三类:第一类以力取胜,海量数据包从互联网的各个角落蜂拥而来,堵塞 IDC 入口,让各种强大的硬件防御系统、快速高效的应急流程而无用武之地,这种类型的攻击典型代表是 ICMP Flood 和 UDP Flood,现在已不常见;第二类以巧取胜,灵动难以察觉,每隔几分钟发一个包甚至只需要一个包,就可以让豪华配置的服务器不再响应。这类攻击主要是利用协议或者软件的漏洞发起,如 Slowloris 攻击,Hash 冲突攻击等,需要特定环境机缘巧合下才能出现;第三类是上述两种的混合,轻灵浑厚兼而有之,既利用了协议、系统的缺陷,又具备了海量的流量,如 SYN Flood 攻击,DNS Query Flood 攻击,是当前的主流攻击方式。

下文将一一描述这些最常见、最具代表性攻击方式,并介绍他们的防御方案。

1.1 SYN Flood

SYN Flood 是互联网上最经典的 DDoS 攻击方式之一,最早出现于 1999 年左右,雅虎是当时最著名的受害者。SYN Flood 攻击利用了 TCP 三次握手的缺陷,能够以较小代价使目标服务器无法响应,且难以追查。

标准的 TCP 三次握手过程如下:

客户端发送一个包含 SYN 标志的 TCP 报文,SYN 即同步(Synchronize),同步报文会指明客户端使用的端口以及 TCP 连接的初始序号;

服务器在收到客户端的 SYN 报文后,将返回一个 SYN ACK(即确认 Acknowledgement)的报文,表示客户端的请求被接受,同时 TCP 初始序号自动加一。

客户端也返回一个确认报文 ACK 给服务器端,同样 TCP 序列号被加一。

经过这三步,TCP 连接就建立完成。TCP 协议为了实现可靠传输,在三次握手的过程中设置了一些异常处理机制。第三步中如果服务器没收到客户端的最终 ACK 确认报文,会一直处于 SYN_RECV 状态,将客户端 IP 加入等待列表,并重发第二步的 SYN ACK 报文。重发一般进行 3-5 次,大约间隔 30 秒左右轮询一次等待列表重试所有客户端。另一方面,服务器在自己发出了 SYN ACK 报文后,会预分配资源为即将建立的 TCP 连接储存信息做准备,这个资源在等待重试期间一直保留。更为重要的是,服务器资源有限,可以维护的 SYN_RECV 状态超过极限后就不再接受新的 SYN 报文,也就是拒绝新的 TCP 连接建立。

SYN Flood 正是利用了上文中 TCP 协议的设定,达到攻击的目的。攻击者伪装大量的 IP 地址给服务器发送 SYN 报文,由于伪造的 IP 地址几乎不可能存在,也就几乎没有设备会给服务器返回任何应答了。因此,服务器将会维持一个庞大的等待列表,不停的重试发送 SYN ACK 报文,同时占用着大量的资源无法释放。更关键的是,被攻击服务器的 SYN_RECV 队列被恶意的数据包占满,不再接受新的 SYN 请求,合法用户无法完成三次握手建立起 TCP 连接。也就是说,这个服务器被 SYN Flood 拒绝服务了。

对 SYN Flood 有兴趣的可以看看这里,这是笔者 2006 年写的代码,后来做过几次修改,修改 bug,并降低了攻击性,纯做测试使用。

1.2 DNS Query Flood

作为互联网最基础最核心的服务,DNS 自然也是 DDoS 攻击的重要目标之一。打垮 DNS 服务能够间接的打垮了一个公司的全部业务,或者打垮一个地区的网络服务。前些时候风头正盛的黑客组织 anonymous 也曾经宣布要攻击全球互联网的 13 台根 DNS 服务器,不过最终没有得手。

UDP 攻击是最容易发起海量流量的攻击手段,而且源 IP 随机伪造难以追查。但是过滤比较容易,因为大多数 IP 并不提供 UDP 服务,直接丢弃 UDP 流量即可。所以现在纯粹的 UDP 流量攻击比较少见了,取而代之的是 UDP 协议承载的 DNS Query Flood 攻击。简单地说,越上层协议上发动的 DDoS 攻击越难以防御,因为协议越上层,与业务关联越大,防御系统面临的情况越复杂。

DNS Query Flood 就是攻击者操纵大量傀儡机器,对目标发起海量的域名查询请求。为了防止基于 ACL 的过滤,必须提高数据包的随机性。常用的做法是 UDP 层随机伪造源 IP 地址,随机伪造源端口等参数。在 DNS 协议层,随机伪造查询 ID 以及待解析域名。随机伪造待解析域名除了防止过滤外,还可以降低命中 DNS 缓存的可能性,尽可能多的消耗 DNS 服务器的 CPU 资源。

关于 DNS Query

Flood 的代码,笔者 2011 年 7 月份为了测试服务器性能曾经写过一份代码,见这里。同样的,这份代码人为降低了攻击性,只做测试用途。

1.3 HTTP Flood

上文描述的 SYN

Flood、DNS Query Flood 在现阶段已经能做到有效防御了,真正另各大厂商以及互联网企业头疼的是 HTTP Flood 攻击。HTTP Flood 是针对 WEB 服务在第七层协议发起的攻击,它巨大危害性主要表现在三个方面,发起方便;过滤困难;影响深远。

SYN Flood 和 DNS Query Flood 都需要攻击者以 root 权限控制大批量的傀儡机,收集大量 root 权限的傀儡机是很花费时间精力的一件事情,而且在攻击过程中傀儡机会由于流量异常被管理员发现,攻击者的资源快速损耗而补充缓慢,导致攻击强度明显降低而且不可长期持续。HTTP Flood 攻击则不同,攻击者并不需要控制大批的傀儡机,取而代之的是通过端口扫描程序在互联网上寻找匿名的 HTTP 代理或者 SOCKS 代理,攻击者通过匿名代理对攻击目标发起 HTTP 请求。匿名代理是一种比较丰富的资源,花几天时间获取上午的代理并不是难事,因此攻击容易发起而且可以长期高强度的持续。

另一方面,HTTP

Flood 攻击在 HTTP 层发起,极力模仿正常用户的网页请求行为,与网站业务紧密相关,安全厂商很难提供一套通用的且不影响用户体验的方案。在一个地方工作的很好的规则,换一个场景可能带来大量的误杀。

最后,HTTP Flood 攻击会引起严重的连锁反应,不仅仅是直接导致被攻击的 WEB 前端响应缓慢,还间接攻击到后端的 JAVA 等业务层逻辑以及更后端的数据库服务,增大他们的压力,甚至对日至存储服务器都带来影响。

有意思的是,HTTP

Flood 还有个剖有历史渊源的昵称叫做 CC 攻击。CC 是 Challenge Collapsar 的缩写,而 Collapsar 是国内一家著名安全公司的 DDoS 防御设备。从目前的情况来看,不仅仅是 Collapsar,所有的硬件防御设备都还在被挑战着,风险并未解除

  • copyright
    著作权归作者所有
  • person
  • play_arrow
    1,938 Views
  • create
  • autorenew
    最后修改:2018 年 04 月 06 日
  • local_offer
copyright info_outline

*