使用 scapy 修改接收到的数据包 src/dst

用户2035873

我正在尝试嗅探我的 wifi 以获取收到的数据包。当我收到一个 ftp 数据包时,我会反转源和目标(Mac 地址、IP 地址和端口),然后再次将它们发回。

但是,当我检查wireshark时,我发现发送的修改后的数据包有一个错误“[Malformed Packet] [ETHERNET FRAME CHECK SEQUENCE INCORRECT]”,尽管我在发回数据包之前删除了校验和。下面是我定义的用于修改接收到的数据包 src/dst 的函数:

def modify_packet(pkt):
    source_mac_address = pkt[Ether].src
    destination_mac_address = pkt[Ether].dst
    destination_address = pkt[IP].dst
    source_address = pkt[IP].src
    destination_port = pkt[TCP].dport
    source_port = pkt[TCP].sport


    pkt[Ether].dst = source_mac_address
    pkt[Ether].src = destination_mac_address
    pkt[IP].dst = source_address
    pkt[IP].src = destination_address
    pkt[TCP].dport = source_port
    pkt[TCP].sport =  destination_port

    del pkt[IP].chksum
    del pkt[TCP].chksum

    send(pkt)
return
Cukic0d

Scapy 尚未实现以太网校验和,因为它们是不可预测的:如wireshark 的文档所述

大多数以太网接口也不向 Wireshark 或其他应用程序提供 FCS,或者它们的驱动程序没有配置这样做;因此,Wireshark 通常只会获得绿色字段,尽管在某些平台上,某些接口会在传入数据包上提供 FCS。

但是,如果您知道数据包具有校验和,则它可能作为Padding您正在处理的 Scapy 数据包末尾的层存在如果是这种情况,您可能可以毫无问题地将其删除。

你可以尝试类似的东西

if Padding in pkt:
    pkt[Padding].underlayer.remove_payload()

要删除它。

另一个注意事项:在处理第 2 层数据包时需要使用sendp()而不是send()(在这种情况下:以太网帧)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章