B 为帮助 A 能顺利连接,需要分配内核资源维护半开连接,那么当 B 面临海量的连接 A 时,如上图所示,SYN Flood攻击就形成了。攻击方 A 可以控制肉鸡向 B 发送大量 SYN 消息但不响应 ACK 消息,或者干脆伪造 SYN 消息中的Source IP,使 B 反馈的SYN-ACK消息石沉大海,导致 B 被大量注定不能完成的半开连接占据,直到资源耗尽,停止响应正常的连接请求。
3 UDP FloodingUDP洪泛是也是一种拒绝服务攻击,将大量的用户数据报协议(UDP)数据包发送到目标服务器,目的是压倒该设备的处理和响应能力。防火墙保护目标服务器也可能因UDP泛滥而耗尽,从而导致对合法流量的拒绝服务。
UDP Flood攻击如何工作?
UDP Flood主要通过利用服务器响应发送到其中一个端口的UDP数据包所采取的步骤。在正常情况下,当服务器在特定端口接收到UDP数据包时,会经过两个步骤:
服务器首先检查是否正在运行正在侦听指定端口的请求的程序。
如果没有程序在该端口接收数据包,则服务器使用 ICMP(ping)数据包进行响应,以通知发送方目的地不可达。
举个例子。假设今天要联系酒店的小蓝,酒店客服接到电话后先查看房间的列表来确保小蓝在客房内,随后转接给小蓝。
首先,接待员接收到呼叫者要求连接到特定房间的电话。接待员然后需要查看所有房间的清单,以确保客人在房间中可用,并愿意接听电话。碰巧的是,此时如果突然间所有的电话线同时亮起来,那么他们就会很快就变得不堪重负了。
当服务器接收到每个新的 UDP数据包时,它将通过步骤来处理请求,并利用该过程中的服务器资源。发送UDP报文时,每个报文将包含源设备的IP地址。在这种类型的DDoS攻击期间,攻击者通常不会使用自己的真实IP地址,而是会欺骗UDP数据包的源IP地址,从而阻止攻击者的真实位置被暴露并潜在地饱和来自目标的响应数据包服务器。
由于目标服务器利用资源检查并响应每个接收到的 UDP数据包的结果,当接收到大量UDP数据包时,目标的资源可能会迅速耗尽,导致对正常流量的拒绝服务。
如何缓解UDP洪水攻击?
大多数操作系统部分限制了 ICMP报文的响应速率,以中断需要 ICMP 响应的DDoS攻击。这种缓解的一个缺点是在攻击过程中,合法的数据包也可能被过滤。如果UDP Flood的容量足够高以使目标服务器的防火墙的状态表饱和,则在服务器级别发生的任何缓解都将不足以应对目标设备上游的瓶颈。
4 TCP 重置攻击在 TCP重置攻击中,攻击者通过向通信的一方或双方发送伪造的消息,告诉它们立即断开连接,从而使通信双方连接中断。正常情况下,如果客户端收发现到达的报文段对于相关连接而言是不正确的,TCP就会发送一个重置报文段,从而导致TCP连接的快速拆卸。
TCP重置攻击利用这一机制,通过向通信方发送伪造的重置报文段,欺骗通信双方提前关闭 TCP 连接。如果伪造的重置报文段完全逼真,接收者就会认为它有效,并关闭TCP连接,防止连接被用来进一步交换信息。服务端可以创建一个新的TCP连接来恢复通信,但仍然可能会被攻击者重置连接。万幸的是,攻击者需要一定的时间来组装和发送伪造的报文,所以一般情况下这种攻击只对长连接有*伤力,对于短连接而言,你还没攻击呢,人家已经完成了信息交换。
从某种意义上来说,伪造 TCP报文段是很容易的,因为TCP/IP都没有任何内置的方法来验证服务端的身份。有些特殊的 IP 扩展协议(例如IPSec
)确实可以验证身份,但并没有被广泛使用。客户端只能接收报文段,并在可能的情况下使用更高级别的协议(如TLS
)来验证服务端的身份。但这个方法对TCP重置包并不适用,因为TCP重置包是TCP协议本身的一部分,无法使用更高级别的协议进行验证。
以下实验是在
OSX
系统中完成的,其他系统请自行测试。
现在来总结一下伪造一个 TCP重置报文要做哪些事情:
嗅探通信双方的交换信息。
截获一个
ACK
标志位置位 1 的报文段,并读取其ACK
号。伪造一个 TCP 重置报文段(
RST
标志位置为 1),其序列号等于上面截获的报文的ACK
号。这只是理想情况下的方案,假设信息交换的速度不是很快。大多数情况下为了增加成功率,可以连续发送序列号不同的重置报文。将伪造的重置报文发送给通信的一方或双方,时其中断连接。
为了实验简单,我们可以使用本地计算机通过 localhost
与自己通信,然后对自己进行 TCP 重置攻击。需要以下几个步骤:
在两个终端之间建立一个 TCP 连接。
编写一个能嗅探通信双方数据的攻击程序。
修改攻击程序,伪造并发送重置报文。
下面正式开始实验。
建立 TCP 连接
可以使用 netcat 工具来建立 TCP 连接,这个工很多操作系统都预装了。打开第一个终端窗口,运行以下命令:
$ nc -nvl 8000
这个命令会启动一个 TCP 服务,监听端口为 8000
。接着再打开第二个终端窗口,运行以下命令:
$ nc 127.0.0.1 8000
该命令会尝试与上面的服务建立连接,在其中一个窗口输入一些字符,就会通过 TCP 连接发送给另一个窗口并打印出来。
嗅探流量
编写一个攻击程序,使用 Python 网络库 scapy
来读取两个终端窗口之间交换的数据,并将其打印到终端上。代码比较长,下面为一部份,完整代码后台回复 TCP攻击,代码的核心是调用scapy
的嗅探方法:
这段代码告诉 scapy
在lo0
网络接口上嗅探数据包,并记录所有 TCP 连接的详细信息。
iface: 告诉 scapy 在
lo0
(localhost)网络接口上进行监听。lfilter: 这是个过滤器,告诉 scapy 忽略所有不属于指定的 TCP 连接(通信双方皆为
localhost
,且端口号为8000
)的数据包。prn: scapy 通过这个函数来操作所有符合
lfilter
规则的数据包。上面的例子只是将数据包打印到终端,下文将会修改函数来伪造重置报文。count: scapy 函数返回之前需要嗅探的数据包数量。
发送伪造的重置报文
下面开始修改程序,发送伪造的 TCP 重置报文来进行 TCP 重置攻击。根据上面的解读,只需要修改 prn 函数就行了,让其检查数据包,提取必要参数,并利用这些参数来伪造 TCP 重置报文并发送。
例如,假设该程序截获了一个从(src_ip
,src_port
)发往 (dst_ip
,dst_port
)的报文段,该报文段的 ACK 标志位已置为 1,ACK 号为100,000
。攻击程序接下来要做的是:
由于伪造的数据包是对截获的数据包的响应,所以伪造数据包的源
IP/Port
应该是截获数据包的目的IP/Port
,反之亦然。将伪造数据包的
RST
标志位置为 1,以表示这是一个重置报文。将伪造数据包的序列号设置为截获数据包的 ACK 号,因为这是发送方期望收到的下一个序列号。
调用
scapy
的send
方法,将伪造的数据包发送给截获数据包的发送方。
对于我的程序而言,只需将这一行取消注释,并注释这一行的上面一行,就可以全面攻击了。按照步骤 1 的方法设置 TCP 连接,打开第三个窗口运行攻击程序,然后在 TCP 连接的其中一个终端输入一些字符串,你会发现 TCP 连接被中断了!
进一步实验
可以继续使用攻击程序进行实验,将伪造数据包的序列号加减 1 看看会发生什么,是不是确实需要和截获数据包的
ACK
号完全相同。打开
Wireshark
,监听 lo0 网络接口,并使用过滤器ip.src == 127.0.0.1 && ip.dst == 127.0.0.1 && tcp.port == 8000
来过滤无关数据。你可以看到 TCP 连接的所有细节。在连接上更快速地发送数据流,使攻击更难执行。
猪八戒要向小蓝表白,于是写了一封信给小蓝,结果第三者小黑拦截到了这封信,把这封信进行了篡改,于是乎在他们之间进行搞破坏行动。这个马文才就是中间人,实施的就是中间人攻击。好我们继续聊聊什么是中间人攻击。
什么是中间人
攻击中间人攻击英文名叫 Man-in-the-MiddleAttack,简称「MITM攻击」。指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方 直接对话,但事实上整个会话都被攻击者完全控制。我们画一张图: