
アクティブなTLSサーバーフィンガープリンティングツールで、カスタマイズされたClient Helloパケットを送信してユニークなJARMハッシュを生成し、サーバー設定の識別、インフラのグループ化、悪意のあるサーバーの検出を行います。
詳細については、最初の JARM ブログ記事 をお読みください。
JARM はアクティブな Transport Layer Security (TLS) サーバーフィンガープリンティングツールです。
JARM フィンガープリントは以下の用途に使用できます。
JARM のサポートは以下のサービスに追加されている、または追加が進められています。 SecurityTrails Shodan BinaryEdge RiskIQ Palo Alto Networks Censys 360
python3 jarm.py [-h] [-i INPUT] [-p PORT] [-v] [-V] [-o OUTPUT] [-j] [-P PROXY] [domain/IP]
例:
% python3 jarm.py www.salesforce.com
Domain: www.salesforce.com
Resolved IP: 23.50.225.123
JARM: 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5
Python 2 で使用するには ipaddress モジュールが必要です。
pip install -r requirements.txt
./jarm.sh <list> <output_file>
例:
% ./jarm.sh alexa500.txt jarm_alexa_500.csv
JARM の動作を理解する前に、TLS の仕組みを理解することが重要です。TLS とその前身である SSL は、インターネットブラウザのような一般的なアプリケーションの通信を暗号化してデータを保護するため、またマルウェアがノイズに紛れるためにも使用されます。TLS セッションを開始するには、クライアントは TCP 3 ウェイハンドシェイクの後に TLS Client Hello メッセージを送信します。このパケットとその生成方法は、クライアントアプリケーションの構築に使用されたパッケージやメソッドに依存します。サーバーは TLS 接続を受け入れる場合、TLS Server Hello パケットで応答します。
TLS サーバーは、受信した TLS Client Hello パケットの詳細に基づいて Server Hello パケットを構成します。特定の Client Hello に対する Server Hello の構成方法は、アプリケーションやサーバーの構築方法によって異なります。その要因には以下が含まれます。
これらの要因により、各 TLS サーバーは独自の方法で応答します。これらの組み合わせにより、異なる組織によって展開されたサーバーが同じ応答を持つ可能性は低くなります。
JARM は、対象の TLS サーバーに 10 個の TLS Client Hello パケットを積極的に送信し、TLS Server Hello 応答の特定の属性をキャプチャすることで動作します。収集された TLS サーバーの応答は、特定の方法でハッシュ化され、JARM フィンガープリントが生成されます。
これは弊社が TLS フィンガープリンティングに取り組んだ初めてのケースではありません。2017 年には、パッシブな TLS クライアント/サーバーフィンガープリンティング手法である JA3/S を開発しました。これは現在、ほとんどのネットワークセキュリティツールに搭載されています。しかし、JA3/S がネットワークトラフィックを傍受してクライアントとサーバーを受動的にフィンガープリントするのに対し、JARM はアクティブなサーバーフィンガープリンティングスキャナーです。TLS ネゴシエーションと JA3/S パッシブフィンガープリンティングの詳細についてはこちらをご覧ください。
JARM の 10 個の TLS Client Hello パケットは、TLS サーバーからユニークな応答を引き出すために特別に作成されています。JARM は、異なる TLS バージョン、暗号スイート、拡張を様々な順序で送信し、ユニークな応答を収集します。サーバーは TLS 1.3 をサポートしているか?TLS 1.2 の暗号スイートで TLS 1.3 をネゴシエートするか?暗号スイートを弱いものから強いものへと並べた場合、どの暗号スイートを選択するか?これらは、JARM がサーバーに対して、最もユニークな応答を引き出すために実質的に質問している種類のものです。10 個の応答はハッシュ化され、JARM フィンガープリントが生成されます。
JARM フィンガープリントハッシュはハイブリッドファジーハッシュであり、可逆ハッシュアルゴリズムと非可逆ハッシュアルゴリズムを組み合わせて 62 文字のフィンガープリントを生成します。最初の 30 文字は、送信された 10 個の Client Hello のそれぞれに対してサーバーが選択した暗号スイートと TLS バージョンで構成されます。"000" は、サーバーがその Client Hello とのネゴシエーションを拒否したことを示します。残りの 32 文字は、x509 証明書データを除外した、サーバーから送信された累積拡張の SHA256 ハッシュの切り詰めです。JARM フィンガープリントを比較する際、最初の 30 文字が同じで最後の 32 文字が異なる場合、これはサーバーの設定が非常に類似しており、同じバージョンと暗号スイートを受け入れているが、拡張が異なるために完全には一致しないことを意味します。
各 TLS サーバーハロー メッセージを受信した後、JARM は FIN で接続を正常に閉じ、ソケットを開いたままにしないようにします。
JARM は高性能なフィンガープリント関数であり、安全な暗号関数と見なされたり混同されたりすべきではないことに注意することが重要です。JARM フィンガープリントは、機械で消費できるだけでなく、人間が消費できるように設計されています。つまり、一目で確認でき、共有、ツイートするのに十分な小ささであり、なおかつ文脈の詳細を収める余地があります。
マルウェアのコマンド&コントロール(C2)サーバーや悪意のあるサーバーは、他のサーバーと同様に作成者によって設定され、フリート全体に展開されます。したがって、これらはユニークな JARM フィンガープリントを生成する傾向があります。以下は、一般的なマルウェアおよび攻撃ツールと、Alexa Top 1M ウェブサイトとの JARM 重複の例です(2020年10月時点)。
Alexa Top 1M ウェブサイトとの重複がほとんど、あるいは全くないため、組織内のホストがこれらの JARM フィンガープリントを持つサーバーに接続する可能性は低いはずです。
John Althouse - オリジナルのアイデア、コンセプト、プロジェクトリーダー Andrew Smart - コンセプトとテスト RJ Nunnally - プログラミングとテスト Mike Brady - プログラミングとテスト
運用上の使用のために Python で書き直されました: Caleb Yu
| ドメイン | JARM |
|---|
| salesforce.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| force.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| google.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| youtube.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| gmail.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| facebook.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| instagram.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| oculus.com | 29d29d20d29d29d21c41d43d00041d741011a7be03d7498e0df05581db08a9 |
| 悪意のあるサーバー C2 | JARM フィンガープリント | Alexa Top 1M との重複 |
|---|
| Trickbot | 22b22b09b22b22b22b22b22b22b22b352842cd5d6b0278445702035e06875c | 0 |
| AsyncRAT | 1dd40d40d00040d1dc1dd40d1dd40d3df2d6a0c2caaa0dc59908f0d3602943 | 0 |
| Metasploit | 07d14d16d21d21d00042d43d000000aa99ce74e2c6d013c745aa52b5cc042d | 0 |
| Cobalt Strike | 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1 | 0 |
| Merlin C2 | 29d21b20d29d29d21c41d21b21b41d494e0df9532e75299f15ba73156cee38 | 303 |