前言
本文只介绍DDoS攻击原理,不涉及源码、工具和渠道,更不提供任何技术支持。
每个想成为黑客的人,都要面临一个“Hello World”,网络没有绝对的安全,任何网络都面临着同一个问题——DDoS,DDoS作为历史悠久的攻击手段,非常暴力直接,也一直没有得到有效的解决。
在现代网络战争中,ddos经常作为一场有规模的有组织的黑客攻击行动的佯攻手段,在DDoS洪水的掩护下,伺机而入。那么DDoS为何在各种黑客攻击技术中起起伏伏,攻伐思路的来来去去之间能如此恒久远的流传下来,至今仍为网络安全的一个心头大患呢?下面就介绍一下DDoS攻击技术细节。
1.典型案例
1996年9月6日,美国纽约,著名的互联网服务商Panix的服务器受到高达每秒150次的异常链接攻击,导致服务器疲于应求这些非法流量,而拒绝了用户的正常请求。这是目前大家比较认可的历史上第一次DoS攻击。DoS(Denial of service拒绝服务),即通过占用网络服务资源让他应接不暇,从而拒绝正常的业务流量的一种网络攻击方式。而DDoS(Distributed denial of service分布式拒绝服务)则是DoS的分布式版本,单台设备的攻击能力有限,防御也比较容易,但是当几百台或者成千上万台设备同时对目标发起DoS攻击时,无异于一场灾难。大家一般用DDoS(分布式拒绝服务攻击)指代一般意义的拒绝服务攻击。发起攻击的网络一般称之为僵尸网络(BotNet),每个僵尸可以是一台电脑,一台服务器,甚至是一部手机。为了得到这样一个僵尸网络有两种方式:可以利用木马,蠕虫,后门等恶意程序感染大量设备,形成僵尸网络。有钞能力的人比较轻松,通过某些渠道,直接花钱就可以购买到,理论上你花的钱越多,得到的僵尸网络规模就越大,攻击力就越强。
1999年8月17日美国明尼苏达大学的服务器被至少200台设备的DDoS攻击下,被迫停止服务了2天,这两百多台设备都是在不知情的情况下被感染而成为僵尸网络的一员,再通过ip追踪,让设备停止攻击后,问题还是未能完全解决,因为不断的有新的攻击设备加入。DDoS攻击方式和其他程序的攻击方式是不同的,DDoS的攻击方式大家都是知道怎么发生的,但又无可奈何,直到今天DDoS问题也无法被解决。
2. 互联网(internet)通信过程及DDoS攻击手段
为了了解DDoS攻击手段的巧妙,我们需要先了解一下互联网的工作方式。一次网络访问过程大概是这样的:客户端通过网络线路向远程的服务器请求内容,服务器按照客户端的需求或查询或计算出相应的数据,再通过网络线路返送给客户端。这种方式类似于类似于传统的邮递过程十分相似,传统的邮递通过的是邮政系统,而现代互联网中的数据流转依靠的是以TCP/IP协议为核心的通信系统,TCP/IP的参考模型可分为四层结构(应用层、传输层、互联网层、子网层)我们以传统的邮递系统做个类比,写信的时候大家一般会遵从约定的格式,称呼、正文、此致敬礼、署名、日期等。这类似于四层网络结构中的应用层,规定了一些数据内容的协议规则,例如我们上网时常用的http协议就属于这一层;写完信以后我们可以选择是否加急或者运输方式,这类似于四层结构中的传输层,规定了数据的传输方式,比如这一层大家都熟悉的TCP协议,为了保证通信的可靠性,需要先经过三次握手再发起数据传输,实际上对于一次可靠的通信过程,事先的沟通是很有必要的,这在日常生活中很常见,例如:A和B要坚立通信,A和B就需要进行三次身份确认,则才可进行通信,TCP协议用三次握手做到这一点。第一次,在TCP协议的信件上有几个关键的字段:
SYN: | ACK: |
顺序号: | 确认号: |
发起TCP连接时,我方先把SYN设置为1,ACK设置为0,再选择一个顺序号:x,然后发送出去
SYN:1 | ACK:0 |
顺序号:x | 确认号: |
第二次,对方收到后回复一封信,把SYN设置为1,ACK设置为1,确认号设置为x+1,同时选择一个顺序号:y
SYN:1 | ACK:1 |
顺序号:y | 确认号:x+1 |
第三次,我方收到回信之后把SYN设置为0,ACK设置为1,确认号设置为y+1,顺序号设置为x+1,再次发送出去
SYN:0 | ACK:1 |
顺序号:x+1 | 确认号:y+1 |
如此一个TCP连接就建立起来了,接下来就可以发送用户的数据了,因为有三次握手的存在,通信更加可靠,类似即时通信这样的软件,多采用TCP协议在客户端和服务器之间建立一个连接通道,而这一层中还有一个著名的协议UDP协议,他没有那么麻烦,不需要反复握手建立连接,直接把数据投递出去,也不管对方有没有收到,所以这是一种不可靠的协议。而用来装信件用的信封,类似于4层结构中的网络层,主要规定了通信双方地址的编码规则,这一层采用的是IP协议,所以大家都听说过设备IP地址。而一封信的投递最终依靠的是邮局,邮局把信件打包装车后,根据收件地址把信件投递到目的地,这一层对应着4层网络结构中的子网层,是信息传递的物理载体,比如以太网、卫星网等等。这四层结构从应用层到子网层,数据按照不同的协议被不断地被打包,到达目的地之后则刚好是相反的拆包过程最终被目标接收,可以看出来,其中最核心的是互联网层中的IP协议,只要是按照IP协议封装的数据都可以被发送,不论是以太网、卫星网还是其他物理实现的子网,正如你只要按照信封上的格式写好收发地装入信件就可以被投递到目的地,IP协议让不同的子网络被互联了起来。
从这个通信过程中我们发现从数据离开到最终到达这一路,几乎每个地方都有被DDoS攻击的机会,比如霸占服务器网络带宽资源,我们只需要向一台服务器发送大量的IP协议数据包就可以消耗掉对方的网络带宽,比如用ping工具就可以发起一次攻击,ping产生的是ICMP协议包ICMP是IP协议中用来进行差错控制的一个补充,本质上还是一个IP包,这种攻击方式也被称之为ICMP洪水(ICMP flood),这种攻击手段类似于我们不断的给某人投递新建,写了什么并不重要,重要的是让信件多的邮递员在对方家门口等待排起长队,从而打断正常的新建收发。同样的思路,我们还可以发送传输层的UDP协议包,发起一次UDP洪水攻击(UDP flood),当然这里会有一个问题,那就是会暴露攻击设备的IP地址,而被对方禁封,所以攻击者一般都会通过伪造IP地址隐藏自己,比如A给B写信,却把发件地址写成C,或者干脆写一个不存在的地址,这样就达到了隐藏A的目的。出于隐藏自己的目的,人们发明了一种更有趣的攻击方式——反射攻击。既然可以伪造IP,那就不必拘泥于伪造发件人的身份,同样可以伪造收件人的身份,达到借刀杀人的效果,我们把信封上的发件地址改为攻击目标的IP地址,然后把收件地址设置为互联网上大量的第三方机器,从而把数据发送到这些第三方机器上,这些机器在接收到数据后,回复数据就会涌入发件地址指向的攻击目标,这些第三方机器也被称之为“反射器”,这有点像把别人的电话号码挂在一些网站上,然后机主被一些不明真相的推销员给呼死,很损,但很有效。反射攻击更难追踪来源,人们在此基础之上又发明了一种把攻击流量放大,以达到更强攻击效果的手段——放大攻击。比如DNS服务器是一种用来把域名解析为IP地址的设备,我们在浏览器中输入www.cnnc404.com这样的域名地址,实际上需要先查询DNS服务器,获得这个域名对应的IP地址,再用IP地址访问阿张同学的服务器。同时DNS查询通常使用UDP这个不用验证来源的传输协议,综合来看,DNS服务器就是一个很好的放大器,因为一次DNS的查询请求返回数据往往大于请求数据,这里有一个“带宽放大因子”BAF的概念,在DNS查询中,一般60字节的请求数据可以获得可以获得3000字节返回数据,那么BAF=3000/60=50,产生50倍的放大效果,这样,如果我们让攻击者不断地去对DNS服务器发起查询请求并把源地址伪造成攻击目标IP,那么这样的反射攻击就会产生50倍的流量放大效果。
除了对目标的带宽资源进行霸占以达到DDoS攻击效果外,因为TCP协议中有连接的概念,所以还可以攻击服务器的链接资源。服务器和客户端每次建立一个TCP连接时需要进行三次握手,然后把链接信息放入连接表中维护,而链接表的大小是有限的,我们可以让发起攻击的设备直接发起大量的TCP连接,从而占满服务的这个连接表,而无法响应后续的TCP连接请求,从而达到DDoS攻击的效果。这种直接的方式称之为TCP洪水(TCP flood)。但因为有三次握手的存在TCP洪水无法通过伪造IP隐藏自己,在建立连接时如果我们在第一次握手中伪造了IP,那么服务器向客户端发送数据的第二次握手就无法到达,相当于你给别人协议一封伪造发件地址的信,那么你是不可能收到回信的,因此连接无法建立,但是可以在建立连接的三次握手本身上做文章,比如,只发送SYN不进行后续的回答,这样“虚晃一枪”的SYN洪水,这样做的好处是如果不回答攻击目标的SYN+ACK数据,考虑到可能是网络环境的问题TCP协议中有重传的机制,对方会多次尝试发送SYN+ACK直到超时,但问题是,这时候受害者会不断的向攻击者发送SYN+ACK,比如重试10次,这就相当于我们每攻击一次目标对方就回击10次,所谓杀敌一千,自损1万不过如此,所以SYN洪水攻击一般都会伪造IP,或是一个不存在的IP,或是某个真实的倒霉蛋的IP,把祸水东引。同样的思路,在TCP协议中也可以通过反射发起攻击,像各个反射器发送SYN并把发件地址伪造成攻击目标的IP,这样大量的SYN+ACK数据就会从各个反射器上涌入攻击目标,当然这种攻击方式因为无法在目标上建立连接,所以还是属于在攻击网络带宽。
而针对TCP协议还有一种巧妙地攻击手段RST——洪水攻击。
在TCP协议中一般用四次挥手结束连接,但为了防止出现异常,一方可以发送一个RST数据强制切断连接,这样,我们让攻击设备不断的尝试伪造各种IP地址并发送RST数据进行“盲打”,一旦IP和其他的一些配置和某个正常用户的匹配上就能切断正常用户和服务器之间的链接,这种攻击方式更针对于用户,比如在一场网络对战游戏中,在获悉对手的IP地址后就可以不断切断对方的游戏设备和服务器之间的连接,以干扰他的正常游戏。
不论是利用IP、UDP还是TCP协议攻击,针对的都是网络和连接资源,还有一种直接针对服务器内部资源的攻击方式,消耗目标的计算和IO,正如前文所说一次网络访问的过程是这样的:客户端通过网络线路向远程服务器请求内容服务按照客户端的需求或查询或计算出响应的数据,再通过网络线路返送给客户端,作为在第五层的用户一般在网上冲浪时接触的都是应用层中像http这样的协议,比如我们访问阿张同学的时候在浏览器输入http://www.cnnc404.com,所以我们可以对一个站点发起http洪水攻击,比如利用站点的搜索功能,不断的生成大量的关键词送入查询地址,因为http作为用户直接发起的涉及具体业务的请求,服务器在收到请求后需要进行像数据库查询这样的IO操作,所以这样的攻击手法会对目标产生更大的消耗,当然http洪水攻击有个问题,那就是不能伪造IP地址,因为http协议实际上是基于TCP协议的,需要经历三次握手的过程,所以常见的方法是借助网络代理主机得到不同的真实IP发起攻击,这对于一次资金充足有计划有组织的供给来说并不是一件难事,DDoS攻击还有一些其他方式,以后再慢慢讲吧。
3.DDoS的治理和缓解办法
但所谓有攻就有防,所以有哪些应对DDoS攻击的方法呢?目前有两种大的方向:1.激进的手术治疗;2.稳妥的保守治疗
捣毁僵尸网络并让用户做好个人防护,避免被感染成为僵尸设备是一种很好的方法,但这是需要长期持续进行的方案。我们举例两个典型的在技术层面上根治DDoS攻击的方法,从DDoS的攻击原理上我们可以看出来,伪造IP地址是DDoS攻击的核心技术之一,一旦攻击者无法伪造IP地址那几乎就形同冢中枯骨,强弩之末。而治理伪造IP的方法并不复杂,现在现代互联网的下游也就是用户设备接入这一端,设备通过路由(或者通过多个路由网关)接入互联网服务提供商(ISP)所以只要让路由设备检测IP把源地址IP不属于本路由所在网段的数据都过滤掉,这样试图伪造IP的流量就无法发出。还有一个稍微复杂一点的分布式过滤方案,我们知道,庞大的互联网中不同网段都依靠路由把彼此连接,一个数据从甲发送到乙,他的IP可以伪造成丙,但是它们所经过的真实线路不可能作假,换句话说,从并到乙的数据不可能经过路由A,但是这个伪造IP的数据从甲发送到乙确经过了A,如果路由能根据IP地址的路径逻辑检测出矛盾,那么就可以过滤掉这样的流量,从而消灭伪造IP的计俩。当然一个涉及到用户、服务商、设备商甚至是监管部门的等多方的技术方案,那就不能只是个技术问题,出于商业上投入的产出考虑往往是木已成舟,积重难返。这两种方案很难被执行,只有有一定影响力的大型企业和机构才能撬动这种涉及全球的多方合作,对于中小型企业甚至是刚起步的创业者来说并不现实,所以人们提出了一些大家都能承担的起的缓解DDoS攻击的保守治疗方案,我们也列举两个目前使用比较多的方法。
DDoS攻击的可怕之处在于第一个D—分布式
当一个僵尸网络对目标发起攻击时很难处理这些来自四面八方的流量,但所谓师夷长技以制夷,敌人可以群起而攻之,那作为守法公民我们又何尝不联合起来,把一个网络服务的流量分散到不同的地方从而稀释攻击流量,比如目前各个站点普遍采用CDN技术,把一些相对静态的资源作为缓存分发给各个CDN节点,用户在请求的时候从最近的节点返回,这样就在一定的程度上缓解了DDoS攻击。当然,CDN的缓解作用比较有限,有一种比较主流的,并有一些厂商专门为此开发产品的方案——流量清洗,我们在服务器前假设一台流量清洗设备,这个设备就像一个身高马大的保镖和秘书,,帮我们对抗DDoS流量。比如,面对TCP协议的SYN洪水DDoS攻击,客户端发起的SYN先经过清洗设备,由清洗设备回复SYN+ACK,如果对方应答了,那说明是正常流量,清洗设备再把本次的连接交给后方的服务器正常通信,如果对方不应答,清洗设备该重试重试,超时之后就断开连接,但因为清洗设备人高马大,作为专门应对攻击的角色,对连接资源做了极大的专门优化,能应对及其海量的链接请求,所以攻击者想要通过SYN洪水打垮它非常困难,再比如威胁极大的http洪水攻击,正常来说一个http请求很难用传统的方式检测出是恶意流量还是正常流量,而清洗设备往往会提供专业的流量清洗平台,这些专业做流量清洗的服务商通过多年和DDoS攻击对抗积累了大量的经验和技术。比如由于http协议无法伪造IP地址,所以通过多年数据积累建立IP信用库,从那些经常发起攻击的臭名昭著的IP发来的流量就会被过滤掉,这有点像现在安卓手机上的来点标记,这是流量清洗厂商在数据积累上的优势,再比如恶意流量由于是通过程序自动发出而不是人类的操作,所以利用算法对流量进行模式识别就可以被检测出来,这是流量清洗厂商在技术上的优势。
结语
但不论怎样,DDoS作为一种历史悠久,破坏能力巨大的黑客攻击手段,时至今日还是无法被彻底解决。或许你可以说DDoS攻击源自互联网通信的架构在设计之初考虑的缺失,而人们现在又缺乏壮士断腕的决心从根本上消灭它,但不论怎样,这种破坏与对抗将长久的存在于互联网世界之中,而我们能做的只是,做好防护,保持警惕。