2017-04-10 42 views
4

我正在使用NetfilterQueue和scapy來完成監視器和篡改數據包程序。NetfilterQueue set_payload不工作

但我只是陷入困境,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,包括畫中畫版本和https://github.com/kti/python-netfilterqueue.git版本。

所以有人可以幫助我嗎?我對此很好奇。

+0

您是否找到解決此問題的方法?堅持同樣的問題 – Ymartin

回答

0

我不知道您正在使用哪個scapy版本,但set_payload已過時使用。

歐洲工商管理學院的:

packet.set_payload(str(sca_pkt)) 

你應該嘗試像:

packet.payload = sca_pkt.payload 

請注意,這也將改變UDP場。如果您只想要更改DNS,您可以使用:

packet[DNS] = sca_pkt[DNS] 
+0

我知道set_payload通常不推薦使用,但我使用的版本不是。至少,文件沒有這樣說。螞蟻這兩種方式是不正確的。該程序將引發TypeError異常,因爲netfilterqueue.Packet對象不支持項目分配,或者屬性有效負載不可修改。 – NRdE

+0

你有沒有試過更新你的scapy版本? (下載GitHub上的DEV) – Cukic0d

+0

不,我會稍後再試。非常感謝! – NRdE