我正在使用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版本。
那么有人可以帮助我吗?我对此非常好奇。
答案 0 :(得分:0)
我不知道您使用的是哪个版本,但set_payload
已被弃用。
Insead of:
packet.set_payload(str(sca_pkt))
你应该尝试类似的东西:
packet.payload = sca_pkt.payload
请注意,这也会更改UDP字段。如果您只想更改DNS,请使用:
packet[DNS] = sca_pkt[DNS]
答案 1 :(得分:0)
而不是:
packet.set_payload(b'sca_pkt')
尝试:
check = with open('BTR.csv', 'r') as csvfile:
^
SyntaxError: invalid syntax
答案 2 :(得分:0)
我遇到了同样的问题,似乎是因为 netfilterqueue 已被弃用,一个简单的解决方法是不设置有效负载并接受数据包,而是丢弃数据包并直接发送更改后的数据包阴森森的
if modified == True:
print 'debug sca_pkt: ' + sca_pkt.summary()
print 'debug packet: ' + IP(packet.get_payload()).summary()
packet.drop()
send(sca_pkt)