2012-04-05 77 views

回答

2

「但它不會工作,因爲原始數據包已經到達目的地。」

因此,首先您需要設置一些MiTM解決方案,以便兩端之間的所有通信都通過您的設備,並讓您修改分組數據。

這個功能/攻擊的一些已知軟件插件是ettercap和cain/abel。

3

iTayb,

看來你有興趣進行代理使用Scapy的某種服務的?如果是這樣的話?

業務的第一順序是一些如何讓數據包通過運行scapy的箱子。通過將遠程機器上的網關設置爲與scapy盒相匹配來實現此目的。如果這是針對某種筆式測試,則需要僞裝一些mac地址。你可以用scapy使用arpcachepoison方法或者像ettercap這樣的第三方程序來做到這一點。

完成此操作後,使用sniff()和send()函數的方法應該會更好一些,只需確保在到達發送部分之前更改數據包;)下面是一個小例子,說明如何做到這一點...在這裏我只是改變IP頭目標地址,但你可以改變任何你想要的。

from scapy import * 

def chgSend(x): 
    x[IP].dst = '192.168.1.1' 
    send(x) 
while 1: 
    sniff(prn=chgSend) 

DC

+0

我知道這是稍微大一點的線程,但類似的一個 - 你可以將輸出數據包更復雜的方式?如在http有效負載中插入另一種http頭,而不修改IP或TCP頭。任何參考相關API等? – fayyazkl 2012-10-22 06:42:45

+0

但是,當然,取決於您想要更改的內容可能涉及其他模塊。例如,如果你想改變所有HTTP GET請求數據包的有效載荷,我將使用re解析頭,然後相應地發送修改後的數據包。 – dc5553 2012-10-22 14:10:04

+1

我實際上想要插入一個新的http頭。這意味着覆蓋最後的\ r \ n並添加更多的字段。 – fayyazkl 2012-10-22 17:36:13

2

我有同樣的問題,

我認爲這個問題是你已經啓用IP_FORWARD所以原來的包轉發到修改的數據包之前的原始目的是通過Scapy的發送。

Theorically,該解決方案是建立在iptables的轉發要修改到另一個端口(這是多了還是少了什麼Ettercap做internaly)什麼的報文,

 i.e = iptables -t nat -A PREROUTING -p tcp --destination-port "YourInterestingPort" -j REDIRECT --to-port 1234 

然後在Scapy的聽到該端口,修改數據包並將數據包發送到原始端口。

該解決方案難以實施,因爲過濾的,你必須重定向和修改只所需的數據包,並排除SYN ACK ARP等..

如果要修改服務器的響應,一個更簡單的方法就是不用動態地修改數據包,而是像中介一樣行事。

  • arpspoof
  • ipatbles
  • 打開插座,接收數據包,打開連接,並將其發送到原來的目的地一樣,如果你是一個客戶端和接收答案,修改答案,並將其返回給原來的查詢者。

    while True: c,addr = s_mb.accept()#建立與客戶端的連接。 查詢= c.recv(BUFFER_SIZE)

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        s.connect((IP, PORT)) 
        s.send(PACKET) 
        response = s.recv(1024) 
        if response = "THIS IS THE RESPONSE THAT I WANT TO MODIFY": 
        if(real_simulation): 
         fakeresponse = "MODIFIED RESPONSE" 
         #print "The packet has beeb modified" 
         else: 
         fakeresponse = response 
        s.close()  
        c.send(fakeresponse) 
    

(對不起,我髒代碼)