gpt4 book ai didi

python - NetfilterQueue set_payload 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 12:02:50 25 4
gpt4 key购买 nike

我正在使用 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版本。

所以有人可以帮助我吗?我只是对此很好奇。

最佳答案

我不知道您使用的是哪个 scapy 版本,但是 set_payload 已被弃用。

代替:

packet.set_payload(str(sca_pkt))

你应该尝试这样的事情:

packet.payload = sca_pkt.payload

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

packet[DNS] = sca_pkt[DNS]

关于python - NetfilterQueue set_payload 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43319070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com