web-dev-qa-db-ja.com

PythonでHTTPSリクエストをキャプチャする方法はありますか?

HTTPリクエストをキャプチャする簡単なpythonスクリプトを作成しました。HTTPリクエストをpythonスクリプトでキャプチャしました。

しかし、HTTPSリクエストをキャプチャできません。 URLに関する情報を取得したいだけです。

スニッフィングにはscapyを使用しました。例えば:

from scapy.all import IP, sniff
from scapy.layers import http

def tcp_ayikla(paket):
    if not paket.haslayer(http.HTTPRequest):
        return

    http_katmani = paket.getlayer(http.HTTPRequest)

    ip_katmani = paket.getlayer(IP)
    print '\n{0[src]} IP adresinden {1[Method]} {1[Host]}{1[Path]} sitesine ziyaret'.format(ip_katmani.fields, http_katmani.fields)

sniff(filter='tcp', prn=tcp_ayikla)

だから、私はスニッフィングについて質問があります。

1-)なぜHTTPSリクエストを取得できないのですか?

netstatを次のように使用すると:

netstat -ap | grep http

HTTPSリクエストを確認できます

2-)他のプログラミング言語で何か方法はありますか?

HTTPリクエストをログに記録しようとしているためです。

私は何をしましたか?

  • Pythonでnetstat出力を解析してみました。これはしたくない。それは純粋なPythonではないからです。
  • Scapyで試しました。 HTTPSリクエストをキャッチできませんでした。
  • SQLiteからURL情報を読み取ってみました。これはしたくない。それはネットワークの問題ではないからです。

どうすればいいですか?

あきらめるべきですか

2
Ali

HTTPSプロトコルは、HTTPアプリケーション層の上で暗号化されます。つまり、GETリクエスト(完全なURL)はHTTPヘッダーで暗号化され、ネットワークトラフィックを盗聴しているアプリケーションはトラフィックを復号化できません。

つまり、IP層はHTTPSで暗号化されていないため、IPアドレス(特にポート443-HTTPSでサーバーに接続されているもの)をログに記録できます。

これは、netstatコマンドが行うことです。 TCPネットワークカード上の接続を検索し、どの接続がポート443(httpsの既知のプロトコル)に接続しているかを記録し、接続しているHTTPSサーバーのIPアドレスを監視します。

暗号化されたネットワークトラフィックをキャプチャした場合、ブラウザからSSLキーを保存すると、キャプチャされたトラフィックを復号化できることに注意してください。 SSLキーをログに記録するときに、 Wiresharkを使用してSSLで盗聴されたネットワークトラフィックを復号化する方法については、ここを参照してください 。あなたはscapyで同様のことができるはずです。

5
dr jimbob

HTTPSトラフィックを傍受するために使用できる手法は複数あります。数週間前、インターネットのトラフィック(HTTPまたはHTTPS)を簡単に表示できるように、asyncioを使用して中間者アプリケーションを作成しました。ここでプロジェクトを見つけることができます。 mitmhttps://github.com/synchronizing/mitm

基本的に、通常のクライアント接続が次のようになっていると想像すると、

_client <-> server_

mitmは、クライアントのサーバーとして、およびサーバーのクライアントとして機能する中間者プロキシを作成します。

client <-> mitm (server) <-> mitm (emulated client) <-> server

mitm (server)mitm (emulated client)は、clientserverの間で発生する要求を吐き出すことができます。

0
Felipe Faria