コンテナ-2.svg
AIを活用した攻撃を阻止する方法:

CVE-2022-33679およびCVE-2022-33647のKerberos脆弱性に関する技術分析

Silverfort 画像
注目のリソースとブログ_1234×402px

執筆者:ヨアブ・イエリン、ドール・セガル(研究者) Silverfort

Microsoftが2022年9月に公開したパッチチューズデーには、Google Project Zeroによって発見された、Kerberosにおける2つの高リスクな権限昇格の脆弱性が含まれていました。これらの脆弱性は、Kerberosの暗号化方式をデフォルトのAESから旧式のMD4-RC4にダウングレードさせる機能を悪用するものです。暗号化方式がダウングレードされると、これらの脆弱性が悪用可能になり、攻撃者はMD4-RC4暗号化の弱点を突くことができます。

1つ目の脆弱性であるCVE-2022-33679は、攻撃者が被害者の代理として認証済みセッションを取得し、任意のコード実行につながる可能性がある。2つ目の脆弱性であるCVE-2022-33647は、中間者攻撃に既に成功した攻撃者が、標的ユーザーに代わって任意のKerberosサービスチケットを発行し、ユーザーと同じ権限を取得することを可能にする。

どちらの脆弱性も従来のMD4-RC4暗号化の弱点を標的としているが、それぞれ悪用する弱点が異なるため、前提条件や攻撃シナリオも異なることに注意する必要がある。

この記事では、CVE-2022-33679とCVE-2022-33647の両方について、詳細な技術分析と解説を行います。

CVE-2022-33679 – 脆弱性分析

脆弱性 CVE-2022-33679概念実証が最近行われた リリースこの攻撃は、Kerberosがセッションキーを暗号化する方法に起因し、Kerberosが旧式のRC4-MD4暗号化タイプを使用しているために可能になります。攻撃は、A) RC4-MD4 etypeを使用して新しいTGTチケットを要求すること、B) キーストリームをバイト単位で解読することの2つの部分から構成されます。

利用プロセス:

  1. KDCサーバーにAS-REQパケットを送信してTGTチケットを取得します。リクエストではRC4-MD4暗号化タイプを要求する必要があります。攻撃を成功させるには、以下の2つの要件を満たす必要があります。
    1. Kerberosの暗号化方式をデフォルトのAESからより脆弱なRC4-MD4に明示的にダウングレードします。これにより、鍵がIVやソルトを含まないわずか8バイトであるため、攻撃が可能になります。  
    2. ユーザーオブジェクトの「Kerberos事前認証を不要にする」フラグが有効になっています。これにより、ユーザーのパスワードを知らなくても、暗号化されたセッションキーを含むTGTを取得できます。 認証 これは、クライアントが現在のタイムスタンプを入力済みのパスワードで暗号化し、それをKDCに送信する仕組みです。KDCは、セッションキーとTGTを生成する前に、パスワードの整合性を検証します。「Kerberos事前認証を不要にする」フラグが有効になっているため、KDCは直接攻撃の標的となり、中間者攻撃などの特別な攻撃手法は必要ありません。
  2. 攻撃者が暗号化されたチケットを正常に取得すると、AS-REPパケットには40ビット長の暗号化されたTGTセッションキーが含まれます。攻撃者は、旧式のRC4-MD4暗号化方式を使用することで、暗号化されたパケットの固定開始位置に関する知識を利用して、キーストリームの45バイトを抽出することができます。
  3. 攻撃者はこのキーストリームを使用して再暗号化を行い、キーストリームが正しいかどうかを検証し、続く40ビットのTGTセッションキーをバイトごとに解読するために使用されるカスタムメイドの事前認証を使用して、KDCからTGTチケットを要求できます。これは、Kerberosエンコーディングに使用されるASN.1プロトコルの2つの脆弱性を悪用し、攻撃者が事前認証フィールドのサイズを限定的に制御できることを利用して行われます。
    1. KDCパーサーは、オブジェクトの末尾にあるNULL終端文字列を無視します。これにより、KerberosTimeオブジェクトの末尾にNULL文字を追加できます。これは1バイトの推測には有効ですが、さらに4つの1を推測する必要があります。
    2. KDCパーサーはエンコードされた長さを検証しません。ASN.1文字列の長さは1~4バイトで表され、KDC ASN.1パーサーは最短経路を強制しません。したがって、タイムスタンプ文字列の長さは1~4バイトの範囲で自由に表現できます。つまり、平文の長さをさらに長くしてNULLバイトを次の位置に押し込み、キーストリームの次のバイトを推測できるということです。
  4. 最後に、攻撃者はタイムスタンプを再暗号化し、暗号化された事前認証情報を含むAS-REQを送信することで各推測を検証できます。暗号化された事前認証日付が正しくない場合はエラーが発生します。事前認証が成功した場合、各バイトには最大256通りの推測オプションがあるため、攻撃者はキーストリームから別のバイトを発見できます。このプロセスを繰り返すことで、元のチケットに保存されているセッションキーを復号するために必要なキーストリームバイトをすべて取得できます。

取得したセッションキーにより、攻撃者は標的ユーザーに代わって任意のSPNへのチケットを要求することができる。

