ICMP 重定向攻击实验
章节大纲
-
-
-
Labsetup.zip 文件 ZIP
把 zip 文件下载到 VM 里, 然后用 unzip 命令解压缩。
-
-
在Ubuntu操作系统中,有针对ICMP重定向攻击的防范措施。在 docker-compose.yml 文件中,我们已经关闭了这种防范措施,也就是允许容器接受ICMP重定向消息。
// 在docker-compose.yml sysctls: - net.ipv4.conf.all.accept_redirects=1 // 要开启防护,请将其值设置为0 # sysctl net.ipv4.conf.all.accept_redirects=0
对于本任务,我们将从攻击者容器对受害者的容器发起攻击。当前的配置中,受害者将使用路由器容器(192.168.60.11)作为通往 192.168.60.0/24 网络的路由器。如果在受害者的容器上运行 ip route,我们将看到以下内容:# ip route default via 10.9.0.1 dev eth0 10.9.0.0/24 dev eth0 proto kernel scope link src 10.9.0.5 192.168.60.0/24 via (*@\textbf{10.9.0.11}@*) dev eth0
代码框架。 我们提供了一个代码框架,学生们需要在标记为 @@@ 的地方填入正确的值。#!/usr/bin/python3 from scapy.all import * ip = IP(src = @@@, dst = @@@) icmp = ICMP(type=@@@, code=@@@) icmp.gw = @@@ # ICMP 重定向包必须携带触发它的那个原始IP数据包。 ip2 = IP(src = @@@, dst = @@@) send(ip/icmp/ip2/ICMP());
验证。 ICMP重定向消息不会影响路由表,而是会改变路由缓存。路由缓存中的条目比路由表中的条目优先级高,会被先用,直到过期为止。请使用以下命令显示和清理缓存内容。
// 显示路由缓存 # ip route show cache 192.168.60.5 via 10.9.0.111 dev eth0 cache <redirected> expires 296sec // 清理路由缓存 # ip route flush cache
请在受害者的机器上进行traceroute操作,看看数据包是否被重定向。# mtr -n 192.168.60.5
注意事项: 如果我们伪造重定向包,但受害者的机器在攻击期间没有发送过ICMP数据包,则该攻击将不会成功。这是因为操作系统内核会在接受ICMP重定向消息之前进行一些类型的检查。它会验证该ICMP重定向是否由其自身发出的数据包触发,即它会检查重定向包内的 ip2。这种检查的严格程度取决于操作系统。
对于 Ubuntu 20.04,内核只是验证重定向包中的 ip2 是否与触发ICMP重定向的实际数据包的类型和目的 IP 地址匹配。然而,如果你在苹果机器上进行此实验,你的虚拟机版本可能是 Ubuntu 22.04 或更高版本,检查会更加严格。要确保伪造包中的 ip2 能够通过检查,最简单的方法是从受害者的机器中捕获一个数据包。不过这并不是必要的。鼓励学生们使用其他方法进行攻击。 -
在任务1成功后,请做以下实验,观察你的攻击是否仍然成功。请解释你观察到的现象:
问题1:能否使用ICMP重定向攻击将流量重定向到远程机器?即, 给 icmp.gw 赋予的IP地址是一个不在本地局域网上的计算机。请展示实验结果并解释你观察到的现象。
问题2:能否使用ICMP重定向攻击将流量重定向到同一网络中的不存在的机器上?即, 给 icmp.gw 赋予的IP地址是一个在本地局域网上不存在的计算机。请展示实验结果并解释你观察到的现象。
问题3:查看 docker-compose.yml 文件,你会找到恶意路由器容器的以下条目。这些条目的目的是什么?将它们的值改为1,并再次启动攻击。请描述并解释你观察到的现象。
sysctls: - net.ipv4.conf.all.send_redirects=0 - net.ipv4.conf.default.send_redirects=0 - net.ipv4.conf.eth0.send_redirects=0
-
通过ICMP重定向攻击,可以使受害者使用我们的恶意路由器 10.9.0.111 作为通往 192.168.60.5 的目标路由。因此,从受害者机器发送到此目的地的所有数据包都将通过恶意路由器进行转发。我们希望能够修改受害者的数据包。在发起 MITM 攻击之前,我们在受害者的容器中使用 netcat 启动一个TCP客户端和服务端程序。命令如下:
// 在目标容器192.168.60.5上启动netcat服务: # nc -lp 9090 // 在受害者的容器中连接到服务器: # nc 192.168.60.5 9090
一旦建立连接,你可以在受害者机器上输入消息。每行消息都会被放入一个TCP数据包发送至目的地,目的地会简单地显示这些消息。你的任务是将每条消息中的你名字(拼音)出现的地方替换为一系列A。序列的长度应与你名字相同,否则可能会扰乱TCP序号,从而导致整个TCP连接失败。你需要使用真实的名字,以便我们知道工作是由谁完成的。禁用IP转发。 在设置中,恶意路由器启用了IP转发功能,因此它像一个路由器一样为其他机器转发数据包。当我们发起MITM攻击时,我们必须停止转发IP数据包。我们将拦截这些数据包,对其进行修改,然后重新发送出去。要做到这一点,我们只需在恶意路由器上禁用IP转发即可。
# sysctl net.ipv4.ip_forward=0
MITM代码。 一旦禁用了IP转发,我们的程序需要接管数据包转发角色,当然是在修改数据包后再发送出去。由于数据包的目的地不是我们自己,内核不会将这个数据包传递给我们,而是会丢弃这个数据包。然而,如果我们的程序是一个嗅探器程序,我们将从内核那里获取到这个数据包。因此,我们将使用嗅探和伪造技术来实施这种 MITM 攻击。以下是一个示范程序,用于捕获TCP数据包、对其进行修改后再重新发送。你可以从实验配置文件中找到代码 (mitm_sample.py)。#!/usr/bin/env python3 from scapy.all import * def spoof_pkt(pkt): newpkt = IP(bytes(pkt[IP])) del(newpkt.chksum) del(newpkt[TCP].payload) del(newpkt[TCP].chksum) if pkt[TCP].payload: data = pkt[TCP].payload.load print("*** %s, length: %d" % (data, len(data))) # 字符串替换 newdata = data.replace(b'seedlabs', b'AAAAAAAA') send(newpkt/newdata) else: send(newpkt) f = 'tcp' pkt = sniff(iface='eth0', filter=f, prn=spoof_pkt)
请注意,上述代码捕获了所有 TCP 数据包,包括由程序本身生成的数据包。这是不可取的,因为它会导致无限循环,影响性能。学生需要更改过滤器以确保自己发出的数据包不会被捕捉到。
-
成功发动 MITM 攻击后,请回答以下问题:问题4:在你的MITM程序中,你只需要捕捉一个方向的数据流量。请指出你选的方向,并解释为什么。问题5:在MITM程序中,当你从A(10.9.0.5)捕获 nc 流量时,你可以使用A的IP地址或MAC地址作为过滤器的一部分。其中有一种选择是不好的,它会引发问题。请尝试两种方法,通过实验结果展示哪种选择是正确的,并解释你的结论。
-
你需要提交一份带有截图的详细实验报告来描述你所做的工作和你观察到的现象。你还需要对一些有趣或令人惊讶的观察结果进行解释。请同时列出重要的代码段并附上解释。只是简单地附上代码不加以解释不会获得学分。实验报告的提交方式会由你的老师进行具体安排。