DLL のサイドローディングとハイジャック — 脅威インテリジェンスを使用して研究開発を兵器化する

Performing dynamic analysis of SubWCRev.exe news

DLL 悪用の手口の概要

ダイナミック リンク ライブラリ (DLL)のサイドローディングは、プログラムによってロードされる DLL の特性が Windows サイド バイ サイド (WinSxS)マニフェストで明示されていない場合に発生します。簡単に言うと、 DLL サイドローディングにより、攻撃者はプログラムをだまして悪意のある DLL をロードさせることができます。 DLL のサイドローディングがどのように機能するか、およびこの手法を使用する攻撃者をどのように確認するかについて詳しく知りたい場合は、レポートをお読みください。

DLL ハイジャックは、攻撃者が Windows の検索と読み込み順序を利用して、正規の DLL ではなく、悪意のある DLL を実行できる場合に発生します。

DLL のサイドローディングとハイジャックは何年も前から存在しています。実際、FireEye Mandiant は、2010 年にDLL サイドローディング手法とDLL 検索順序ハイジャック最初に発見した企業の 1 つです。それは今でも機能し、現実世界の侵入で使用されている方法だからです! FireEye Mandiant は、インシデント対応 (IR) 活動中に DLL 悪用技術を使用して脅威グループを特定および監視しています。これに対して脆弱な署名済みの実行可能ファイルはまだたくさんあります。私たちの赤いチームは、方法論の一部として DLL の悪用技術を兵器化しました。 DLL の悪用手法の検出と予防策については、このブログ投稿の「検出と予防策」セクションを参照してください。

DLL の悪用手法は新しいものでも最先端のものでもありませんが、このブログ投稿では、 FireEye Mandiant のレッド チームFireEye Intelligenceを使用して、脆弱な実行可能ファイルを大規模に特定する調査フェーズを促進する方法を紹介します。また、DLL の悪用の影響を受けやすい新しい実行可能ファイルを発見する方法と、FireEye Mandiant のレッド チームが、 DueDLLigenceツールでこれらの DLL の悪用テクニックをどのように武器化したかについても説明します。 DueDLLigence ツールは当初、アプリケーションのホワイトリストをバイパスするためのフレームワークとしてリリースされましたが、管理されていないエクスポートの性質を考えると、DLL の悪用手法にも使用できます。

FireEye インテリジェンスの収集と武器化

FireEye Mandiant のレッド チームの一員になるメリットは、膨大な量の脅威インテリジェンスにアクセスできることです。私たちの組織のインシデント対応およびインテリジェンス コンサルタントは、過去 10 年間のほぼすべての主要な侵害における攻撃者の行動を観察、文書化、分析してきました。このプロジェクトのために、FireEye Mandiant レッド チームは FireEye Technical Operations and Reverse Engineering Advanced Practices (TORE AP) チームに、FireEye Intelligence を活用し、次の基準に一致する、攻撃者が使用するすべての DLL 悪用技術を提供するよう依頼しました。

  1. 悪意のある DLL を呼び出すために、スタンドアロンの PE ファイル(.exe ファイル) が使用されました
  2. .exe は署名されている必要があり、証明書は 1 年以内に期限切れにならない
  3. この手法に関するインテリジェンスには、呼び出された悪意のある DLL の名前が含まれている必要があります。

結果がレッドチームに提供されると、私たちはこの記事の残りの部分で概説されているアプローチを採用して、インテリジェンスの武器化を開始しました。これには次のものが含まれます。

  1. DLL 検索順序ハイジャックの影響を受けやすい実行可能ファイルの特定
  2. 実行可能ファイルのライブラリ依存関係の特定
  3. ライブラリにエクスポートされた満足のいく API
DLL 検索順序ハイジャック

多くの場合、安全でないライブラリ参照を利用することで、正当なポータブル実行可能ファイル (PE) のコンテキスト内でコードを実行できます。開発者がLoadLibraryでライブラリのパスを動的に解決できるようにすると、その PE は現在のディレクトリでライブラリ DLL も検索します。この動作は、攻撃者が書き込みアクセス権を持つディレクトリに正当な PE をコピーすることにより、悪意のある目的で使用される可能性があります。攻撃者がカスタム ペイロード DLL を作成すると、アプリケーションはその DLL をロードし、攻撃者のコードを実行します。これは、レッド チームにとって有益な場合があります。PE は署名されており、エンドポイント セキュリティ ソリューション (AV/EDR) に対して信頼されているように見えます。アプリケーション ホワイト リスト (AWL) をバイパスし、調査プロセスを混乱させたり遅らせたりする可能性があります。

