自分でやる:最小のMS OfficeでのDLLハイジャック

研究者Parvez AnwarがMicrosoft Office製品の複数のdllハイジャック脆弱性に関する情報を公開してから3日が経過しましたが、反応は観察されませんでした。 CVEも特殊なリソースに関するメッセージも、Windows Updateは新しいパッチをダウンロードしません。 まあ、多分それはあなたが必要なものかもしれません、多分これは症状ではなく、製品の特徴ですか?

一方、この機能の操作は簡単で、子供でもアクセスできます。 そして、製造業者はこの「機能」をまだ削除していないので、それについて短い記事を書いてみませんか。



それはWindows 7についてです。これが他のバージョンで動作するかどうか-現在、私は何をチェックするかわかりません。 説明されている現象の動作原理(および他の多くの現象)は、古き良きCOM / OLE / ActiveXテクノロジーに基づいています。

COMテクノロジーはOOPとコードの再利用を実装するように設計されており、システムに登録されている場合、誰かが作成したクラス(またはコンポーネント )をすべてのアプリケーションで使用できます。 コンポーネントの登録は、基本的にレジストリ内の対応するエントリを表します。 各クラスには、一意の16バイト識別子-CLSIDが割り当てられます。CLSIDは、任意のクラスでいつでもこのコンポーネントを一意に識別します。

コンピューター。 システムに登録されているすべてのクラスのグローバル識別子は、レジストリブランチHKEY_CLASSES_ROOT \ CLSIDに含まれています。







コンポーネントの実行可能コードは、.dllライブラリとして設計する必要があります(実際、常にではありませんが、このタスクのために単純化できます)。 ライブラリへのリンクは、コンポーネントに対応するレジストリキーのInprocServer32サブキーに含まれています。







アプリケーションがコンポーネントの1つによって実装された機能を使用したい場合、システムに要求を送信してクラスのインスタンスを作成します(このクラスのCLSIDが送信されます)。 そのようなクラスが登録されている場合、システムはレジストリを読み取り、必要な.dllをプロセスのアドレススペースにロードし、目的のオブジェクトを作成するこのライブラリからコードを呼び出します。



MS Officeアプリケーションについてはどうですか? これらもCOMテクノロジーが詰め込まれている(さらにはCOMオブジェクトそのものである)という事実に加えて、ActiveXコントロールを含むドキュメントを作成/読み取ることもできます。

実際、このようなドキュメントは、コンポーネントの識別子と埋め込みオブジェクトのプロパティに関する情報を(テキスト、画像、フォーマットなどに加えて)含むファイルです。 実際にどのように見えるか見てみましょう。



MS Wordを開きます。 [開発]タブが接続されていない場合は、設定で接続する必要があります。[ファイル]-> [オプション]-> [リボンのカスタマイズ]、[ファイル]-> [オプション]-> [リボンのカスタマイズ]、[ファイル]-> [Wordオプション]-> [開発者]タブインストールしたMS Officeのバージョンに応じて、テープなどに保存します。







「開発者」タブに移動し、ハンマーとレンチで「以前のバージョンのツール」ボタンを選択します。







次に、同様のボタン「その他のコントロール」。







表示されるウィンドウで、好みに応じてActiveXコンポーネントを選択します。MicrosoftForms 2.0コマンドボタンが気に入っています。











レジストリを開いてコンポーネントの名前で検索すると、コントロールのCLSIDが見つかる場合があります



{D7053240-CE69-11CD-A777-00DD01143C57}、およびその実行可能コードを含むライブラリはFM20.DLLです。











作成したドキュメントは何になりますか? 保存して見てみましょう。

.docx形式は、よく知られているZIPです。 適切なユーティリティを使用して開梱します。







アーカイブには、ファイルを含むいくつかのフォルダーが含まれています。 word \ activeX \ activeX1.xmlが必要です

通常のテキストエディタで開き、そのようなコンテンツを確認します。



<?xml version="1.0" encoding="UTF-8" standalone="no"?> <ax:ocx ax:classid="{D7053240-CE69-11CD-A777-00DD01143C57}" ax:persistence="persistStorage" r:id="rId1" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
      
      







ご覧のとおり、コントロールCLSIDが存在し、簡単に交換できます。



