2016-09-29 102 views
1

假設我設法處於客戶端和服務器之間的通信過程中(假設我打開一個熱點並導致客戶端僅通過連接到服務器我的機器)。用scapy改變數據包作爲MITM

如何在不中斷自己與其他服務的通信的情況下更改我的客戶端發送和接收的數據包?必須有一種方法可以將客戶端發送並即將接收的所有數據包(在將其轉發給他之前)通過我的腳本進行路由。

我認爲完成此操作的正確方向是iptables,但不確定究竟哪些參數適合做這項工作。我已經有以下簡單的腳本:

hotspotd start #a script that runs dnsmasq as both a DNS and DHCP server, configures and starts a hotspot 
iptables -P FORWARD ACCEPT 
iptables --append FORWARD --in-interface wlan0 -j ACCEPT 
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE 
#wlan0 is the interface on which the hotspot is. 
#eth0 is the interface that is connected to the internet 

現在,這完全適用於被動MITM - 我可以看到,客戶端發送和接收的一切。但是現在我想要加強並重新定向他通過我發送和接收的每條消息。

我的最終目的是讓在那裏我可以執行以下腳本的水平:

from scapy.all import * 
from scapy_http.http import * 

def callback(pkt): 
    #Process the packet here, see source and destination addresses, ports, data 
    send(pkt) 

sniff(filter='port 666', prn=callback) #Assuming all relevant packets are redirected to port 666 

如何實現重定向的每個數據包的客戶端發送和IS-約到接收?

回答

1

您可以使用NFQUEUE其中有python bindings

NFQUEUE是一個用戶空間隊列,它是一個有效的iptables目標。您可以將某些流量重定向到NFQUQUE:

iptables -I INPUT -d 192.168.0.0/24 -j NFQUEUE --queue-num 1

然後從你的代碼中訪問數據包:

from netfilterqueue import NetfilterQueue 

def print_and_accept(pkt): 
    print(pkt) 
    pkt.accept() 

nfqueue = NetfilterQueue() 
nfqueue.bind(1, print_and_accept) 
try: 
    nfqueue.run() 
except KeyboardInterrupt: 
    print('') 

nfqueue.unbind() 

注意pkt.accept()電話。這返回一個verdict到nfqueue,告訴它它應該接受數據包 - 即允許它在內核中沿着它的正常路線繼續。要修改數據包而不是accept,您需要複製數據包,返回drop判定,最後重新發送包含的修改。

+0

似乎工作。但是,如何識別哪些數據包來自設備,哪些來自我的機器? –

+0

你可以使用iptables或你的應用程序。 1.使用IP表可以根據數據源對數據包進行過濾,並只將相關的數據發送到nfqueue中(或根據源發送到兩個單獨的NFQUEUES)。 2.由於您的應用程序從NFQUEUE收到整個數據包,因此您可以簡單地檢查您收到的每個數據包的IP地址。 – Malt

+0

但不是在後期確定?我的意思是來自某些本地地址的數據包,我認爲這些數據可以很容易地確定,但數據包**指向該設備的IP地址是什麼?他們到我的外部知識產權,這樣的壯舉會起作用嗎? –