Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
secret_handshake — mTLS上でx509証明書を使用するプロトタイプのマルウェアC2チャネル | Kitploit
ツール/GitHubGitHub/jconwell/secret_handshake
IDS/IPS回避データ流出コマンド&コントロールレッドチーミング
GitHubjconwell/secret_handshake

secret_handshake

mTLS上でx509証明書を使用するプロトタイプのマルウェアC2チャネル

リポジトリを見る
1531532年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Secret Handshake - mTLSを介したx509証明書を使用するマルウェアC2チャネル

動機

まず、なぜこれをオープンソースにするのか?

MITRE ATT&CKは、窃取された証明書または自己署名証明書についてのみ言及しており、NDR(私が知る限り)は、発行元CAが誰であるか以外のx509証明書の内容にはほとんど注意を払っていません。一般に、x509証明書は信頼され、ファイアウォールを難なく通過することを許されています。しかし、本質的には、他のファイルと同様に、悪意のあるペイロードを簡単に含むことができる単なるファイルです。私たちが当然のこととして受け入れてきた暗号化プロセスの中核的構成要素であるため、私たちはx509証明書を信頼し、無視しています。このプロジェクトの主な目的は、私たちが信頼するに至ったセキュリティインジケータのクラスに対する認識を高め、その悪意のある使用を検出するために使用できる方法を強調することです。

背景

私は常に、脅威アクターがC2通信の一部としてx509証明書を使用したことがあるかどうか疑問に思っていました。ネットワークトラフィックを暗号化するためではなく、実際にC2通信をx509証明書に埋め込むためです。このようなものを実環境で5年間探した後、ついにそれが可能かどうかを確かめるために自分でコードを書くことにしました...そして、可能でした。

HTTPS/TLSを介して送信されるすべての暗号化メッセージは、x509証明書の転送によって可能になっています。TLSハンドシェイク(下図)を確立するとき、4番目のステップでサーバーはx509証明書をクライアントに送信します。クライアントは証明書を検証し、サーバーがサポートする暗号化アルゴリズムを比較し、以降のすべての通信で使用するアルゴリズムを選択します。

Figure 1

この図が示すように、これはサーバーからクライアントへのx509証明書の一方向の転送にすぎません。クライアントがサーバーに応答を返す手段がないため、これはC2通信には適していません。せいぜい、一方向のデータ転送メカニズムとしてのみ使用できます(下記の先行技術セクションを参照)。

しかし、相互TLS認証(mTLS)と呼ばれる別のタイプのTLSセッションがあります。これは、クライアントとサーバーの両方がx509証明書を交換して相互に認証する方式です。

Figure 2

上の図が示すように、相互認証中は、認証のためにサーバーのx509証明書がクライアントに送信され、次に認証のためにクライアントのx509証明書がサーバーに送信されます。このアーティファクトの交換は、C2サーバー用の双方向通信チャネルを作成する機会を表しています。

x509証明書を介した双方向通信チャネルの作成

サーバー証明書とクライアント証明書は基盤となるSSLライブラリによって交換されるため、クライアントがサーバーの証明書からメッセージを取り出し、コマンドを実行し、応答証明書を生成するという一連の処理を単一のmTLS接続内で行う機会はありません。つまり、C2チャネルは、リクエストと応答の交換が2つの異なる相互TLS接続を介して行われるように設計する必要があります。いわば、疑似半二重伝送モードのようなものです。

Figure 3

リクエスト/レスポンスプロセスは次のステップに従います:

  • ステップ1:クライアントとC2サーバーの両方がそれぞれの証明書を生成します。クライアントの証明書には汎用の「ビーコン」メッセージが含まれ、サーバーの証明書にはクライアントに実行させたいコマンドが含まれます。クライアントが実行するコマンドがない場合、サーバーは、次のビーコンの前にどれだけスリープするかをクライアントに伝えるための汎用の「スリープ」証明書を生成します。
  • ステップ2:クライアントとC2サーバーの両方が、ステップ1で生成された証明書を使用してネットワークソケットを構成します。
  • ステップ3:クライアントはサーバーとの接続を確立します。
  • ステップ4:mTLSハンドシェイク中にサーバー証明書とクライアント証明書が交換されます。
  • ステップ5:サーバーとクライアントの両方がそれぞれのソケットを閉じます。
  • ステップ6:クライアントはサーバー証明書から実行するコマンドを抽出します。クライアントの証明書には汎用の「ビーコン」メッセージしか含まれていないため、サーバーはそれを破棄します。
  • ステップ7:クライアントはコマンドを実行し、コマンド出力を収集します。
  • ステップ8:クライアントとC2サーバーの両方がそれぞれの証明書を生成します。クライアントの証明書には実行したばかりのコマンドの出力が含まれ、サーバーは、次のビーコンの前にどれだけスリープするかをクライアントに伝えるための汎用の「スリープ」証明書を生成します。
  • ステップ9:クライアントとC2サーバーの両方が、ステップ8で生成された証明書を使用してネットワークソケットを構成します。
  • ステップ10:クライアントはサーバーとの接続を確立します。
  • ステップ11:mTLSハンドシェイク中にサーバー証明書とクライアント証明書が交換されます。
  • ステップ12:サーバーとクライアントの両方がそれぞれのソケットを閉じます。
  • ステップ13:クライアントはサーバー証明書からスリープ時間を抽出し、サーバーはクライアント証明書からコマンド出力を抽出します。
  • ステップ14:クライアントはサーバーによって指定された間隔の間スリープします。

