NetfilterQueue set_payload不起作用

问题描述 投票:4回答:2

我正在使用NetfilterQueue和scapy完成监视器和篡改数据包程序。

但我只是遇到麻烦,NetfilterQueue模块的set_payload()方法似乎不适合我。

这是我的源代码。

from netfilterqueue import NetfilterQueue as nfqueue
from scapy.all import *
import os
import socket
import re

baidu_ip = socket.gethostbyname('www.baidu.com')
print "Got baidu ip: " + baidu_ip

iptablesr = 'iptables -t mangle -A POSTROUTING -p tcp -j NFQUEUE --queue-num 1'
print("Adding iptable rules :")
print(iptablesr)
os.system(iptablesr)
iptablesr = 'iptables -t mangle -A POSTROUTING -p udp -j NFQUEUE --queue-num 1'
print(iptablesr)
os.system(iptablesr)


def callback(packet):
    modified = False
    sca_pkt = IP(packet.get_payload())

    # This is the main logic, to modify the packet
    try:
        dns_lookup = re.search(r'DNS Qry "([\w\.]+)"', sca_pkt[DNS].summary()).group(1)
        if re.search(r'baidu\.com', dns_lookup) != None:
            sca_pkt[DNS].qd = DNSQR(qname='www.163.com')
            sca_pkt[UDP].len = len(bytes(sca_pkt[UDP]))
            sca_pkt[UDP].chksum = 0x0000
            modified = True
    except:
        pass

    # Accept the modified packet
    if modified == True:
        print 'debug sca_pkt: ' + sca_pkt.summary()
        packet.set_payload(str(sca_pkt))
        print 'debug packet: ' + IP(packet.get_payload()).summary()
        packet.accept()
        return 

    packet.accept()

def main():
    q = nfqueue()
    q.bind(1, callback)
    try:
        q.run()
    except KeyboardInterrupt:
        q.unbind()
        print "Flushing iptables."
        os.system('iptables -F')
        os.system('iptables -F -t mangle')

if __name__ == '__main__':
    main()

这是我得到的输出。

Got baidu ip: 180.97.33.108
Adding iptable rules :
iptables -t mangle -A POSTROUTING -p tcp -j NFQUEUE --queue-num 1
iptables -t mangle -A POSTROUTING -p udp -j NFQUEUE --queue-num 1
debug sca_pkt: IP / UDP / DNS Qry "www.163.com" 
debug packet: IP / UDP / DNS Qry "baidu.com."

您可以从调试信息中看到,set_payload()不起作用。 (我将数据包设置为sca_pkt中显示的值,但是当我获得数据包有效负载摘要时,它仍然是原始值)

我刚尝试了两个版本的NetfilterQueue,包括pip版本和https://github.com/kti/python-netfilterqueue.git版本。

那么有人可以帮助我吗?我对此非常好奇。

python iptables packet netfilter
2个回答
0
投票

我不知道你使用的是什么scapy版本,但是set_payload被弃用了。

Insead:

packet.set_payload(str(sca_pkt))

你应该尝试类似的东西:

packet.payload = sca_pkt.payload

请注意,这也将更改UDP字段。如果您只想更改DNS,您可以使用:

packet[DNS] = sca_pkt[DNS]

0
投票

代替 :

packet.set_payload(str(sca_pkt))

尝试:

packet.set_payload(b'sca_pkt')
© www.soinside.com 2019 - 2024. All rights reserved.