2017-04-10 4 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に表示された値に設定しましたが、パケットペイロードサマリを取得しても元の値です)

そして、私はpipバージョンとhttps://github.com/kti/python-netfilterqueue.gitバージョンのNetfilterQueueの2つのバージョンを試しました。

だから誰でも助けてくれますか?私はこれについて非常に興味があります。

+0

DNSの変更のみを希望する場合は、次のようにします。同じ問題が残っています – Ymartin

答えて

0

使用しているscapyのバージョンはわかりませんが、set_payloadは廃止予定です。

のINSEAD:

packet.payload = sca_pkt.payload 

が、これがまた、UDPフィールドを変更することに注意してください:

packet.set_payload(str(sca_pkt)) 

あなたのような何かを試してみてください。

packet[DNS] = sca_pkt[DNS] 
+0

set_payloadは通常非推奨ですが、私が使っているバージョンはそうではありません。少なくとも、その文書はそれを言っていない。これらの2つの方法は正しいわけではありません。 netfilterqueue.Packetオブジェクトがアイテムの割り当てをサポートしていないか、属性ペイロードが有効でないため、プログラムはTypeError例外を送出します。 – NRdE

+0

あなたのscapyバージョンを更新しようとしましたか? (DEVのGitHubをダウンロードしてください) – Cukic0d

+0

いいえ、私は後で試してみます。どうもありがとう! – NRdE