このセクションでは、PE をハイジャックする条件を特定し、ペイロード DLL に要件を実装する 1 つの例を見ていきます。このテスト ケースでは、署名付きバイナリ PotPlayerMini (MD5: f16903b2ff82689404f7d0820f461e5d ) を使用します。この PE が選択されたのは、2016 年にさかのぼる攻撃者によって使用されていたためです。

ライブラリの依存関係の特定

IDAGhidraなどのツールを使用した静的分析により、PE に必要なライブラリとエクスポートを特定できます。たとえば、図 1 に示すスクリーンショットは、PotPlayerMini が「 PotPlayer.dll 」という DLL をロードしようとしていることを示しています。

 

PotPlayerMini によってロードされた DLL の静的解析

図 1: PotPlayerMini によってロードされた DLL の静的解析

静的分析が実行できない、または望ましくない場合は、 API MonitorFridaなどのフッキング フレームワークを使用して、アプリケーションのLoadLibrary / GetProcAddressの動作をプロファイリングできます。

図 2 では、API モニターを使用して、これと同じ DLL の読み込み動作を確認しました。ご覧のとおり、PotPlayerMini は現在のディレクトリでPotPlayer.dllファイルを探しています。この時点で、PotPlayerMini が DLL 検索順序ハイジャックの影響を受けやすいことを確認しました。

 

PotPlayerMini によってロードされた DLL の動的解析

図 2: PotPlayerMini によってロードされた DLL の動的解析

満足のいく輸出

潜在的に脆弱なライブラリ モジュールを特定したら、同様の方法を適用して、モジュール PE から必要なエクスポートを特定する必要があります。図 3 は、PotPlayerMini から逆コンパイルされたビューを示しており、静的分析を使用してGetProcAddress関数内で探しているエクスポートを強調表示しています。図 4 は、PotPlayerMini アプリケーションでこれと同じエクスポートの分析を実行することを示していますが、代わりに動的分析を使用しています。

 

PotPlayerMini DLL でのエクスポートの静的分析

図 3: PotPlayerMini DLL でのエクスポートの静的分析

 

PotPlayerMini DLL でのエクスポートの動的分析

図 4: PotPlayerMini DLL でのエクスポートの動的分析

この場合、ペイロードはUnmanagedExportsを使用する .NET DLL であるため、図 5 に示すように、バイナリからのすべてのエクスポート要件を満たす必要があります。これは、.NET UnmanagedExports ライブラリがDllMainをサポートしていないためです。エクスポートされません。 GetProcAddressまたはインポート アドレス テーブル (IAT) を介してプログラムがアクセスするすべての関数が DLL にエクスポートされるようにするには、すべてのエクスポート要件を満たす必要があります。これらのエクスポート方法は、静的および動的分析で観察されたものと一致します。これには、バイナリに存在する検証に応じて、試行錯誤が必要になる場合があります。

 

.NET DLL でのエクスポート要件の追加

図 5: .NET DLL にエクスポート要件を追加する

バイナリを実行すると、関数が正常に実行されていることがわかります (図 6 参照)。

 

DLL の悪用を受けやすいバイナリの実行

図 6: DLL の悪用を受けやすいバイナリの実行

すべてのエクスポートを満たさない DLL ハイジャック

C/C++ でペイロード DLL を記述する場合、 DllMainで制御フローを乗っ取ることができます。これを行う場合、前述のように、必要なすべてのエクスポートを列挙して満たす必要はありません。また、DLL にエクスポートがなく、 DllMainエントリ ポイント経由でしかハイジャックできない場合もあります。

この例は、 wmpshare.exeと呼ばれる Windows Media Player フォルダー共有実行可能ファイルで示されます。実行可能ファイルを元の場所 ( C:Program Files (x86)Windows Media Player ) からディレクトリにコピーし、API モニターを使用して動的分析を実行できます。図 7 では、wmpshare.exe プログラムがLoadLibraryWメソッドを使用してwmp.dll ファイルをロードしていますが、DLL への明示的なパスを指定していないことがわかります。この場合、 LoadLibraryWメソッドはまず、プロセスが作成されたディレクトリ (現在の作業ディレクトリ) を検索します。使用される検索順序の詳細については、 LoadLibraryWのドキュメントCreateProcessのドキュメントを参照してください。

 

wmpshare.exe で LoadLibrary 呼び出しを表示する

図 7: wmpshare.exe での LoadLibrary 呼び出しの表示

