13.2 基于TCP协议的攻击

[toc]

0. 前言

来源:《Computer Security》A Hands-on Approacharrow-up-right — Wenliang Du

所有的代码/文档见:githubarrow-up-right

1. SYN 洪水攻击原理

知晓点套接字编程:unix网络编程 前五章arrow-up-right

了解TCP的三次握手:实战!我用 Wireshark 让你“看见“ TCParrow-up-right

明白数据封装和解封装过程: MAC首部 IP首部 TCP首部介绍arrow-up-right

明白上面链接中的内容,看本文so easy。下图是SYN flooding Attack的主要思路。

攻击者修改SYN包中的源地址(为随机地址),目标地址是受攻击的服务器。当服务器收到SYN包的时候,它使用一种数据结构Transmission Control Block(TCB),来存储这次连接的信息,放入队列。此时,连接并没有建立。目前仅仅是三次握手的第一步完成,服务器状态为半开连接。服务器向客户端发送SYN+ACK包。由于源地址为随机地址,可能不存在,没有客户端向服务器发送正确的ACK包。过段时间,该TCB会超时消失。

攻击者可以在短时间内发送大量的伪SYN包,占用服务器的TCB队列资源,致使正常用户无法连接

如果你问:一个SYN每次重复发送几个SYN+ACK?TCB queue大小如何设置?我不知道,没有去搜索验证。

sys_flooding攻击

下面我们使用netwox工具,分别从家庭局域网内的主机和服务器,向一个搭建wordpress的目标服务器(myself),发送伪SYN包。

补充一个,使用自己构建的代码,发起SYN flooding攻击。(自行构建的代码有问题,目前我不知问题在哪)

最后介绍防御措施。

由于NET地址转换的缘故,非局域网内Random IPs并不能用不同的IP给目标服务器发送伪SYN包。但是Random IPs确可以使得发送主机不会接收到SYN+ACK包。即,虽然可以发起SYN flooding攻击,但是固定IP很容易被防御,可以参见:DDOS 攻击的防范教程arrow-up-right

2. 寻找对象

寻找对象--》49.234.233.219:80

不老的神器:安全扫描器Nmap渗透使用指南arrow-up-right

3. 家庭局域网向外发起SYN flooding攻击。

家庭局域网并不适合向外发起SYN flooding。因为NET地址转换,导致之前随意生成的源地址失效。在服务端看来,从家庭局域网发出的SYN flooding的源地址都相同,特征明显,相对而言比较容易被屏蔽arrow-up-right

3.1 使用工具进行SYN flooding攻击

3.2 NET地址转换

但是尴尬的是Foreign Address中的IP地址相同。推测下,可能是NET地址转换导致。

网络地址转换NAT原理(易于理解)arrow-up-right 网络地址端口转换NAPT (Port-Level NAT),它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。(正如上面 Foreign Address所示,IP相同,当端口不同)

那上面103.40.221.154 是路由器的公有IP? 打开ip138arrow-up-right,发现并不是。。

我们尝试追踪下路由过程,如下所示,并没有什么发现。

traceroute 查看路由信息arrow-up-right 下面我们只能看到每一跳的网关情况。一些行以星号表示,出现这样的情况,可能是防火墙封掉了 ICMP 的返回信息,所以得不到什么相关的数据包返回数据。

这时候,发现一个比较尴尬的事情,ip138arrow-up-right 返回给我的是路由器的私有地址,和登录路由查询的结果相同。

深度截图_选择区域_20200722170903
深度截图_选择区域_20200722170756

私有网段,有A,B,C三个地址段

  • 10.0.0.0/8:10.0.0.0-10.255.255.255.

  • 172.16.0.0/12:172.16.0.0-172.31.255.255.

  • 192.168.0.0/16:192.168.0.0-192.168.255.255.

这个“家里”路由器arrow-up-right没有公共IP,走的是上面103.40.221.154 IP。

3.3 抓包查看验证

抓包神器 tcpdump 使用介绍arrow-up-right 。通过抓取的包,我们很容易看出每次的src IP都不同。

4. 使用拥有公有IP的服务器向目标发起SYN flooding攻击

所以我用另一台服务器(有公有IP,34.92.249.231),重复上面的实验, Foreign Address还是IP相同,端口不同。这是为什么呢?难道服务器也走NET地址转换?

公有ip的syn_flooding

5. 自行构建代码发起SYN flooding

下面的程序,有问题,tcpdump抓取不到内容。我目前不知道问题在哪。

6. 防御

参考:深入浅出TCP中的SYN-Cookiesarrow-up-rightSYN cookie --wikiarrow-up-right

仅仅从概念上理解。

在ubuntu中,SYN cookie策略是默认开启的。只有当服务器出现大量半连接的时候,SYN cookie策略才会被触发。SYN cookie机制的想法是在服务器仅收到SYN之后根本不分配资源;仅当服务器收到最终的ACK数据包时才分配资源。这解决了SYN泛洪攻击问题

由于服务器不保留有关SYN数据包的任何信息,因此无法验证是否接收到的ACK数据包是先前SYN ACK数据包的结果,或者仅仅是欺骗ACK数据包。欺骗性ACK数据包泛洪攻击服务器,每个ACK数据包都会导致服务器分配宝贵的资源。此攻击可能比SYN泛洪攻击更具危害性。SYN Cookies的想法为该问题提供了一种优雅的解决方案。

SYN cookie是TCP服务器对初始TCP序列号的特殊选择。服务器收到SYN数据包后,它使用只有服务器知道的密钥,根据数据包中的信息(包括IP地址,端口号和序列号)计算出密钥散列。该哈希值H将用作放置在发送回客户端的服务器SYN + ACK数据包中的初始序列号。值H称为SYN cookie。如果客户端是攻击者,则数据包将不会到达攻击者(在SYN泛洪攻击中,客户端IP地址是伪造的)。如果客户端不是攻击者,它将获取数据包,并发送回ACK数据包。服务器收到此ACK数据包(ack=H+1)后,可以通过重新计算cookie来检查确认字段内的序列号是否有效。

根据数据包中的信息。验证将避免出现ACK flonding。并确保ACK数据包是先前SYN + ACK数据包的结果。由于攻击者不知道计算cookie所用秘钥,因此他们无法轻松伪造有效的cookie。使用SYN cookie机制,可以有效地抵制SYN泛洪攻击。尽管攻击者仍然可以向服务器泛洪许多SYN数据包,但他们将无法消耗服务器资源,因为什么都没有保存。攻击者还可以向服务器发送许多ACK数据包,但是由于他们在确认字段中没有有效的SYN cookie,因此它们不会触发服务器上的资源分配。

SYN Cookies 的使用不与任何协议定义冲突,照理来说它该和所有的 TCP 实现兼容。然而,当 SYN Cookies 使用的时候,会发生两种值得注意的变化:首先,服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。其次,这个服务器必须拒绝所有的 TCP 选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目。尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到——这些改变只在被攻击时值得注意。在这样的情况下,牺牲 TCP 选项来保护连接一般被认为是合乎情理的。

Last updated