首页 > 解决方案 > Netfilterqueue,set_payload 不使用 python3 更改数据包

问题描述

我正在尝试使用 NetfilterQueue(版本 0.8.1)和 Python3(版本 3.7.3)更改 UDP 数据包中的 raw.load。Scapy版本。是 2.4.4

目标服务器运行 tcpdump 来嗅探传入的数据包,但没有任何东西到达。

我的脚本可以毫无问题地从 nfqueue 捕获数据包。我用新文本更改 [Raw].load 并用 set_payload 设置但没有结果。

from netfilterqueue import NetfilterQueue
from scapy.all import *
import binascii

def print_and_accept(pkt):
    pkt_scapy = scapy.all.IP(pkt.get_payload())
    pkt_scapy[scapy.all.Raw].load="new text goes here"
    del pkt_scapy[scapy.all.IP].len
    del pkt_scapy[scapy.all.UDP].chksum
    del pkt_scapy[scapy.all.IP].chksum
    
    pkt.set_payload(bytes(pkt_scapy))

    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print('')

nfqueue.unbind()

标签: python-3.xiptablesscapy

解决方案


我有同样的问题,似乎 netfilterqueue 有点过时了。对于您的情况,我建议您默认丢弃数据包,而不是 packet.accept() 使用 scapy 的 send() 函数:

def print_and_accept(pkt):
    pkt_scapy = scapy.all.IP(pkt.get_payload())
    pkt_scapy[scapy.all.Raw].load="new text goes here"
    del pkt_scapy[scapy.all.IP].len
    del pkt_scapy[scapy.all.UDP].chksum
    del pkt_scapy[scapy.all.IP].chksum

pkt.drop()
send(pkt_scapy)

推荐阅读