不正な PowerShell コードを使用して、パッチが適用されていない Exchange サーバーをハッキングする方法

ソースノード: 1760191

XNUMX か月足らず前に、心配なバグ ニュースがいくつか発表されました。Microsoft Exchange で XNUMX つのゼロデイ脆弱性が発表されました。

我々として その時にアドバイス、これらの脆弱性は正式に指定されています CVE-2022-41040 & CVE-2022-41082:

XNUMX つのゼロデイが連鎖する可能性があり、最初のバグがリモートで使用されて XNUMX 番目のバグを引き起こすのに十分な穴が開いたため、Exchange サーバー自体でリモート コード実行 (RCE) が可能になる可能性がありました。

最初の脆弱性は、厄介で広く悪用されている脆弱性を連想させます。 ProxyShell のセキュリティ ホール 2021 年 XNUMX 月から、Exchange の自動検出機能の危険な動作に依存していたため、 マイクロソフトによる説明 プロトコルとして 「Outlook および EAS [Exchange ActiveSync] クライアントが Exchange のメールボックスを検索して接続するために使用」.

幸いなことに、ログインしているかどうかに関係なく、リモート ユーザーによる ProxyShell 攻撃で悪用される可能性がある自動検出の誤機能は、 XNUMX年以上前にパッチを当てた.

残念ながら、ProxyShell パッチは、認証されたユーザーへのエクスプロイトを封じるのに十分ではなく、新しい CVE-2022-40140 ゼロデイにつながりました。 ダビングされた プロキシノットシェル.

それほど危険ではありませんが、それでも危険です

明らかに、ProxyNotShell は元の ProxyShell ほど危険ではありませんでした。認証されたアクセスと呼ばれるものが必要だったため、どこからでも悪用される可能性はありませんでした。

しかし、多くの Exchange サーバーでは、任意のユーザーのログオン名とパスワードを知っていれば、認証されたものとして通過し、この攻撃を開始するのに十分であることがすぐに明らかになりました。彼らの電子メール。

ソフォスのエキスパートであるチェスター・ウィスニエフスキーとして それを置く 当時の:

それを「認証中の脆弱性」と呼ぶなら、これです。 それは複雑な祝福です。 これは、2021 年に ProxyLogon と ProxyShell で発生したように、自動化された Python スクリプトが単にインターネット全体をスキャンして、世界中のすべての Exchange サーバーを数分または数時間で悪用できる可能性がないことを意味します。[…]

パスワードが必要ですが、残念ながら、任意の Exchange サーバーで有効な電子メール アドレスとパスワードの組み合わせを XNUMX つ見つけることは、おそらくそれほど難しくありません。 また、Outlook Web Access [OWA] に正常にログインするには、FIDO トークン、オーセンティケーター、または使用している可能性のある第 XNUMX 要素が必要なため、これまで悪用されていない可能性があります。

しかし、この攻撃にはその XNUMX 番目の要素は必要ありません。 […] ユーザー名とパスワードの組み合わせを取得するだけでも、かなり低い障壁です。

おそらく覚えていると思いますが、XNUMX 月のパッチ チューズデーまでまだ XNUMX 週間あることを考えると、私たちの多くは、Microsoft が ProxyNotShell の穴を急いで修正するだろうと想定 (または少なくとも期待) していました。

しかし、信頼できる修正が明らかに 予想以上に複雑、そして XNUMX 月には ProxyNotShell が行き来し、適切なパッチではなく、回避策によってのみ対処されました。

XNUMX 月の月例パッチでさえ、必要な修正を直接提供しませんでした。 それでも出てきた 個別にフェッチしてインストールできる Exchange 固有のセキュリティ更新プログラムの一部と同じ日に:

概念実証が明らかに

混乱が収まり、誰もが Exchange サーバー (少なくとも忘れていないサーバー) にパッチを適用する時間ができた今、ゼロデイ イニシアチブ (ZDI) の研究者は、これらの脆弱性が最初に提出のために責任を持って公開されました。マイクロソフト、 説明した バグが悪用される方法。

