Scapy 网络嗅探实验

9 阅读2分钟

1. 实验目的

本实验用于学习网络数据包嗅探技术,理解明文协议(如 POP3、SMTP、IMAP、FTP)在网络传输中的安全风险。

通过 Scapy 对网络流量进行捕获与解析,观察应用层协议中可能存在的明文敏感信息,从而加深对网络安全与加密通信必要性的理解。

用Scapy嗅探流量,从中窃取明文的邮箱身份凭证。然后对网络中的攻击目标进行ARP投毒,以此嗅探它们的网络流量。建议你在Linux上使用Scapy,因为它最初就是按照兼容Linux来设计的。

编写一个嗅探器来捕捉主流邮箱协议(SMTP、POP3和IMAP)的身份凭证。之后,用这个嗅探器配合基于ARP投毒的中间人(MITM)攻击,我们就能窃取网络中其他设备的身份凭证。还可以用于其他任何协议,还可以不管具体是什么协议,直接把所有流量都记录到一个pcap文件里,以备后续分析。

Scapy 提供了基于底层数据包捕获能力的嗅探接口 sniff(),可以对经过网卡的流量进行实时分析。

网络数据包 → 网卡捕获 → Scapy解析 → 过滤协议 → 提取payload → 输出分析结果

sniffer(filter='', iface='any', prn=function, count=N)
  • filter参数指定一个BPF数据包过滤器
  • iface参数用于指定嗅探器要嗅探的网卡,如果不设置的话,默认会嗅探所有网卡
    • 如:eth0 / wlan0 / lo
  • prn参数用于指定一个回调函数
    • 每捕获一个包就调用一次
  • count参数可以用来指定你想嗅探多少包
    • 0 表示无限

2. 流量分析示例

from scapy.all import sniff, TCP, IP

def packet_callback(packet):
    if packet[TCP].payload:
        mypacket = bytes(packet[TCP].payload).decode(
            errors='ignore'
        )
        if 'user' in mypacket.lower() or 'pass' in mypacket.lower():
            print(f'[*] Destination: {packet[IP].dst}')
            print(f'[*] Packet: {mypacket}')


def main():
    sniff(
        iface='lo',
        filter='tcp port 110 or tcp port 25 or tcp port 143 or tcp port 21', # POP3, IMAP, SMTP, FTP
        prn=packet_callback,
        store=0
    )

if __name__ == '__main__':
    main()

3 实验环境模拟

3.1 启动模拟服务

一个终端运行该脚本,一个终端模拟邮件协议端口110

$ nc -lvnp 110  
listening on [any] 110 ...

3.2 模拟客户端连接

另一个终端模型客户端登录

$ telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
user      
passwd

脚本输出

[*] Destination: 127.0.0.1
[*] Packet: user

[*] Destination: 127.0.0.1
[*] Packet: user

可以看到客户端试图登录127.0.0.1这台服务器,并且发送了明文账号和密码

4 结论

  • 明文协议在网络中传输时可能被直接读取
  • 嗅探工具可以捕获未加密的应用层数据
  • 使用加密协议(如 TLS)可以有效防止信息泄露