ネットワーク盗聴者に見えるデータのみに基づいて、HTTPSクライアントを受動的にフィンガープリントすることは可能ですか?
言い換えると、すべてのパケットを見ることができる(ただし、秘密鍵を知らず、トラフィックを受動的に監視しているだけの)ネットワーク監視ボックスを検討してください。ネットワークトレースに表示される内容のみに基づいて、使用されているクライアントのバージョンを合理的に推測できますか?たとえば、クライアント側で使用されているブラウザとバージョンを推測できますか?
もちろんTLSはデータとペイロードを暗号化しますが、平文で送信されるいくつかの値があります:クライアントによって提案された暗号スイートのセット、クライアントの日付/時刻(client_random
の最初の4バイト)、リストクライアントがサポートする圧縮方法、クライアントがサポートするTLS拡張のリスト、そしてもちろんこれらの各リストの値の順序。ユーザーが使用しているブラウザを推測し、ほとんどの主要なブラウザを区別するのに十分なバリエーションはありますか?ブラウザのバージョンを区別するのに十分ですか?
私はp0f( パッシブOSフィンガープリント を行う)に類似したものを考えていますが、ここではHTTPS接続の暗号化されていない部分を探しています(むしろTCP headers)より、ここでの目標は、クライアントが使用するOS /クライアントを推測するのではなく、クライアントホストが使用するブラウザ/ HTTPSクライアントを推測することです。
Lee BrotherstonがDerbyCon 2015でTLSフィンガープリントによるステルス攻撃とスマートな防御について講演しました- slides - video 。
彼はまた、講演に合わせてコードをリリースしました https://github.com/LeeBrotherston/tls-fingerprinting/tree/master/fingerprintls
以下は彼のウェブサイトからの抜粋です- http://blog.squarelemon.com/tls-fingerprinting/
トランスポート層セキュリティ(TLS)は、正当な金融取引からプライベートな会話、マルウェアがホームにコールするまで、あらゆる種類のネットワーク接続に暗号化の形でセキュリティを提供します。盗聴者がこの暗号化されたトラフィックを分析できないことで、正当なユーザーか悪意のあるユーザーかを保護します。 TLSを使用するユーザーは、盗聴者がセッションの存在、送信元と宛先のIPアドレスを簡単に観察できるものの、コンテンツ自体は安全で読めないため、接続の一方または両方の端にある暗号化キー素材にアクセスできないという前提で動作します。表面的にはこれは当てはまり、設定の欠陥や悪用可能な脆弱性を除きます。ただし、TLSフィンガープリントを使用すると、使用されているクライアントをすばやく受動的に判別し、攻撃者と攻撃者の両方からこの情報を適用するのが簡単です防御側の視点。
[...]
FingerprinTLS
FingerprinTLSは、既知のTLS接続を迅速に識別し、不明なTLS接続をフィンガープリントするように設計されています。入力は、ライブネットワークスニッフィングまたはPCAPファイルの読み取りを介して取得されます。認識された接続の出力は、(現在)人間が読める形式であり、指紋の定義に使用されるJSON形式の不明な指紋の出力です。
生成された指紋は、FingerprintoutによってC構造体としてエクスポートされ、FingerprinTLSにコンパイルされて、将来のインスタンスで検出できるようになります。
Leeは、SecTor CAで後の講演でTLS署名を使用してクライアントを簡単にフィンガープリントすることができることを示しています http://www.slideshare.net/LeeBrotherston/tls-fingerprinting-sectorca-edition -スライド66と69-70を必ず確認してください。
fingerprintls -i en0 -s
彼はまた、ここに新しい署名をインポートする方法を示します https://Gist.github.com/LeeBrotherston/1a0ae1aedd968af1fce
別のデモでは、Wireshark、tcpdump、libpcapなどの他のツールやフレームワークからバークレーパケットフィルター(BPF)を利用する方法を示しています https://Gist.github.com/LeeBrotherston/92cc2637f33468485b8f
最後に、Leeは、Androidデバイス-- https://Gist.github.com/LeeBrotherston/5cca4b372277d7c6a049b26f87544351 = [(Pokemon Goビデオゲームからのサンプルpcapを分析します===
ここで他のいくつかの回答で説明されている古い方法も確かに関連があるかもしれませんが、上記の作業を確認することをお勧めします。 SSLLabsが行った作業の詳細については、- https://github.com/ssllabs/sslhaf -をご覧ください。これは、パッシブSSLクライアントフィンガープリント用のApacheモジュールです
はい、SSLトラフィックのフィンガープリントを実行できます。クライアントのフィンガープリントは、opensslなどの一般的なライブラリの1つを使用するため、フィンガープリントを作成するのは難しいかもしれません。したがって、curl対firefox対wgetではなく、これらのライブラリのさまざまなバージョンをフィンガープリントできる可能性があります。
はい。この方法でクライアントをフィンガープリントすることが可能です。これを実装する既存のツールもいくつかあります。
ただし、あまり正確ではないようです。主要なブラウザーの種類(Firefox、Chrome、Safariなど)を認識できる可能性がありますが、バージョン番号を正確に識別できる可能性は低く、この方法で取得された指紋はあいまいになる可能性が高くなります。多くの場合、観察されたSSLトレースと一致する可能性のある複数のクライアントがあり、この方法では通常、ほんの数ビットのエントロピーしか得られません。
P0fツールには、指紋のデータベースを使用して、トレースに基づいてTLSクライアントを推論するためのサポートが含まれています。あなたはそれがどのように機能するかの説明を見つけることができます SSL Labsのgithubページで 。
次のペーパーでは、TLSクライアントをこのようにフィンガープリントする実験についても説明しています。
MartinHusák、MilanČermák、TomášJirsı́k、PavelČeleda。 HTTPSトラフィック分析およびパッシブSSL/TLSフィンガープリントを使用したクライアント識別 。 URASIP Journal on Information Security、2016年