章节大纲

    • Wireshark 是最常用的嗅探工具,且易于使用。在整个实验中我们将使用它。但是作为构建其他工具的基础模块, Wireshark 却很难胜任这一点。我们将使用 Scapy 来完成这一任务。这个任务的目标是学习如何在 Python 程序中使用 Scapy 进行包嗅探。以下提供了一个示例代码:
      #!/usr/bin/env python3
      from scapy.all import *
      
      def print_pkt(pkt):
        pkt.show()
      
      pkt = sniff(iface='br-c93733e9f913', filter='icmp', prn=print_pkt)
      上述代码将在 br-c93733e9f913 接口上嗅探数据包。请参阅实验环境设置部分的说明来获取正确的接口名称。如果要同时在多个接口上嗅探包,可以将这些接口放入一个列表,并将其分配给 iface 变量。以下是一个例子:
       
      iface=['br-c93733e9f913', 'enp0s3']
        • 在上述程序中,对于捕获的每个包,回调函数 print_pkt() 将被调用,这个函数将打印一些关于该包的信息。请使用 root 权限运行程序并演示你确实可以捕获到包。然后再次运行程序,但不使用 root 权限,描述和解释你的观察结果。

          // 使程序可执行
          # chmod a+x sniffer.py
          
          // 使用 root 权限运行程序
          # sniffer.py
          
          // 切换到 seed 账号,
          // 不使用 root 权限再次运行程序
          # su seed
          $ sniffer.py
          
        • 通常,当我们嗅探包时,我们只对某些类型的包感兴趣。可以通过设置嗅探过滤器来实现这一点。Scapy 的过滤器使用 Berkeley Packet Filter (BPF) 语法,可以从互联网上找到 BPF 手册。请设置以下过滤器并再次演示你的嗅探程序(每个过滤器应单独设置):
          • 只捕获 ICMP 包;
          • 捕获来自某个特定 IP 地址并且目标端口号为 23 的 TCP 包;
          • 捕获来自或去往某个特定网络的包。可以选择任意网络,例如128.230.0.0/16,但不应选择与你的虚拟机连接的同一子网。