バックグラウンド
COM オブジェクト ハンティングに関するこのブログ シリーズのパート 1のフォローアップとして、この投稿では、COM オブジェクトのプロパティとサブプロパティで公開されている興味深い COM オブジェクト メソッドを見て、COM オブジェクト ハンティングの方法論をより深く理解する方法について説明します。
COM オブジェクトとは
Microsoftによると、「Microsoft Component Object Model (COM) は、対話可能なバイナリ ソフトウェア コンポーネントを作成するための、プラットフォームに依存しない、分散型のオブジェクト指向システムです。 COM は、Microsoft の OLE (複合ドキュメント)、ActiveX (インターネット対応コンポーネント) などの基盤テクノロジです。」
COM オブジェクトのサービスは、ほぼすべての言語から複数のプロセスによって、またはリモートからでも利用できます。 COM オブジェクトは通常、CLSID (識別 GUID) または ProgID (プログラム識別子) を指定することによって取得されます。これらの COM オブジェクトは Windows レジストリに公開されており、以下で説明するように簡単に抽出できます。
COM オブジェクトの列挙
FireEye は、Windows 10 および Windows 7 の COM オブジェクトと、Microsoft Office の COM オブジェクトについて調査を行いました。このブログ シリーズのパート 1 では、システム上のすべての COM オブジェクトを列挙し、それらをインスタンス化し、興味深いプロパティとメソッドを検索する手法について説明しました。ただし、これは、これらの COM オブジェクトを介してアクセスできるものの表面をなぞるだけであり、各オブジェクトは、それ自体では直接作成できない他のオブジェクトを返す可能性があるためです。
ここで導入された変更は、列挙された各 COM オブジェクトのメンバー メソッドとプロパティを通じてのみ公開される COM オブジェクトを再帰的に検索します。元の方法論では、各オブジェクトによって直接公開される興味深いメソッドを調べ、独自の興味深いメソッドを持つ COM オブジェクトである可能性のあるプロパティに再帰しませんでした。方法論に対するこの改善は、コード実行に使用できる新しい COM オブジェクトの発見、および一般に知られているコード実行 COM オブジェクト メソッドを呼び出す新しい方法の発見に役立ちました。
再帰的な COM オブジェクト メソッドの検出
COM オブジェクトを使用してコードを実行するために一般に発見された手法に共通するテーマは、COM オブジェクトの子プロパティ内で公開されているメソッドを利用することです。この例は、「MMC20.Application」COM オブジェクトです。この COM オブジェクトでコードを実行するには、「Document.ActiveView」プロパティによって返される View オブジェクトで「ExecuteShellCommand」メソッドを使用する必要があります。これは、このブログ投稿で Matt Nelson が発見したものです。図 1 では、このメソッドが “Document.ActiveView” によって返されるオブジェクト内でのみ検出可能であり、MMC20.Application COM オブジェクトによって直接公開されていないことがわかります。
これのもう 1 つの例は、「ShellBrowserWindow」COM オブジェクトです。これについては、Matt Nelson がこのブログ投稿で最初に書いたものでもあります。図 2 からわかるように、”ShellExecute” メソッドは COM オブジェクトで直接公開されていません。ただし、「Document.Application」プロパティは、 ShellExecuteメソッドを公開するShell オブジェクトのインスタンスを返します。
前の 2 つの例の証拠として、COM オブジェクトによって直接公開されているメソッドを調べるだけでなく、COM オブジェクトのプロパティとして公開されている興味深いメソッドを持つオブジェクトを再帰的に探すことも重要です。この例は、COM オブジェクトのタイプ ライブラリを単に静的に探索するだけでは不十分な理由も示しています。関連する関数は、ジェネリック型 IDispatch のオブジェクトを動的に列挙した後にのみアクセスされます。この再帰的な方法により、コードの実行に使用する新しい COM オブジェクトを見つけたり、コードの実行に使用できる既知の COM オブジェクトをさまざまな方法で使用したりできます。
この再帰的な方法論が、一般に知られている COM オブジェクト メソッドを呼び出す新しい方法を見つけた例として、この記事で以前に示した “ShellBrowserWindow” COM オブジェクトの “ShellExecute” メソッドがあります。 「ShellBrowserWindow」COM オブジェクト内でこのメソッドを呼び出す既知の方法は、「Document.Application」プロパティを使用することです。再帰的な COM オブジェクト メソッドの発見により、図 3 に示すように、「Document.Application.Parent」プロパティによって返されるオブジェクトで「ShellExecute」メソッドを呼び出すことができることもわかりました。これは、回避の観点から役立ちます。
コマンド実行
この再帰的な COM オブジェクト メソッドの検出を使用して、FireEye はDDEInitiateメソッドを使用したコード実行に使用できる ProgID「Excel.ChartApplication」を持つ COM オブジェクトを見つけることができました。実行可能ファイルを起動するこの DDEInitiate メソッドは、Cybereason のこの記事で見られるように、「Excel.Application」COM オブジェクトで最初に悪用されました。 「Excel.ChartApplication」COM オブジェクトには、DDEInitiate メソッドの実行に使用できるオブジェクトを返す複数のプロパティがあります (図 4 参照)。この DDEInitiate メソッドも COM オブジェクトによって直接公開されますが、最初に見たときに発見されました。このオブジェクトからアクセス可能な他のオブジェクトで公開されているメソッドで。
この COM オブジェクトは、Office 2013 でインスタンス化してリモートで使用することもできます。 REF _Ref6214171 h * MERGEFORMAT Figure 508D0C9EA79F9BACE118C8200AA004BA90B02000000080000000C0000005F0052006500660036003200310034003100370031000000. COM オブジェクトは、Office 2016 でローカルにのみインスタンス化できます。Office 2016 に対してリモートでインスタンス化しようとすると、COM オブジェクト クラスがリモート インスタンス化用に登録されていないことを示すエラー コードが返されます。
結論
COM オブジェクト メソッドの再帰的検索により、コードの実行に使用できる新しい COM オブジェクトが発見され、一般に知られている COM オブジェクト メソッドを呼び出す新しい方法が発見される可能性があります。これらの COM オブジェクト メソッドは、さまざまな検出パターンを覆すために使用でき、横移動にも使用できます。
参照: https://www.mandiant.com/resources/blog/hunting-com-objects-part-two
Comments