因为内容太多,杜老师一时间想不出那么多台词,故打算另起一文继续说。杜老师尽量使用通俗易懂的语言描述,所以文字量会比较多些,希望感兴趣的小伙伴能耐心听完。
需要手动点击播放:
IP 协议让不同的子网络被互联了起来,从这个通信过程中我们发现从数据离开到最终到达,这一路几乎每个地方都有被 DDoS 攻击的机会。
比如霸占服务器的网络带宽资源,我们只需要向一台服务器发送大量的 IP 协议数据包就可以慢慢的消耗掉对方的网络带宽。
比如用大家耳熟能详的 Ping 工具就可以发起一次攻击,Ping 产生的 ICMP 协议包。ICMP 是 IP 协议用来进行插错控制的一个补充,本质上是一个 IP 包,这种攻击方式也称为 ICMP 洪水。
这种攻击手段类似于我们不断的给某个人投递信件。写了什么并不重要,重要的是让信件多的邮递员在对方的家门口排起长队从而打断正常的信件收发。
同样思路我们还可以发送传输层的 UDP 协议包发起一次 UDP 洪水攻击。当然这里会有一个问题就是会暴露攻击设备的 IP 地址而被对方封禁。
所以攻击者一般会通过伪造 IP 地址来隐藏自己。比如张三给李四写信却把发件地址写成了王五,这样即使是一封祖安问候信李四也只能迁怒于王五。
或者干脆写一个不存在的地址让李四无处泄愤。但出于隐藏自己这个目的人们发明了一种更有趣的攻击方式:反射攻击,既然可以伪造 IP 那就不必拘泥于伪造发件人的身份。
同样可以伪造收件人的身份达到借刀杀人效果,我们把信封上的发件地址改为攻击目标 IP 地址,然后把收件地址设置为互联网上大量的第三方机器,从而把数据发送到这些第三方机器上。
这些机器在接收到数据之后,回复数据会涌入发件地址指向的攻击目标,这些第三方机器也被称为反射器。这有点像把别人电话号码挂在一些网站上,然后机主被不明真相的推销员给呼死,很损但很有效。
反射攻击更难追踪来源,更厉害的是人们在此基础之上又发明了一种把攻击流量放大以达到更强攻击效果的手段:放大攻击。
比如 DNS 服务器用来把域名解析为 IP 地址的设备,我们在浏览器中输入像 dusays.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 洪水无法通过伪造 IP 隐藏自己。
在建立连接时如果我们在第一次握手中伪造了 IP,那么服务器向客户端发送数据的第二次握手就无法到达。
相当于给别人写了一封伪造发现地址的信,那么是不可能收到回信,因此连接无法建立。但是可以在建立连接的三次握手本身上做文章,比如只发送 SYN,不进行后续回答这样虚晃一枪 SYN 洪水。
这样做的好处是如果不回答攻击目标的 SYN+ACK 数据,那么考虑到可能是网络环境问题。TCP 协议有重传机制,对方会多次尝试发送 SYN+ACK 直到超时。
问题是这时候受害者会不断的向攻击者发送 SYN+ACK,比如重试 10 次,这就相当于我们每攻击目标一次,对方就会回击 10 次,所谓杀敌一千自损一万不过如此。
所以 SYN 洪水攻击一般都会伪造 IP,或是一个不存在的 IP 让受害者拔剑四顾心茫然,或是某个真实倒霉蛋的 IP 把祸水东移。
同样思路在 TCP 协议中也可以通过反射发起攻击,向各个反射器发送 SYN 并把发现地址伪造成攻击目标的 IP,这样大量 SYN+ACK 数据就会从各个反射器上涌入攻击目标。
当然这种攻击方式因为无法在目标上建立连接,所以还是属于是在攻击网络带宽。而针对 TCP 协议还有一种巧妙攻击手段:洪水攻击。
在 TCP 协议中一般用四次挥手结束连接,但为防止出现异常,一方可以发送一个 RST 数据包强制切断连接。
这样我们让攻击设备不断尝试伪造各种 IP 地址,并发送 RST 数据进行盲打。一旦 IP 和其他的一些配置和某个正常用户匹配上就能切断正常用户和服务器之间的连接。
这种攻击方式更针对于用户。比如在一场网络游戏对战中,在获悉对手的 IP 地址后,就可以不断切断对方的游戏设备和服务器的连接以干扰他的正常游戏。
不论是利用 IP、UDP 还是 TCP 协议攻击,针对的都是网络和连接资源。还有一种直接针对服务器内部资源的攻击方式:消耗目标的 CPU 和 IO。
如开头所说一次网络访问的过程是这样的:客户端通过网络线路向远程的服务器请求内容,服务器按照客户端的需求或查询或计算出相应数据,再通过网络线路送给客户端。
作为在第五层用户,一般在网上冲浪时接触的都是应用层中像 HTTP 这样的协议。比如我们在访问杜老师说的时候,浏览器输入 dusays.com,所以我们可以对一个站点发起 HTTP 洪水攻击。
比如利用博客的搜索功能不断的生成大量的关键词送入查询地址,因为 HTTP 作为用户直接发起涉及具体业务的请求,服务器在收到请求后需进行像数据库查询这样的 IO 操作,所以这样的攻击手法会对目标产生更大的消耗。
当然 HTTP 洪水攻击有一个问题,那就是不能伪造 IP 地址。因为 HTTP 协议实际上是基于 TCP 协议,需经历三次握手的过程,所以常见的方法是借助网络代理主机得到不同的真实 IP 发起攻击。
这对于一次资金充足有计划有组织的攻击来说并不是件难事,DDoS 攻击还有一些其它的方式,这里就不一一列举。
但所谓有攻就有防,哪里有压迫哪里就会有反抗,所以有哪些应对 DDoS 攻击的方法呢?