2014-12-04 125 views
2

你好,我正在使用nfqueue和scapy,我的目標是在我的NFQUEUE接收數據包,更改有效負載並重新發送它們。用nfqueue/scapy更改TCP負載

我可以改變字段像TTL沒有任何問題,但是當涉及到更改有效載荷時,我正在解決問題。

當我更改有效載荷時,我用wireshark嗅探數據包,顯然我發送的數據包修改了有效負載,但服務器不回答。

這是我的代碼:

#!/usr/bin/env python 

import nfqueue 
from scapy.all import * 
def callback(payload): 
    data = payload.get_data() 
    pkt = IP(data) 

    pkt[TCP].payload = str(pkt[TCP].payload).replace("ABC","GET") 

    pkt[IP].ttl = 40 

    print 'Data: '+ str(pkt[TCP].payload) 
    print 'TTL: ' + str(pkt[IP].ttl) 

    del pkt[IP].chksum 
    payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt)) 
def main(): 
    q = nfqueue.queue() 
    q.open() 
    q.bind(socket.AF_INET) 
    q.set_callback(callback) 
    q.create_queue(0) 
    try: 
     q.try_run() # Main loop 
    except KeyboardInterrupt: 
     q.unbind(socket.AF_INET) 
     q.close() 

main() 

我已經將這個規則傳出通信到端口80:iptables -I OUTPUT -s 192.168.1.10 -p tcp --dport 80 -j NFQUEUE

而且,爲了測試它,比如我打開遠程登錄到谷歌的80端口,做一個GET/HTTP/1.1,這是我所看到的:

TTL: 40 
DATA: GET/HTTP/1.1 

現在,如果我做ABC/HTTP/1.1我收到沒有答案!我的telnet卡住了。

我也嘗試過HTTP網站瀏覽器瀏覽東西,檢查wireshark如何我的TTL真的變爲40,然後,瀏覽字符串「ABC」,我的瀏覽器再次卡住。 我嗅探請求改爲GET,但我沒有收到答案。

謝謝有點讓我頭痛,如果有更多經驗的人可以讓我走向正確的路,我會非常感激。先謝謝你。

+2

我想你應該觸發TCP校驗和字段的重新計算,以類似於IP校驗和字段的方式。 – Yoel 2014-12-04 15:05:57

回答

7

我添加了重新計算TCP校驗和的行,這是有用的。

這隻有當我改變有效載荷時纔有效我不改變它的長度,否則我需要改變IP頭的字段長度並回答自己,也許其他人正在尋找這個答案,我實現這一目標只是做:

payload_before = len(pkt[TCP].payload) 

pkt[TCP].payload = str(pkt[TCP].payload).replace("Heading","Other string") 

payload_after = len(pkt[TCP].payload) 

payload_dif = payload_after - payload_before 

pkt[IP].len = pkt[IP].len + payload_dif 

我知道,我必須要改變更多的領域,因爲有時,如果你對於需要分裂成一個新的數據包添加足夠的有效載荷,你必須改變更多的領域。

目前我不知道如何有效地實現這一點,但一點一點。希望有人找到我的解決方案來改變有效載荷。

+0

感謝您的評論,但如果您希望一切正常工作,您還必須添加'payload.set_verdict_modified(nfqueue.NF_ACCEPT,str(pkt),len(pkt)+ payload_dif)' – 2018-01-31 19:47:00

4

在第二種情況下,您正在篡改TCP層以及IP層。

你讓Scapy修復IP校驗和,但不是TCP校驗。在代碼中將del pkt[IP].chksum更改爲del pkt[IP].chksum pkt[TCP].chksum