エクスプロイトのあからさまな開示に対するあなたの意見によると、悪いニュースは、ZDI チームが Exchange サーバーを攻撃する方法を説明する概念実証 (PoC) を効果的に提供したことです。

もちろん、良いニュースは次のとおりです。

  • バグを自分で調べて理解できるようになりました。 これは、私たちが講じた全体的な予防措置 (パッチ適用に限定されない) が期待する保護を提供する可能性が高いことを確認するのに役立つだけでなく、将来的に回避したいプログラミング慣行についても通知します。私たち自身のサーバー側コードでこの種のバグを開くことに巻き込まれないでください。
  • パッチを適用しない言い訳はもうありません。 更新について足を引っ張った場合、攻撃が機能する理由についての ZDI の説明は、治療法が病気よりも明らかに好ましいことを明らかにしています。

機能

ZDIの 説明 この脆弱性の詳細は、脆弱性を実行可能なエクスプロイトに変えるために必要なすべてのパーツを連鎖させることがいかに複雑であるかという興味深い話になります。

また、既存のエクスプロイトを掘り下げることで、脆弱性が悪用される可能性がある他の方法を明らかにするのに役立つ理由を理解するのにも役立ちます。追加のパッチを促したり、構成の変更を促したり、修正しただけでは明らかにならなかった可能性のある新しいプログラミング手法を促進したりする可能性があります。元の穴。

説明は必然的に複雑で非常に技術的であり、最後にリモート コード実行 (RCE) を実現するための長い一連の手順を進めます。

ZDI レポートを読むことに決めた場合に、高レベルの詳細をより簡単に理解できるように、手順を逆順に並べた、あまり単純化されていない要約を以下に示します。

…だから、ストーリーがその方向性を取る理由を前もって知ることができます:

  • ステップ 4. 選択した初期化パラメーターを使用して、選択した .NET オブジェクトをリモートでインスタンス化するように Exchange をだまします。

現代のコーディングでは、 インスタンス化されたオブジェクト 割り当てられたメモリのチャンクを表す専門用語であり、使用中に必要なデータとリソースで自動的に初期化され、それを操作できる特定の関数セットに関連付けられます。 (インスタンス化 は単なる派手な言葉です 作ります.)

オブジェクトは、オペレーティング システム自体によって管理および制御される場合があります。これは、通常、自分でメモリを割り当て、関連するデータ フィールドを手動で入力する必要がある C などの言語で一般的なメモリ管理ミスのようなエラーを回避するのに役立ちます。完了したら、使用しているメモリとリソース (ネットワーク ソケットやディスク ファイルなど) を解放します。

通常、オブジェクトには、 コンストラクタこれは、適切な量のメモリと正しいシステム リソースのセットを割り当てるために、新しいオブジェクトが作成されたときに自動的に実行されます。

通常、XNUMX つ以上のパラメーターを引数としてコンストラクターに渡して、開始時にオブジェクトをどのように構成するかを示す必要があります。

簡単に言えば、たとえば、 TextString 次のようなテキスト文字列であるパラメータを使用して、 example.com:8888...

…おそらく、テキストを保持するために割り当てられたメモリ バッファが初期化されるため、渡した値と同じ値、つまり生のテキストが保持されることになります。 example.com:8888.

そのコンテキストでは、オブジェクト コンストラクターにデータとして渡されたテキスト文字列は、コンストラクターをリモートでトリガーしたときに、すぐに明らかなサイバーセキュリティの脅威を引き起こすことはありません。メモリを使い果たします。

しかし、インスタンス化する場合、たとえば、 ConnectedTCPClient とまったく同じテキスト文字列パラメータを使用するオブジェクト example.com:8888、サーバーとデータを交換する準備ができているオペレーティングシステムによって割り当てられたネットワークソケットとともに、一時データを保持する準備ができているメモリバッファになる可能性があります example.com TCP ポート経由 8888.

開いているソケットにデータをまったく送信できなくても、サーバーをだまして自分が制御する場所にホームを呼び出すように仕向けた場合でも、そこにリモート コード実行のリスクがあることがわかります。

