7

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)

問題は、上記のコードがプレーン ヘッダーを追加する代わりに、新しい生のペイロード セクションを挿入することです。HTTP 標準に従って、ヘッダーの終了を示す二重の改行 \r\n\r\n が既に存在します。

これを克服するために、次のようにして最後の \r\n を削除しようとしました

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

ただし、これにより、以前に存在したすべてのヘッダーが削除され、「新しいヘッダー」のみが残ります。

Linuxミントでこれを試しました。

更新:以前のヘッダーを含む新しい http ペイロードを作成しようとしていますが、いくつか追加します。既存のレイヤーを削除する方法を教えてください。

4

1 に答える 1

6

私の理解が正しければ、あなたが抱えている問題は、既存の 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 ヘッダーを解析する方法は次のとおりです

于 2012-10-25T13:53:42.900 に答える