Windowsパケットキャプチャガイド②:Fiddlerがキャプチャできなかったパッケージはどうなりましたか?

HTTPSパッケージをキャッチできません

「Windowsパケットキャプチャガイド①:サードパーティプログラムのProxifier+Fiddler強制キャプチャ」

前回の記事を振り返ると、Proxifierを使用してサードパーティプログラムのすべてのTCPトラフィックをFiddlerのHTTPSプロキシに転送し、FiddlerがHTTP / HTTPSプロトコルの通信コンテンツを解析できるようにしましたが、実際の使用プロセスでは、 HTTPリクエストの解析は問題ではありませんが、一部のサードパーティプログラムはHTTPS通信コンテンツを解析できません。つまり、Fiddlerで443ポートへのトンネルを確認できますが、フォローはありません。
ここに画像の説明を挿入

理由を分析する

自分自身と敵を知っていれば、百戦に巻き込まれることはありません。何が起こっているのかを知るための最良の方法は、自分でプログラムを作成し、HTTPS要求を行ってから、このメソッドを使用して独自のパッケージを取得し、何が問題だったかを確認することです。したがって、最も単純なPythonコードでテストしてください。

import requests
requests.get("https://www.csdn.net")

次に、Proxifier + Fiddlerを使用してパッケージを強制的にキャプチャし、Pythonプログラムが例外をスローしたことを確認します。

トレースバック(最後の最後の呼び出し):
ファイル「C:\ Python36 \ lib \ site-packages \ urllib3 \ contrib \ pyopenssl.py」、453行目、wrap_socket
cnx.do_handshake()
ファイル「C:\ Python36 \ lib \ site -packages \ OpenSSL \ SSL.py ”、1907行、do_handshake
self._raise_ssl_error(self._ssl、result)
ファイル“ C:\ Python36 \ lib \ site-packages \ OpenSSL \ SSL.py ”、1639行、_raise_ssl_error
_raise_current_error()
ファイル「C:\ Python36 \ lib \ site-packages \ OpenSSL_util.py」、54行目、exception_from_error_queueで
exception_type(errors)
OpenSSL.SSL.Errorを発生させます:[('SSLルーチン'、'tls_process_server_certificate'、'certificate検証に失敗しました')]

SSL証明書の検証にエラーがあるため、他のサードパーティプログラムも例外をスローする必要があり、インターネットに正常に接続できず、正常に動作しないことは理解できます。前述のように、FiddlerがHTTPSパケットのコンテンツをキャプチャして復号化できる理由は、Fiddlerがman-in-the-middle攻撃方式を使用しているためです。この方式を正常に実装できるようにするには、クライアントがFiddlerによって提供されるルート証明書。[アクション]— [ルート証明書を信頼する]を介してシステムにFiddlerのルート証明書を信頼させた後、WinInetライブラリに基づくHTTP通信用のほとんどのブラウザとプログラムは、オペレーティングシステムに追加したFiddlerルート証明書を信頼します。 。ただし、サードパーティプログラムが通信に他のHTTPライブラリを使用する場合、たとえば、libcurlを使用するVCプログラム、JDKでURLConnectionを使用するJAVAプログラム、またはサードパーティのOkHttp、System.Net.Httpを使用するC#、リクエストを使用するPythonなど、これらのHTTPライブラリには通常信頼できるSSLルート証明書のセット。オペレーティングシステムに付属のSSLルート証明書は使用せず、オペレーティングシステムに追加したFiddlerルート証明書も使用しないため、検証が失敗します。
例としてPythonを使用すると、これはリクエストのドキュメントで確認できます:
https ://2.python-requests.org/en/master/user/advanced/#ca-certificates

リクエストには、Mozillaトラストストアから提供された、信頼できるルートCAのセットがバンドルされています。証明書は、リクエストのバージョンごとに1回だけ更新されました。

解決

次に、2つの解決策があります。1つは、HTTPクライアントに証明書の検証を無効にすることです。

import requests
requests.get("https://www.csdn.net", verify = False)

1つは、HTTPクライアントにFiddlerルート証明書を信頼させることです。http:
ここに画像の説明を挿入
//127.0.0.1 : 8888にアクセスしてFiddlerルート証明書をダウンロードし、opensslを使用してPythonリクエストでサポートされる形式に変換します。

openssl x509 -inform der -in FiddlerRoot.cer -out fiddler.pem

PythonのHTTPクライアントにそれを信頼させます。

import requests
requests.get("https://www.csdn.net", verify = "./fiddler.pem")

その後、FiddlerはプログラムのHTTPSパッケージを正常にキャプチャし、復号化できます

しかし、卵はありませんか?

これまで、独自のプログラムを作成し、独自のパッケージをキャプチャすることで、サードパーティのプログラムをキャプチャするときに一部のHTTPSパケットをキャプチャまたは復号化できない理由を理解しました。また、2つの解決策を見つけました。1つはターゲットプログラムを許可することです。 SSL検証を無効にします。1つは、ターゲットプログラムにFiddlerルート証明書を信頼させることです。
この時点で、何人かの友人が文句を言うでしょう。私がキャッチしたいターゲットプログラムは私によって書かれておらず、そのコードもありません。SSL検証を無効にするか、Fiddlerルート証明書を信頼するように変更するにはどうすればよいですか。

解決策がある

ターゲットプログラムを分析する場合、ターゲットプログラムを逆コンパイルすることで、ターゲットプログラムが使用するHTTPクライアントライブラリを大まかに把握します。一般に、HTTPクライアントを単独で実装するプログラムはほとんどなく、ほとんどのプログラムが言語標準ライブラリまたは最初のライブラリを使用します。サードパーティのオープンソースHTTPクライアントライブラリ。たとえば、VCは通常WinInetまたはWinHttpを使用し、C#は通常System.Net.Httpを使用し、Javaは通常URLConnectionまたはOkHttpを使用します。これらは基本的に分離できません。逆コンパイルと組み合わせると、これらのHTTPクライアントは通常オープンソースになります。オープンソース、APIは公開されており、このライブラリでSSL検証を無効にする方法と、指定されたルート証明書を信頼する方法を見つけることは難しくありません。次に、ターゲットプログラムは、逆コンパイル、再コンパイル、APIHook、DLLインジェクション、シェルコードなどを使用して、SSL検証を無効にするか、Fiddlerルート証明書を信頼できます。それからあなたは喜んでそのバッグをつかんでその心を読むことができます。

以降の記事では、それを行う方法を詳細に説明するために、いくつかのターゲットを絞った例を示します。


この記事は、CSDNブログでencoderleeによって公開されました:https ://blog.csdn.net/CharlesSimonyi/article/details/90486208再版のソースを示してください

おすすめ

転載: blog.csdn.net/CharlesSimonyi/article/details/90486208