たとえば、 RunCmdAndReadOutputここで、パラメーターとして送信するテキスト文字列は、文字通り、オブジェクトが作成されるとすぐに自動的に実行されるコマンドであるため、後でその出力を収集できます。

コマンドの出力を回復できない場合でも、そのようなオブジェクトをインスタンス化するだけで、実行するコマンドを選択できるため、一般的なリモート コードの実行が可能になり、サーバー プロセス自体のアクセス権によってのみ制限されるリスクが提示されます。 .

もちろん、攻撃がこれほど簡単になるのは、最後の段階に到達したときだけです。これは、実行できないはずです。Exchange には、インスタンス化する古いオブジェクトを選択できないようにする厳格な許可リストがあるためです。

理論的には、PowerShell を介してリモートで作成できるのは、安全または低リスクのオブジェクトのみです。 TextString 上記、または SimpleIntegerValue、許容できると見なされる可能性がありますが、 ConnectedTCPClient または RunCmdAndReadOutput 絶対にそうではないでしょう。

しかし、ZDI の研究者は、最後のステップをトリガーする前に、次のことができることに気付きました。

  • ステップ 3. リモートで Exchange をだまして、安全性テストに合格した低リスク オブジェクトが、実際には選択した別のオブジェクトであると認識させます。

それでも、脅威をさらに最小限に抑えるために、リスクの低いオブジェクトであってもリモートでの作成を Exchange が防止することを期待するかもしれません。

しかし、研究者は次のことができることを発見しました。

  • ステップ 2. リモートで Exchange をだまして、 PowerShellリモート処理 外部で制御される初期化パラメーターに基づいてオブジェクトを作成する機能。

これは、部分的にしかパッチが適用されていない ProxyShell のような穴があるため可能でした。

  • ステップ 1. Exchange をだまして、コードを含む Web 要求をリモートで受け入れて処理させます。 username:password フィールドもリクエストに追加します。

リクエストで指定されたユーザーが実際にはログインしておらず、自分のメールボックスにアクセスするために何らかの 2FA プロセスを経る必要がある場合でも、攻撃者は自分のメールボックスを知っていた username:password この組み合わせには、上記の手順 2 から 4 で説明した攻撃チェーンを開始するために使用できる Web 接続を Exchange に受け入れさせるのに十分な認証情報が含まれます。

大まかに言えば、有効な任意の username:password Exchange が HTTP 要求を前もって拒否するのを防ぐためだけに「認証」が必要であったことを考えると、この組み合わせで十分です。

何をするか?

この攻撃は次の場合にのみ機能することに注意してください。

  • オンプレミスの Exchange サーバーがある場合。 Microsoft は自社のクラウド サービスを迅速にロックダウンしたと主張しているため、Exchange Online は影響を受けません。 確認してください Exchange サーバーの場所を知る. 現在 Exchange Online を使用している場合でも、オンプレミス サーバーがまだ実行されている可能性があります。おそらく、移行プロセスで誤って取り残されている可能性があります。
  • サーバーにパッチが適用されていない場合。 あなたが持っていることを確認する 2022-11-08 の Exchange ソフトウェア更新プログラムを適用 〜へ 脆弱性を封じる エクスプロイトが必要とするもの。
  • サーバーがまだ基本認証 (レガシー認証とも呼ばれます) を受け入れる場合。 あなたが持っていることを確認する レガシー認証のすべての側面をブロック そのため、サーバーは username:password 前述のヘッダーが含まれており、そもそも危険な Autodiscover プロトコル要求を受け入れません。 これ 攻撃者を阻止 サーバーにパッチが適用されていない場合でも、サーバーをだまして、ブービートラップされたオブジェクトのインスタンス化のトリックを受け入れさせます。

また、ご購読はいつでも停止することが可能です 追跡する Sophos X-Ops の Twitter フィード (@SophosXOps).


Exchange Authentication と OAUTH2 の詳細を見る

下の音波をクリックしてドラッグし、任意のポイントにスキップします。 あなたもすることができます 直接聞く Soundcloudで。

ポール・ダックリン、チェスター・ウィスニエフスキー
イントロとアウトロの音楽 エディスマッジ.


タイムスタンプ:

より多くの 裸のセキュリティ