明示的なパスが指定されていないため、「 wmp.dll 」という名前の空のファイルを作成し、それをwmpshare.exeファイルと同じディレクトリにコピーすることで、DLL ハイジャックの影響を受けやすいかどうかをテストできます。 API Monitor で wmpshare 実行可能ファイルを実行すると、最初に現在のディレクトリでwmp.dllファイルをチェックしていることがわかります (図 8 参照)。したがって、このバイナリを使用して DLL ハイジャックを行うことができます。

 

ダミー dll が存在する wmpshare.exe で LoadLibrary 呼び出しを表示する

図 8: ダミー dll が存在する wmpshare.exe で LoadLibrary 呼び出しを表示

図 9 は、武器化された方法で wmpshare 実行可能ファイルを使用して、C++ で作成された DLL でDllMainエントリ ポイントを利用する方法を示しています。

 

DllMain エントリ ポイントの使用

図 9: DllMain エントリ ポイントの使用

DLL の悪用を受けやすい新しい実行可能ファイルの発見

攻撃者による DLL の悪用に使用される実行可能ファイルの FireEye インテリジェンスを兵器化することに加えて、FireEye Mandiant レッド チームは、Windows システム ユーティリティとサードパーティ アプリケーションを標的とすることで、悪用されやすい新しい実行可能ファイルを発見するための調査を行いました。

Windows システム ユーティリティ

FireEye Mandiant のレッド チームは、「FireEye インテリジェンスの収集と兵器化」セクションで説明した手法を使用して、 C:WindowsSystem32ディレクトリに存在する Windows システム ユーティリティを調べましたが、これらは DLL の悪用手法の影響を受けやすいものでした。見つかったシステム ユーティリティの 1 つは、展開イメージのサービスと管理 (DISM) ユーティリティ ( Dism.exe ) でした。このシステム ユーティリティの動的分析を実行すると、図 10 に示すように、現在のディレクトリにDismCore.dllファイルを読み込もうとしていることがわかりました。

 

Dism ユーティリティの動的解析の実行

図 10: Dism ユーティリティの動的分析の実行

次に、図 11 に示すように、必要なエクスポートを確認するために、DISM システム ユーティリティを通常のパス ( C:WindowsSystem32 ) から API Monitor にロードしました。

 

DismCore.dll に必要なエクスポート

図 11: DismCore.dll に必要なエクスポート

図 12 に示すコードは、DLL に脆弱性があり、DISM システム ユーティリティを使用して正常に実行できることを検証するために、 DueDLLigenceに追加されました。

 

DueDLLigence に追加された Dism エクスポート メソッド

図 12: DueDLLigence に追加された Dism エクスポート メソッド

サードパーティ アプリケーション

FireEye Mandiant レッド チームは、DLL の悪用の影響を受けやすい一般的なサードパーティ アプリケーションに関連する実行可能ファイルも標的にしました。発見された実行可能ファイルの 1 つは、 Tortoise SVNユーティリティ ( SubWCRev.exe ) でした。この Tortoise SVN ユーティリティの動的分析を実行すると、現在のディレクトリにcrshhndl.dllをロードしようとしていることがわかりました。エクスポート方法を図 13 に示します。

 

Performing dynamic analysis of SubWCRev.exe

図 13: SubWCRev.exe の動的分析の実行

図 14 に示すコードは、DLL に脆弱性があり、Tortoise SVN ユーティリティを使用して正常に実行できることを検証するために、 DueDLLigenceに追加されました。

 

DueDLLigence に追加された SubWCRev.exe エクスポート メソッド

図 14: DueDLLigence に追加された SubWCRev.exe エクスポート メソッド

レッドチームへの適用

スタンドアロンの信頼できる実行可能ファイルを使用すると、レッド チームは、信頼できる実行可能ファイルと悪意のある DLL を被害者のマシンにコピーするだけで、アプリケーションのホワイトリストを含むさまざまなホストベースのセキュリティ制御を回避できます。信頼できる実行可能ファイル (DLL の悪用に対して脆弱) と悪意のある DLL の両方が同じ現在の作業ディレクトリに配置されると、実行可能ファイルは同じディレクトリ内の対応する DLL を呼び出します。この方法は、持続性の確立やラテラル ムーブメントの実行などのフェーズを含む、ペイロード インプラントとして攻撃ライフサイクルの複数のフェーズで使用できます。

持続性

