ブログ(脅威調査)

FireEyeインテリジェンスからDLLを悪用してプログラムを武器化するリサーチ

DLL悪用技術の概要

ダイナミックリンクライブラリ(DLL)サイドローディングは、Windows Side-by-Side(WinSxS)マニフェストが、プログラムがロードするDLLの構成について明示的でない場合に発生します。簡単に言うと、DLLサイドローディングによって攻撃者は、不正なDLLをロードするようにプログラムをだますことができるようになります。DLLサイドローディングの仕組みや、この技術を使った攻撃者の確認方法の詳細については、こちらのホワイトペーパー(英語)をご覧ください。

DLLハイジャッキングは、正規のDLLではなく不正なDLLを実行できるように、攻撃者がWindowsの検索と読み込み順序を利用できる場合に発生します。

DLLサイドローディングとハイジャッキングは長きにわたって行われてきました。実際、FireEye Mandiantは、2010年のDLL Search Order Hijackingと共にDLLサイドローディング技術を初めて発見した1組織でした。それについて、まだブログを書いている理由は、これはまだ通用する手法であり、実際の侵害で使用されているからです!FireEye Mandiantは、インシデントレスポンス(IR)の対応中にDLL悪用技術を使用して脅威グループを識別し、監視します。これに対して脆弱な署名付き実行可能ファイルはまだ多数あり、我々のレッドチームはDLL悪用技術を我々の方法論の一部として武器化しています。DLL悪用技術の検知と防止策については、この記事の「検知と予防対策」を参照してください。

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

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

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

  1. スタンドアロンの.exeファイルを使用して、不正なDLLを呼び出した
  2. .exeは署名付きで、証明書の有効期限が1年以内ではない
  3. この技術に関するインテリジェンスには、呼び出された不正なDLLの名前が含まれていること

レッドチームに結果が提供されたら、この記事の後半で説明する方法でインテリジェンスの武器化を開始しました。これには以下が含まれます。

  1. DLL Search Order Hijackingの影響を受けやすい実行ファイルの特定
  2. それら実行ファイルのライブラリ依存関係の特定
  3. さらにライブラリにエクスポートされたAPIを提供
DLL Search Order Hijacking

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

このセクションでは、PEをハイジャックする条件を特定し、我々のペイロードDLL内に要件を実装する一例を見ることにします。このテスト・ケースでは、署名付きバイナリPotPlayerMini(MD5:f16903b2ff82689404f7d0820f461e5d)を使用します。このPEを選んだのは、攻撃者が2016年まで使用していたからです。

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

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


図1:PotPlayerMiniがロードしたDLLの静的解析

ここで、静的解析が実行不可能または望ましくない場合、API MonitorまたはFridaなどのフッキング・フレームワークを使用して、LoadLibrary/GetProcAddressによるアプリケーションの動作をプロファイルすることができます。

図2では、API Monitorを使用して、同じDLLローディングの振る舞いを確認しました。見てわかるように、PotPlayerMiniはカレント・ディレクトリ内でPotPlayer.dllファイルを探しています。この時点で、PotPlayerMiniがDLL Search Order Hijackingの影響を受けやすいことを検証しました。


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

エクスポートの要件

脆弱性の可能性があるライブラリ・モジュールを特定したら、類似の方法論を適用して、PEモジュールから必要とされるエクスポートを特定します。図3に、PotPlayerMiniの逆コンパイル結果を示します。静的解析を使用して、GetProcAddress関数内で探しているエクスポートをハイライトしています。図4では、PotPlayerMiniアプリケーション内でエクスポートを同じように解析していますが、こちらでは動的解析を使用しています。


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


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

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


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

バイナリを実行すると、図6に示されるとおり、関数が正常に実行されることがわかります。


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

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

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

この例は、Windows Media Playerのフォルダ共有に関連する実行ファイルwmpshare.exeを使用して示すことができます。実行ファイルを元の場所(C:\Program Files (x86)\Windows Media Player)から、あるディレクトリにコピーし、API Monitorを使用して動的解析を実行できます。図7では、wmpshare.exeプログラムはLoadLibraryW手法を使用してwmp.dllファイルをロードしますが、DLLへの明示的なパスを指定していないことが見てとれます。この場合、LoadLibraryW手法はまず、プロセスが作成されたディレクトリ(現在の作業ディレクトリ)を検索します。使用される検索順の詳細については、LoadLibraryWの解説およびCreateProcessの解説を参照してください。


図7:wmpshare.exeでのLoadLibraryコール

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


図8:ダミーdllが存在するwmpshare.exe内のLoadLibraryコール

図9は、C++で作成されたDLLのDllMainエントリーポイントを使って、wmpshare実行ファイルを武器化してハイジャックした例です。


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

DLL悪用に適した新しい実行ファイルの検出

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

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

FireEye Mandiantのレッドチームは、前述の「FireEyeインテリジェンスの収集と武器化」で説明した方法論を使用して、DLL悪用技術の影響を受けやすいC:\Windows\System32ディレクトリに存在するWindowsシステム・ユーティリティをチェックしました。検出されたシステム・ユーティリティの1つは、展開イメージのサービスと管理(DISM)ユーティリティ(Dism.exe)です。このシステム・ユーティリティの動的解析を実行すると、図10に示すように、カレント・ディレクトリ内にDismCore.dllファイルをロードしようとしていることがわかりました。


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