次に、実際に何を置き換えることができるか、dllハイジャックとは何か、なぜすべて機能するのかについて、いくつかの言葉を言う必要があります。



CLSIDを他のコントロールのCLSIDに置き換えることができます。コントロールだけでなく、ActiveX、ActiveXだけでなく、システムに登録されているCOMクラスも使用できます(ランダムなGUIDを使用することもできますが、興味深い結果はありません)。



問題は、ドキュメントから識別子を読み取った後、MS Wordがシステムに識別子を転送し、システムが最初にライブラリをプロセスメモリにロードして、そこから最初の関数(DllMain、DllGetClassObject、IClassFactory :: CreateInstanceなど)を呼び出そうとすることです。 その後、アプリケーションはそれがどのような種類のライブラリであるか、どのようなコンポーネントであるか、それをドキュメントに追加できるかどうか、そしてそれを必要とするかどうかを把握し始めます。 コンポーネントがいくつかの基準に従って適合しないことが簡単に判明するかもしれませんが、その実行可能コードがプロセスの仮想メモリに現れて制御を得た後、これは明らかになります。 MS Wordがこのクラスを必要としないことを明確に確立した後でも、アンロードされません! このような振る舞いは、この記事で説明されている現象を含む、多くの興味深い現象につながります。



さて、dllハイジャックについて。 「動的ライブラリハイジャック」は、Windowsアプリケーションが、現在のディレクトリで必要なライブラリを検索するときの通常の初期の、そして多少論理的な動作であり、OS設定によって決定された場所でのみです。 攻撃者がすぐに(そしてかなり前に)同じ名前のライブラリをドキュメントまたはラベルの隣に置くことができると推測していなければ、すべてがうまくいく

アプリケーションが見つけることを期待するライブラリ。

実際、このテクノロジーは長年使用されており、マイクロソフトは長い間苦労してきましたが、ご覧の通り、まだ生産的ではありません。



今回、研究者は、他のdllをロードしてそれらを探しているWindows 7オペレーティングシステムの腸で失われたいくつかのdllを発見しました-これまでのところ! -プロセスの現在のディレクトリ内。 これらのMicrosoftが忘れていた管理コンソール用のスナップイン、Oracle用の添加物、その他のよく知られ、よく使用されるものもCOMクラスでした。 ご想像のとおり、これは通常のMS Officeドキュメントに埋め込むことができます。



MS Wordに戻り、アンパックされたドキュメントのCLSIDをレポートから便利なものに変更しましょう

パルベス・アンワール 。 たとえば、最初は{394C052E-B830-11D0-9A86-00C04FD8DBF7}です。



 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <ax:ocx ax:classid="{394C052E-B830-11D0-9A86-00C04FD8DBF7}" ax:persistence="persistStorage" r:id="rId1" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
      
      







ドキュメントをロードします(必要に応じて、.docxに名前を変更します)。







次に、elsext.dllという独自のdllが必要です。 作成するものに関係なく、主なことは、MS Officeパッケージと同じビット深度を持ち、ロード可能であり、DllMainまたはDllGetClassObjectにコードを追加できることです。 古き良きVC6を使用します-32ビットのオフィスがあります。



 #include <windows.h> int __stdcall DllMain (HANDLE, DWORD, LPVOID) { MessageBox (0, "Hello Habrahabr!", 0, MB_ICONEXCLAMATION); return true; }
      
      







変更されたドキュメントとともにelsext.dllを1つのディレクトリ(共有ネットワークフォルダ内に配置できます)に入れ、ユーザーにこのドキュメントを開いたり読んだりするように依頼することは残ります。







別のポイント:覚えているように、dllハイジャックで、Microsoftは苦労しています。 そのため、MS Wordは起動時に、現在のディレクトリを現在のユーザーの「ドキュメント」に変更します。 残念なことに(または幸いなことに)エクスプローラーでダブルクリックしてドキュメントを開くためにアプリケーションを呼び出すと、MS Wordは最初にすべての結果を伴うドキュメントを開こうとし、その後、現在のディレクトリを "Documents"に変更します。 これは、ユーザーがダブルクリックしてドキュメントを開き、MS Wordが以前に起動されなかった場合にのみDLLがロードされることを意味します(そうでない場合、system32のelsext.dllがロードされます)。



All Articles