先行技術

これを動作させたとき、私は自分が創造的で大したことをやったとかなり誇らしく思っていました。

その後、私はこのJason Reavesによる2018年のBSidesトークに出くわしました。彼はTLSを介したx509証明書を使用するマルウェアバイナリドロッパーを作成した人物です。1年後、JasonはmTLSを使用した完全な双方向通信チャネルを詳述したこの論文を公開しました。

実行手順

mTLSでは、クライアントとサーバーの両方の証明書が同じCA証明書によって署名されている必要があります。そのため、最初のステップは、独自のCA秘密鍵/証明書ペアを生成することです。

ルートCA秘密鍵を作成します:

openssl genrsa -des3 -out hmCA.key 2048

注:パスフレーズは、あなたの秘密鍵を入手した誰かが独自のルート証明書を生成することを防ぎます。

ルートCA証明書を作成します

openssl req -x509 -new -nodes -key hmCA.key -sha256 -days 1825 -out hmCA.pem

生成された鍵ファイルと証明書ファイルをcerts/ca_certsフォルダーにコピーします。このプロジェクトにはデモ用の鍵/証明書ペアが同梱されているので、必要なければこのステップをスキップできます。

クライアントを起動します:

python client.py

サーバーを起動します:

python server.py

検出

ネットワークログでそれを検出する方法も詳述せずに、潜在的に悪意のあるものをリリースしたくはありません。

この種のTLSパターンの検出は簡単だと思うかもしれませんが、それほど単純ではありません。このC2チャネルの主な兆候の1つは、その半二重方式の通信です。サーバーとクライアントの間で完全なリクエスト/応答を完了するには、2つの相互認証フローが必要です。そして、サーバーがクライアントにさまざまなコマンドを送信するため、これが複数回発生します。

つまり、以下を探す必要があります:

  • 同じ送信元IPと宛先IPの間の複数のmTLSセッション。おそらく同じポート上ですが、mTLS接続ごとに異なるポートを使用するように構成することも難しくはありません。
  • リクエスト/応答パターンではサーバーコマンドごとに2つのmTLSセッションが必要になるため、かなり近接した2つのmTLSセッションを探し、その次のmTLSセッションのペアとの間にはより長い休止があるかどうかを確認します。
  • 他のC2チャネルと同じように、mTLSセッションのペア間のスリープ時間とジッター時間を探します。
  • セッションごとに新しい証明書が生成されるため、証明書ハッシュはmTLSセッションごとに異なるはずです。
  • 証明書は信頼された認証局によって発行されません。
  • x509証明書のバイトサイズもセッションごとに異なります。小さいサーバー証明書はクライアントに送信されるコマンドを示すはずですが、大きい証明書は悪意のあるバイナリのダウンロードを示す可能性が最も高いです。クライアント証明書はコマンド出力を埋め込んでいるため、サーバーのコマンド証明書よりもサイズの変動が大きい可能性があります。大きいクライアント証明書はデータの外部持ち出しを示します。
  • 短時間の間に同じ送信元IPと宛先IPの間に複数のmTLSセッションがある場合、同じハッシュの証明書が送信されることがあるかどうかを確認します。これは、「ビーコン」クライアント証明書や「スリープ」サーバー証明書など、コマンド/応答証明書の再利用を示している可能性があります。

これは文句なしの検出ルールのセットのように思えますが、前に言ったように、それほど簡単ではありません。同様のmTLSトラフィックパターンを持つ一連のエンタープライズサービスもあることが判明しています。その中には以下が含まれます:

  • Tanium
  • Microsoft System Center Configuration Manager (SCCM)
  • Microsoft Monitoring Agent
  • Azure Hybrid Runbook Worker
  • Palo Alto Networks
  • MuleSoft
  • TrustedSource
  • Cohesity Helios
  • EMC's Global Security Organization
  • Alert Logic

これらのいくつかは資産/デバイス管理サービスであると思われるため、理論的には、すべてのデバイスを巡回するたびに同じセットの証明書を送信しているはずです。N時間ごとに繰り返される複数のmTLSセッションのセットがあるかどうかを確認し、2つの異なるmTLSセッションのセット間で証明書ハッシュが一致するか、ほぼ一致するかを確認できます。また、各mTLSセッションでクライアント証明書が異なる一方で、すべてのセッションで同じサーバー証明書が使用されている可能性も確認してください。

潜在的な緩和策

SSLインスペクションは、この種のC2通信チャネルを潜在的にブロックする1つの方法です。SSLインスペクションサーバーは、クライアント証明書の認証に必要な悪意のあるCA証明書を持っていないためです。

ツールをダウンロード