
MITM(モンスター・イン・ザ・ミドル)検出ツール。MALCOLM の構築に使用されます:
このプロジェクトの目標は、HTTPSインターセプションの正確な検出と、堅牢なTLSフィンガープリンティングを可能にすることです。 このプロジェクトは、HTTPSインターセプションのセキュリティへの影響 に基づいており、彼らの処理スクリプトとフィンガープリント をGoに移植したものから始まりました。
MITMEngineの詳細については、このCloudflareブログ記事をご覧ください。 クイックリンク:
wireshark -v)詳細なドキュメントはコードと共にあります(最初にパッケージを $(GOPATH)/src/github.com/cloudflare/mitmengine にコピーしてください)。
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
このプロジェクトでは、フィンガープリントはオブジェクトの具体的なインスタンスに対応し、署名は複数のオブジェクトを表すことができます。この命名規則を使用するのは、フィンガープリントは通常オブジェクトの固有の特性であるのに対し、署名は選択可能だからです。同様に、サーバーが受け取る実際のクライアントリクエストはフィンガープリントを持ち、リクエストを生成するソフトウェアは独自の署名を選択できます(例えば、サポートする暗号スイートを選択することにより)。
クライアントリクエストのフィンガープリントは、サーバーへのクライアントリクエストから導出され、TLSとHTTPの両方の特徴を含みます。クライアントリクエストの署名は、ソフトウェアが生成できるすべての可能なフィンガープリントを表します。目標は、各署名を個々のソフトウェアを一意に識別できるほど具体的にすることです。
ユーザーエージェントの署名は、ブラウザによって生成される一連のユーザーエージェントを表します。ブラウザのユーザーエージェント署名は、ブラウザバージョンの範囲を指定でき、OS名、OSプラットフォーム、OSバージョン範囲、デバイスタイプを指定して、より細かな署名を作成できます。
ブラウザの署名には、ユーザーエージェントの署名とクライアントリクエストの署名の両方が含まれます。これにより、例えばWindows 10上のChrome 31-38によって生成されるすべての可能なフィンガープリントを署名で表すことができます。
MITMの署名には、クライアントリクエストの署名と、MITMソフトウェアに関する追加の詳細(セキュリティ評価を含む)が含まれます。セキュリティ評価は、クライアントリクエスト以外の要因(ソフトウェアが証明書を検証するかどうかなど)によって影響を受ける可能性があります。
HTTPS接続がインターセプトされたと見なすのは、ユーザーエージェントによって識別されたブラウザに対応する期待されるクライアントリクエスト署名と、実際のクライアントリクエストフィンガープリントとの間に不一致がある場合です。
特定のクライアントソフトウェアに対して署名が不正確または古い場合、その署名が接続を誤ってインターセプトと判定する可能性があります。
プロキシがクライアントのリクエストを厳密に模倣する場合、不一致を検出できない可能性があります。ブラウザの署名が広すぎる場合も、インターセプトを検出できません。
MALCOLMで使用されている参照ブラウザおよびMITMソフトウェアのフィンガープリントは、reference_fingerprints/mitmengine/ にあります。
このフィンガープリントセットは、reference_fingerprints/pcaps/ のTLS Client Hello pcapから抽出されたものと、Cloudflareのネットワークで観測され、信頼性評価が高い(人間および親切なボットのトラフィックに対応する)トップ500のユーザーエージェントとTLS Client Helloのペアを組み合わせたものです。
理想的には、Cloudflareのネットワークからサンプリングされた参照フィンガープリントに頼る必要はなく、代わりに包括的なpcapセットを用意して参照TLS Client Helloセットを構築したいと考えています。データセットの構築に協力してみませんか?貢献方法をご覧ください。
まず、ユーザーは mitmengine.Config 構造体を作成して mitmengine.NewProcessor に渡す必要があります。mitmengine.Config 構造体は、ブラウザフィンガープリント、MITMフィンガープリント、MITMヘッダーを含むファイルのファイル名を指定できます。あるいは、前述のファイルを他のソースから読み取るための設定ファイルを指定することもできます。現在、MITMEngineはAmazon S3互換データベース(Amazon S3やCephを含む)からの読み取りをサポートしています。データベース用のその他のファイルリーダー(「ローダー」と呼びます)は loaders パッケージで定義でき、新しいローダーがLoaderインターフェースを実装している限り、そのままMITMEngineの残りの部分で動作するはずです。
MITMEngineパッケージへの意図されたエントリポイントは、Processor.Check 関数です。この関数はユーザーエージェントとクライアントリクエストのフィンガープリントを受け取り、MITM検出レポートを返します。将来的には、実行中のプロセスに新しい署名を追加できるようにするなど、追加のAPI関数が追加される予定です。
以下はAPIの使用例です。より完全なアプリケーションは cmd/demo/main.go にあり、make bin/demo を実行してビルドできます。
rawUa := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
requestFingerprintString := "303:dada,1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,9c,9d,2f,35,a:aaaa,0,17,ff01,a,b,23,10,5,d,12,33,2d,2b,1b,dada,15:9a9a,1d,17,18:0::"
uaFingerprintString := "1:72.0.3626:2:3:10.14.3:1:"
requestFingerprint, _ := fp.NewRequestFingerprint(requestFingerprintString)
uaFingerprint, _ := fp.NewUAFingerprint(uaFingerprintString)
report := mitmProcessor.Check(uaFingerprint, rawUa, requestFingerprint)
TLSのrequestFingerprintStringの形式は以下の通りです:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
uaFingerprintの形式は以下の通りです:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
ユーザーエージェントをuaFingerprintの形式に解析する方法の例は、cmd/demo/main.go ファイルにあります。
MITMEngineを使用するには、依存関係を取得してください。MITMEngineでテストを実行する前に、ベンダリングやgomodのロジックを実行することをお勧めします。
テストするには make test を、コードカバレッジを確認するには make cover を実行してください。
ブラウザやMITMのフィンガープリントはすぐに古くなるため、新しいサンプルでフィンガープリントリポジトリを更新するための積極的な協力を求めています。
フィンガープリントサンプル(以下「サンプル」)を提供することにより、あなた(あなた自身のため、またはあなたが代表する組織もしくはスポンサー(いる場合)のために)は、Cloudflare, Inc.およびその子会社、関連会社に対し、サンプルに関するすべての知的財産権に基づく、永続的、取消不能、非独占的、ロイヤリティフリー、全世界的な権利およびライセンスを以下の目的で付与します:(1) サンプルの複製、公開、表示、配布、(2) サンプルに基づく、またはサンプルの一部である派生物の作成。
フィンガープリントサンプルを提供するには、以下の手順に従ってください:
(macOS Mojave 10.14.3でテスト済み)
サーバーRSA証明書と鍵ペアを作成:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
ポート4433でサーバーを起動:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
HTTPヘッダーを復号するためのTSharkキャプチャを開始(TShark >= 3.0.0):
tshark -i loopback -o tls.keys_list:"127.0.0.1,4433,http,server.pem" -Tjson -e http.request.line -Y http > header.json
TLS Client HelloのTSharkキャプチャを開始:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
フィンガープリントを取得したいTLSクライアントから https://localhost:4433 にアクセスしてください。例:
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
上記のようにフィンガープリントサンプル(header.json、handshake.pcap)を生成し、ディレクトリ reference_fingerprints/pcaps/<desc> に配置します。ここで <desc> は一意で説明的な名前です。
reference_fingerprints/fingerprint_metadata.jsonl に以下のフィールドを含む行を追加します。os、device、platform、browser フィールドの認識されるオプションは uasurfer パッケージで定義されているものです。mitm_fingerprint.type の認識されるオプションは以下にリストされています。例については reference_fingerprints/fingerprint_metadata.jsonl を参照してください。不明なフィールドは空白または省略できます。
{ "desc": "", "comment": "", "handshake_pcap": "", "header_json": "<(optional) path to file containing the client HTTP request", "ua_fingerprint": {"raw_ua": "", "os": "<WindowsPhone|Windows|MacOSX|iOS|Android|...>", "os_version": "..", "device": "<Windows|Mac|Linux|...>", "platform": "<Computer|Tablet|Phone|...>", "browser": "<Chrome|IE|Safari|Firefox|...>", "browser_version": ".."}, "mitm_fingerprint": { "name": "", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
その他のPRや機能リクエストも歓迎します!
mergeDB(cmd/mergedb 内)は、ブラウザやMITMソフトウェアの複数の近いバージョンにわたる類似したTLS ClientHelloフィンガープリントをマージするためのユーティリティです。
mergeDBを使用して、ユーザーエージェント/Client Helloフィンガープリントの大きなリストを統合します:
go run cmd/mergedb/main.go
デフォルトでは、mergeDBは reference_fingerprints/mitmengine ディレクトリ内のフィンガープリントに対して実行されます。
上記の変更を含むプルリクエストを送信してください。