この例では、Windows システム ユーティリティ セクションで検出された Windows システム ユーティリティDism.exeを実行可能ファイルとして使用し、 SharPersistと組み合わせてDueDLLigenceによって生成された DLL を使用して、ターゲット システムで永続性を確立します。まず、図 15 に示すように、DISM システム ユーティリティと悪意のある DLL がターゲット システムにアップロードされます。

 

ペイロード ファイルのアップロード

図 15: ペイロード ファイルのアップロード

次に、 SharPersistを使用して、図 16 に示すように、DISM システム ユーティリティと関連する DLL を使用するスタートアップ フォルダーの永続性を追加します。

 

SharPersist を使用してスタートアップ フォルダーの永続性を追加する

図 16: SharPersist を使用してスタートアップ フォルダーの永続性を追加する

ターゲット マシンが再起動され、ターゲット ユーザーがログオンした後、図 17 は Cobalt Strike C2 サーバーがDism.exeプロセス内のスタートアップ フォルダーの永続性からビーコン コールバックを受信していることを示しています。

 

持続性コールバックの成功

図 17: 持続性コールバックの成功

横移動

水平方向の移動には、同じ DISM システム ユーティリティと DLL ファイルを引き続き使用します。この例では、 HOGWARTSadumbledoreユーザーがリモート ホスト192.168.1.101への管理アクセス権を持っています。図 18 に示すように、SMB プロトコルを介して DISM システム ユーティリティと関連する DLL ファイルをリモート ホストに転送します。

 

SMB 経由でペイロード ファイルをリモート ホストに転送する

図 18: SMB 経由でペイロード ファイルをリモート ホストに転送する

次に、最初のビーコンで SOCKS プロキシをセットアップし、Impacket のwmiexec.pyを使用して Windows Management Instrumentation (WMI) プロトコル経由でペイロードを実行します (図 19 と図 20 を参照)。

proxychains python wmiexec.py -nooutput ドメイン/ユーザー:パスワード:@xxxx C:TempDism.exe

図 19: Impacket の wmiexec.py を使用して WMI 経由でペイロードを実行する

 

図 19 に示すコマンド実行の出力

図 20: 図 19 に示すコマンドを実行したときの出力

図 21 に示すように、WMI 経由で DISM システム ユーティリティを実行した後、リモート ホストからビーコンを受信します。

 

リモートホストでビーコンを取得する

図 21: リモート ホストでのビーコンの取得

検出と予防措置

DLL サイドローディングの詳細な防止および検出方法は、レポートに詳しく記載されており、DLL Abuse Techniques Overview に記載されています。レポートでは、ソフトウェア開発レベルでの予防策に分けて、エンドポイント ユーザー レベルの推奨事項に進みます。レポートに記載されていないいくつかの検出方法には、次のものがあります。

  • 異常なネットワーク接続を持つプロセスのチェック
    • 通常のプロセス ネットワーク アクティビティのベースラインを作成し、特定のプロセスのネットワーク アクティビティがベースラインと異なる場合は、そのプロセスが侵害された可能性があります。
  • DLL ホワイトリスト
    • システムで使用されている DLL のハッシュを追跡して、不一致を特定します。

これらの検出方法を大規模に実装することは困難ですが、利用することは可能です。それこそが、この古い手法が今でも有効であり、現代のレッドチームや脅威グループによって使用されている理由です.この脆弱性が存在し続けることを可能にする本当の問題は、ソフトウェア発行者に関係しています。ソフトウェア発行者は、DLL の悪用技術を認識し、そのような脆弱性が製品に開発されるのを防ぐ方法を知る必要があります (たとえば、レポートで説明した軽減策を実装することによって)。これらの推奨事項を適用することで、攻撃者がいくつかの最新の検出手法を回避するために使用する DLL の悪用の機会を減らすことができます。

Microsoft は、DLL のセキュリティDLL ハイジャックの脆弱性のトリアージに関する優れたリソースを提供しています。

結論

脅威インテリジェンスは、攻撃的な研究と開発を行い、実際の攻撃者をエミュレートしようとしているレッド チームに計り知れない価値を提供します。レッドチームは、実際の攻撃者が何をしているかを見ることで、将来のツールや TTP のヒントを得ることができます。

DLL の悪用手法は、持続性やラテラル ムーブメントなど、攻撃ライフサイクルの複数のフェーズで回避の観点から役立つ場合があります。 DLL の悪用の影響を受けやすく、セキュリティの専門家と敵対者の両方が使用する実行可能ファイルが引き続き発見されるでしょう。

参照: https://www.mandiant.com/resources/blog/abusing-dll-misconfigurations

Comments

Copied title and URL