Section outline

    • 主机 A 和 B 正在通过 Telnet 进行通信,而主机 M 希望拦截它们之间的通信以便对 A 和 B 传送的数据进行修改。下图描述了该设置。我们已经在容器内部创建了一个名为 seed 的帐户,密码是 dees。你可以通过 Telnet 连接到此账户。
       
      telnet_mitm_chinese

      步骤 1(发起 ARP 缓存中毒攻击): 首先,主机 M 对 A 和 B 均执行 ARP 缓存中毒攻击,使得在 A 的 ARP 缓存中,B 的 IP 地址被映射到 M 的 MAC 地址;在 B 的 ARP 缓存中,A 的 IP 地址也被映射到 M 的 MAC 地址。完成此步骤后,A 和 B 之间的数据包都将发送给 M。我们将使用任务 1 中的 ARP 缓存中毒攻击来实现这一目标。如果你能不断地发送伪造数据包(例如每5秒一次)就更好了。否则,伪造的映射可能会被替换。
       
      步骤 2(测试): 在攻击成功后,请尝试在主机 A 和 B 之间相互 ping,并汇报你的观察结果。请在报告中展示 Wireshark 的结果。在执行此步骤之前,请确保主机 M 的 IP 转发(IP forwarding)已关闭。你可以通过以下命令完成此操作。
       
      # sysctl net.ipv4.ip_forward=0
       
      步骤 3(开启 IP 转发): 现在我们将在主机 M 上开启 IP 转发,因此它将转发 A 和 B 之间的数据包。请运行以下命令并重复步骤 2, 描述你的观察结果。

      # sysctl net.ipv4.ip_forward=1

      步骤 4(实施中间人攻击): 我们现在可以对 A 和 B 之间的 Telnet 数据进行修改。假设 A 是 Telnet 客户端,B 是 Telnet 服务器。在 A 连接到 B 上的 Telnet 服务器后,在 A 的 Telnet 窗口中键入的每个字符,都会生成一个 TCP 数据包并发送给 B。我们希望拦截这个 TCP 数据包,并将每个输入的字符替换为一个固定字符(例如 Z)。这样无论用户在 A 上键入什么内容,Telnet 都会始终显示 Z。
       
      根据前面的步骤,我们可以将 TCP 数据包重定向到主机 M,但此时我们希望M不转发这些数据包,而是用一个伪造的数据包来代替。我们将编写一个程序来完成这一目标。我们需要做到以下几点:
       
      • 首先保持 M 上的 IP 转发,以便 A 和 B 之间可以建立 Telnet 连接。一旦连接建立,我们使用以下命令关闭 IP 转发。请在 A 的 Telnet 窗口中输入一些内容并报告观察结果:
        # sysctl net.ipv4.ip_forward=0
      • 在主机 M 上运行你写的程序,捕获从 A 到 B 发送的数据包,然后生成一个伪造数据包(只修改 TCP 数据部分)。对于从 B 到 A 的数据包( Telnet 响应),我们不做任何更改,因此伪造数据包与原始的完全相同。