簡體   English   中英

如何將http標頭添加到使用scapy嗅探的數據包中

[英]how to add http headers to a packet sniffed using scapy

我試圖使用scapy嗅出一個輸出的http數據包,在其中添加一些新的http標頭並將其發送到前面。 這里的目的是僅在保持數據包完整的同時插入新標頭。 在最大任何校驗和時,如果需要,應該重新計算。

幾乎所有關於SO的問題,但沒有完全得到解決方案。

以下就是我所做的。

def parse(pkt):

    if pkt.haslayer(TCP) and pkt.getlayer(TCP).dport == 80 and pkt.haslayer(Raw):
        pkt = pkt / "New Header:value\r\n\r\n"

        # OR i tried this
        #pkt = pkt.getlayer(Raw).load / Raw.load(load="New Header:value\r\n\r\n")

        #pkt.getlayer(Raw).load("New Header:value\r\n\r\n")
        pkt.show()
        #del pkt[IP].chksum
        send(pkt)
#end parse function

# start sniffing
a=sniff(filter="tcp and ( port 80 )", prn=parse)

問題是上面的代碼插入了一個新的原始有效負載部分,而不是添加一個普通的頭。 已有雙重換行符\\ r \\ n \\ r \\ n根據HTTP標准指示標頭終止。

為了解決這個問題,我嘗試通過以下方式刪除最后一個\\ r \\ n

   #pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n")

但這會刪除所有以前存在的標題,只剩下“新標題”。

我在Linux薄荷上試過這個。

更新:我正在嘗試創建一個新的http有效載荷,其中包含以前的標題,我將添加一些。 有人可以幫助解決如何刪除現有圖層的問題

如果我理解正確,您遇到的問題是您希望使用新標頭更新現有HTTP請求。 你想要的是更新一個字符串,Python不能直接做(字符串是不可變的)。

所以你應該做的是采取HTTP標頭:

old_hdr = pkt[Raw]old_hdr = pkt[TCP].payload

並像字符串一樣操縱它:

new_hdr = 'New Header: value'
hdr = old_hdr.split('\r\n') # This is a crappy hack. Parsing HTTP headers
hdr.insert(new_hdr, 2)      # is a [solved problem][1].
send_hdr = '\r\n'.join(hdr)
pkt[TCP].payload = send_hdr

如果您發現校驗和未更新,請在發送數據包之前將其刪除:

del pkt[TCP].chksum

而Scapy會用適當的價值回饋你。

編輯:我剛注意到我的鏈接失敗了。 以下是解析HTTP標頭的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM