2

スリーウェイハンドシェイクを手動で管理し、(単一のパケットを送信して) HTTP GET リクエストを Web サーバーに送信し、応答パケットを手動で管理する単純な Scapy スクリプトを作成しようとしています (そのための ACK パケットを手動で送信する必要があります)。応答)。

スクリプトの冒頭は次のとおりです。

#!/usr/bin/python

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

# Import scapy
from scapy.all import *

# beginning of 3-way-handshake

ip=IP(dst="www.website.org")
TCP_SYN=TCP(sport=1500, dport=80, flags="S", seq=100, options=[('NOP', None), ('MSS', 1448)])
TCP_SYNACK=sr1(ip/TCP_SYN)

my_ack = TCP_SYNACK.seq + 1
TCP_ACK=TCP(sport=1500, dport=80, flags="A", seq=101, ack=my_ack)
send(ip/TCP_ACK)

TCP_PUSH=TCP(sport=1500, dport=80, flags="PA", seq=102, ack=my_ack)
send(ip/TCP_PUSH)

# end of 3-way-handshake

# beginning of GET request

getString = 'GET / HTTP/1.1\r\n\r\n'
request = ip / TCP(dport=80, sport=1500, seq=103, ack=my_ack + 1, flags='A') / getString

# help needed from here...

上記のスクリプトは、3 ウェイ ハンドシェイクを完了し、HTTP GET 要求を準備します。
次に、次の方法でリクエストを送信する必要があります。

send(request)

さて、送信後、応答を取得/手動で読み取る必要があります。
私の目的は、応答の ACK パケットを手動で送信して応答を読み取ることです (これがスクリプトの主な目的です)。

どうやってやるの?

関数はsend(_)適切ですか、それとも次のようなものを使用する方が良いですかresponse = sr1(request)(ただし、この場合、ACK は自動的に送信されると思います)。

4

3 に答える 3

2

sr() を使用し、受信したすべての ans からデータを読み取り (転送チャンクを使用しているかどうかに応じて、Content-Length またはチャンクの長さを解析する必要があります)、応答として ACK を送信します。 ans リストの最後の要素まで、終了基準が満たされるまで繰り返します (グローバル タイムアウトを含めることを忘れないでください。2 秒の応答を取得せずに 8 つのパスを使用します)。

sr が sr(req, multi=True, timeout=0.25) 程度であることを確認してください。時折、ループするときにパケットが現れない期間があることがあります。そのため、HTTP にはこれらすべての長さの仕様があります。タイムアウトが長すぎると、サーバーが ACK を待ちきれなくなり、再送信を開始することがあります。

転送チャンクを使用している場合は、不正行為を試みて 0\r\n\r\n を読み取ることもできますが、それが本当にデータストリームにある場合は...ええ。TCP PSH に依存しないでください。ただし、些細なユースケースでいくつかの Wireshark セッションを処理するのは魅力的かもしれません。

明らかに、最終結果は完全に実行可能なユーザー エージェントではありませんが、ほとんどの目的には十分に近いものです。Keep-Alive ヘッダーを送信し、例外が発生した場合は RST を送信し、問題がなければ TCP セッションを丁寧に終了することを忘れないでください。

RFC 2616 は笑いのためだけに 176 ページの長さではないことに注意してください。

于 2013-06-18T21:26:07.343 に答える
0

TCP_PUSH=TCP(sport=1500, dport=80, flags="PA", seq=102, ack=my_ack) send(ip/TCP_PUSH)

seq は 102 ではなく 101 にする必要があります

于 2014-05-19T06:59:49.120 に答える
-1

試しましたか:

responce = sr1(request)
print responce.show2

また、netcat にはいくつかのバグがあるため、wireshark や tcpdump などの別のスニファーを使用してみてください。

于 2013-06-16T20:37:40.807 に答える