CVE-2022-33679を使用してAS-REQセッションキーの最初のバイトを破る手順。残りのバイトが続くはずです。
攻撃フローを継続し、最後のバイトを破壊して、破壊されたセッションキーを使用して新しいTGTを取得する。
クレジット:POCはJames Forshaw、RubeusはGhostPackによるものです。

CVE-2022-33647 技術分析

攻撃者にとって幸いなことに、CVE-2022-33647の脆弱性は、CVE-2022-33679とは異なり、事前認証で機能します。これは、事前認証がすべての作成オブジェクトに対してデフォルトで有効になっているため重要です。 Active Directoryこの攻撃の主な要件は、クライアントとドメインコントローラーの間に中間者攻撃(MITM)が存在することです(このタイプの攻撃は一般的で、DNSスプーフィングやARPポイズニングなど、多くの方法で実現できます)。MITMは、クライアントに暗号化方式をMD4-RC4にダウングレードさせるために使用されます。

活用フロー

クライアントから最初の AS リクエストが送信されると、KDC は「事前認証が必要です」というメッセージで応答します。しかし、認証のこの段階では検証が行われないため、攻撃者は KDC の応答を改ざんすることができます。図に示すように、KDC がサポートする暗号化方式を RC4-MD4 に変更します。その結果、(RC4 が有効になっている場合)クライアントは MD4-RC4 アルゴリズムを使用して事前認証付きの AS_REQ を送信します。

ここから先、攻撃者には2つの選択肢がある。

  1. 5バイトのセッションキーを総当たりで解読する方法は、効率的ではない可能性があり、時間がかかるかもしれません。
  2. もう1つの選択肢は、プレーンテキストデータ(事前認証)の知識を活用することです。Kebrerosでは、中間者攻撃者は、クライアントがASリクエストで生成したプレーンテキストの事前認証タイムスタンプを正確に推定できます。暗号化メカニズムには初期化ベクトルまたはnonceがなく、キー使用値を無視します。その結果、認証交換のさまざまな部分で同じキーストリームが使用されます。つまり、キーストリームの大部分で同じRC4キーストリームが使用されます。事前認証には暗号化されたタイムスタンプが含まれているため、攻撃者は現在の時刻に関する知識を使用してキーストリームの一部を発見できます。攻撃者が運が良ければ、同じキーストリームを使用してAS応答のTGTセッションキーの4バイトを復号化します。最後のバイトは、攻撃者には不明なマイクロ秒を表すタイムスタンプの最小バイトと重複しています。最後のバイトは、以下に示すように、被害者の達成されたTGSリクエストに対するブルートフォース攻撃で解読されます。

ASN.1 シリアル化ズームイン

ASN.1 DERエンコーディングは、各要素に対してタグ、長さ、値のエンコーディング方式を採用しています。認証前タイムスタンプはこの方式でエンコードされます。エンコードされたタイムスタンプの構造は、2つの要素からなるシーケンスです。1つ目は、Zulu形式のGeneralizedTimeオブジェクト(KerberosTime)です。2つ目は、マイクロ秒を表す整数です。

各要素には、値の後に続くタグと長さが付与されています。そのため、すべてのタグと長さを表す10バイトの定数を特定することができます。

  • 30 -> シーケンスタグ
  • 1A – (int) 26 (構造全体の長さ)
  • A0 – 最初の要素タグ
  • 11 – 要素の長さ
  • 18 – タイムタグの一般化
  • 0F – (int) 値の長さ (15)
  • A1 – 2番目の要素タグ
  • 05 – (int) 要素の長さ
  • 02 – 整数型タグ
  • 03 – (int) 値の長さ

定数バイトの総数は10バイトで、タイムスタンプを推測するためにさらに15バイトを追加します。最後の3バイトはマイクロ秒要素ですが、これは推測するには効率的ではありません。最後に、暗号化部分の前に24バイトのゼロを追加すると、キーストリームは49バイトになります。TGTセッションキーは、AS応答の46バイト目から50バイト目の間にあります。最後に欠落しているキーストリームバイトは、被害者の傍受したサービスチケットに対して総当たり攻撃で解読できます。

パッチ

これらの脆弱性は、マイクロソフトが9月のセキュリティ更新プログラムで修正しました。この更新プログラムでは、RC4-MD4 (-128) 暗号化タイプと RC4-HMAC-OLD (-133) 暗号化タイプが無効化されました。パッチが適用されると、これらの暗号化タイプのいずれかを使用する今後の AS-REQ/TGS-REQ は、「サポートされていない暗号化タイプ」エラーを受け取るようになります。

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-33679

追加情報

https://bugs.chromium.org/p/project-zero/issues/detail?id=2310&q=label%3ACVE-2022-33647 – ジェームズ・フォーショーによる分析

私たちは、身元情報のセキュリティをさらに強化する大胆な試みを行った。

何が可能になるのかを発見しよう。

デモを設定して、 Silverfort アイデンティティセキュリティプラットフォームの動作例。

new hero (1)

Silverfort ファブリックス・セキュリティを買収

実行時に自律的なアイデンティティセキュリティを提供する

ディープコンテキストとAIのスピードを活用し、人間、機械、エージェントのあらゆるアイデンティティを保護するように設計された、初の自律型ランタイムアクセス制御エンジンを開発しました。