web-dev-qa-db-ja.com

Python-Scapyなど-パケットレベルでHTTP GETリクエストを作成するにはどうすればよいですか

私は中程度のプログラマーであり、ネットワークプログラミングを始めています。

ネットワーク全般の理解を深めるための試みとして、パケットレベルからいくつかの基本的なHTTPアクションを実行しようとしています。私の質問はこれです:SCAPYなどのライブラリを使用して、HTTP GET要求と関連アイテムをパケットレベルで構築するにはどうすればよいですか?これは奇妙に聞こえるかもしれませんが、それを詳述する情報を見つけることができないようで、PAROSとEtherealを使った自分自身の試みは...満足できるものではありませんでした。

提供された助けをありがとう!

トリミアト

24
Trimiert

完全な3ウェイハンドシェイクを行う場合は、手動で行う必要があります。

SYNパケットから始めます。

>>> syn = IP(dst='www.google.com') / TCP(dport=80, flags='S')
>>> syn
<IP  frag=0 proto=tcp dst=Net('www.google.com') |<TCP  dport=www flags=S |>>

次に、サーバーからSYN-ACKパケットを受信すると、sr1が機能します。次に、HTTP GETリクエストを送信します。

>>> syn_ack = sr1(syn)
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets

>>> syn_ack
<IP  version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP  sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding  load='\x00\x00' |>>>

次に、TCPシーケンス番号と確認番号を設定し、GETを送信します。

getStr = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
request = IP(dst='www.google.com') / TCP(dport=80, sport=syn_ack[TCP].dport,
             seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A') / getStr
reply = sr1(request)
34
nmichaels

Scapy 2.4.3以降、FTRはHTTPパケットの分析を実装し、「TCP_client」と呼ばれるユーティリティの中で自動的に3つのハンドシェイクを行います。

上記の回答ほど教えることはありませんが、一見しても害はありません: https://scapy.readthedocs.io/en/latest/layers/http.html#use-scapy-to- send-receive-http-1-x

load_layer("http")
req = HTTP()/HTTPRequest(
    Accept_Encoding=b'gzip, deflate',
    Cache_Control=b'no-cache',
    Connection=b'keep-alive',
    Host=b'www.secdev.org',
    Pragma=b'no-cache'
)
a = TCP_client.tcplink(HTTP, "www.secdev.org", 80)
answser = a.sr1(req)
a.close()
2
Cukic0d

チュートリアル をご覧になりましたか?コピーして貼り付けるだけで、これはHTTPリクエストを組み立てるように見えます:

>>>  a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"
1
Thomas K