2016-06-13 10 views
0

scapy経由でHTTPレスポンスをターゲットシステムに送信します。私はscapyがIP/TCP/ETHERのようなパケットを作成するためにレイヤー化された実装を使用することを知っています。シンプルなTCPパケットを送信するために、以下のscapyスクリプトを使用することができます。scapy経由でHTTPレスポンスを作成することは可能ですか

#!/usr/bin/python 
from scapy.all import * 

ip=IP(src="10.10.1.207", dst="10.10.1.60") 

payload="Hello World" 
PUSH=TCP(sport=80, dport=3389, flags="F") 
send(ip/PUSH/payload) 

我々はこれでHTTP層を添付することができます方法はありますか? しかし、私はターゲットマシン上でHTTP応答パケットの代わりにTCPパケットを受信するたびに多くの方法を試しました。

+1

レスポンスパケットとは、私たちがリクエストリクエスト(HTTP)を送信する任意のURLの基本情報にアクセスしようとするときに、応答として「HTTP 1.1 200 OK ...」などのヘッダーを含むレスポンスパケットを受け取ります。 scapy(または他のツール)を介してこの応答パケットを作成し、ターゲットシステムに送信します。 – prash

答えて

1

Scapyは、それがテキスト形式のプロトコルであるとして、しかし、あなたは簡単にHTTPリクエスト/レスポンスを送信することができ、ネイティブHTTP層切開を持っていません。

RESP = "HTTP/1.1 200 OK\r\n" 
RESP += "Server: exampleServer\r\n" 
RESP += "Content-Length: 6\r\n" 
RESP += "\r\n" 
RESP += "A body" 

IP(src="10.10.1.207", dst="10.10.1.60")/TCP(sport=80, dport=3389, flags="A", seq=ACK.ack, ack=ACK.seq)/RESP 

ACKは以前に作られた3ウェイの3番目のセグメントでありますハンドシェイク(SYN、SYN-ACK、ACK)は、TCPを介してデータを送信する前に必要です。

+0

ありがとうございましたJeff、これは1460バイト以内に本文を保持するとうまくいきます(つまりヘッダー+ボディ)。また、1460バイトを超えるサイズのデータ​​を(同じ応答の複数のパケットで)送信する方法を提案できますか?サイズがMTUを超えていれば、フレームが落ちてしまいます。しかし、1460バイト以上のscapyを介してターゲットシステムにHTTPレスポンスを送信する方法はありますか? – prash

+0

はい、複数のTCPセグメントを使用しています。私があなただったら、最初にHTTPレスポンスの長さを計算し、それを自分のMTUで割ると、必要なセグメントの数が得られます( 'segments_nb = len(HTTP_resp)/ MTU')。分割)し、権利シーケンス番号でそれらを送信するループを実行します。 Scapyを使用すると、手動でデータを分割する必要があります。 –

1

ScapyにはHTTPレイヤーのネイティブサポートはありませんが、Scapyの機能を拡張してHTTPレイヤーをサポートするPythonモジュールがあります。モジュール名は "scapy-http"で、githubにはinvernizzi/scapy-httpがあります。

あなたはピップを使用してインストールすることができます:ここで

 sudo pip install scapy-http

はgithubのリポジトリからのコード例である:このモジュールを使用して

  
    #!/usr/bin/env python 
    try: 
     import scapy.all as scapy 
    except ImportError: 
     import scapy 

    try: 
     # This import works from the project directory 
     import scapy_http.http 
    except ImportError: 
     # If you installed this package via pip, you just need to execute this 
     from scapy.layers import http 

    packets = scapy.rdpcap('example_network_traffic.pcap') 
    for p in packets: 
     print '=' * 78 
     p.show() 

、独自のテキストデータを送信することなく、HTTPパケットを生成することができます。

関連する問題