次に、図11に示すとおり、DISMシステム・ユーティリティを通常のパス(C:\Windows\System32)からAPI Monitorにロードし、必要なエクスポートを確認します。


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

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


図12:DueDLLigenceに追加されたDismエクスポート手法

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

また、FireEye Mandiantのレッドチームは、DLL悪用の可能性がある一般的なサードパーティ製アプリケーションに関連する実行ファイルも調査しました。検出された実行ファイルの1つは、Tortoise SVNユーティリティ(SubWCRev.exe)です。このTortoise SVNユーティリティの動的解析を実行すると、カレント・ディレクトリにあるcrshhndl.dllをロードしようとしていることがわかりました。エクスポート手法を図13に示します。


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

図14に示すコードは、Tortoise SVNユーティリティのDLLが脆弱で、DueDLLigenceを使用して任意のDLLを正常に実行できることを検証しました。

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

レッドチームへの適用

スタンドアロン構成での信頼された実行ファイルを持つことで、レッドチームは信頼された実行ファイルと不正なDLLを被害者のマシンにコピーするだけで、アプリケーション・ホワイトリストを含むさまざまなホストベースのセキュリティ制御をバイパスすることができます。信頼された実行ファイル(DLL悪用の脆弱性)と不正なDLLの両方が同じ作業ディレクトリに存在する場合、実行ファイルは同じディレクトリ内の対応するDLLを呼び出します。この手法は、持続性確立や水平展開の実行などの段階を含む攻撃ライフサイクルのさまざまな段階で、ペイロード・インプラントとして、使用することができます。

持続性

この例では、Windowsシステム・ユーティリティのセクションで検出された、Windowsシステム・ユーティリティDism.exe(実行ファイル)と、DueDLLigenceによって生成されたDLLをSharPersistとともに使用して、標的とするシステムで持続性を確立します。図15に示すように、最初に、DISMシステム・ユーティリティと不正なDLLが標的のシステムにアップロードされます。


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

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


図16:SharPersistを使用したスタートアップ・フォルダの持続性の追加

図17では、標的のマシンがリブートされ、標的のユーザーがログオンした後、Dism.exeプロセスに潜むスタートアップ・フォルダの持続性からビーコン・コールバックを受信しているCobalt Strike C2サーバーを示しています。


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

水平展開

水平展開には、引き続き同じDISMシステム・ユーティリティとDLLファイルを使用します。この例では、HOGWARTS\adumbledoreユーザーはリモート・ホスト192.168.1.101への管理アクセス権を持っています。DISMシステム・ユーティリティおよび関連するDLLファイルを、SMBプロトコルを介してリモート・ホストに転送します(図18)。


図18:SMBを介したリモート・ホストへのペイロード・ファイルの転送

次に、最初のビーコンにSOCKSプロキシを設定し、Impacketのwmiexec.pyを使用して、Windows Management Instrumentation(WMI)プロトコルを介してペイロードを実行します(図19および図20)。

proxychains python wmiexec.py -nooutput DOMAIN/user:password:@x.x.x.x C:\\Temp\\Dism.exe

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


図20:図19に示したコマンドの実行後の出力

WMIを介してDISMシステム・ユーティリティを実行した後、リモート・ホストからビーコンを受信します(図21)。


図21:リモート・ホストでのビーコンの受信

検知および予防対策

DLLサイドローディングの防止および検知手法についての詳細はホワイトペーパーに記載されているのでご覧ください。また、本記事の「DLL悪用技術の概要」でも触れています。ホワイトペーパーでは、ソフトウェア開発レベルでの対応策にまで落とし込み、エンドポイント・ユーザー・レベルの推奨事項を詳述しています。ホワイトペーパーに記載されていない検知手法には、次のものがあります。

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

これらの検知手法は、大規模環境で実装することは困難ですが、利用することには価値があります。この古い技術が今でも有効であり、最近のレッドチームや脅威グループによって使用されているのは、まさにこういった理由です。この脆弱性が引き続き存在できるようにしている実際の問題は、ソフトウェア発行者が処理しなくてはなりません。ソフトウェア発行者は、DLLの悪用技術を認識し、そのような脆弱性が製品に発展しないようにする方法(たとえば、ホワイトペーパーで説明されている緩和策を実装することなど)を知っている必要があります。これらの推奨事項を適用することで、最近のさまざまな検知技術を回避するために攻撃者がDLL悪用を使用する機会を減らすことができます。

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

結論

脅威インテリジェンスは、研究開発および実際の攻撃者をエミュレートするレッドチーム担当者に、膨大な価値を提供します。実際の攻撃者が実施する内容を体験することで、レッドチームの担当者は、将来のツール開発やTTPのインスピレーションを収集することができます。

DLL悪用技術は、持続性や水平展開など、攻撃ライフサイクルのさまざまな段階で、回避という観点で役立ちます。DLL悪用の影響を受けやすく、セキュリティ専門家や攻撃者によって同様に使用されている実行ファイルは、今後もさらに発見されるでしょう。

 

本ブログは、米FireEyeが公開した January 31, 2020「Abusing DLL Misconfigurations — Using Threat Intelligence to Weaponize R&D」(英語)の日本語抄訳版です。

日本語版:Reviewed by Toru Tanimura