
自動化されたDLLハイジャックの発見、検証、確認。ローカルの設定ミスを武器化された確定した攻撃経路に変換します。
自動化されたDLLハイジャックの発見、検証、確認
ローカルの設定ミスを、武器化された確定済みの攻撃経路へと変える。
DLLHijackHunter は、静的解析を超えた自動化されたWindows DLLハイジャック検出ツールです。多段階パイプラインを使用して、DLLハイジャックの機会を発見、検証、確認します:
ほとんどのDLLハイジャックツールは「このDLLはハイジャック可能かもしれない」というところで止まります。DLLHijackHunter はそれを検証し、既知のエクスプロイトインテリジェンスと照合し、可能な場合は実際の実行経路を確認しようとします。
flowchart TB
subgraph Phase1["フェーズ 1: 発見"]
SE["静的エンジン<br/>サービス、タスク、スタートアップ、<br/>COM、Runキー"]
AE["AutoElevateエンジン<br/>マニフェスト + COM UACバイパス"]
PE["PEアナライザー<br/>インポートテーブル、遅延ロード、<br/>マニフェスト、エクスポート"]
ETW["ETWエンジン<br/>リアルタイムDLLロード<br/>モニタリング"]
SO["検索順序<br/>計算機"]
end
subgraph Phase2["フェーズ 2: フィルターパイプライン"]
direction LR
HG["ハードゲート<br/>(バイナリキル)"]
SG["ソフトゲート<br/>(信頼度調整)"]
end
subgraph Phase3["フェーズ 3: ロード検証 (--verify-load)"]
LP["LoadProbe<br/>子プロセスローダーテスト<br/>プローブDLL配置 & 削除"]
end
subgraph Phase4["フェーズ 4: カナリア"]
CB["カナリアDLLビルダー"]
TE["トリガー実行器"]
VF["検証"]
end
subgraph Phase5["フェーズ 5: 出力"]
SC["階層化スコアラー"]
RC["コンソールレポート"]
RJ["JSONレポート"]
RH["HTMLレポート"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5IFEOデバッガーエントリは列挙され、参照されるバイナリはDLLインポートについて分析されますが、専用のIFEO/KnownDLLバイパスハイジャックタイプはありません — これらはスタンドアロンの検出として宣伝されていません。
DLLHijackHunter には専用のUACバイパス発見が含まれています:
System32とSysWOW64をスキャンして、埋め込みマニフェストに<autoElevate>true</autoElevate>を含むEXEを探しますHKLM\SOFTWARE\Classes\CLSIDをスキャンして、Elevation\Enabled=1を持つCOMオブジェクトを探しますSetDllDirectoryまたはSetDefaultDllDirectoriesを呼び出さないAutoElevateバイナリに対して、「EXEを書き込み可能フォルダにコピー + DLLをドロップ」攻撃パスをシミュレートしますResources/hijacklibs.jsonとして埋め込まれています。一致すると信頼度が上がり、発見結果がHijackLibs参照ページにリンクされます。一致しないことは何も意味しません。データセットはデータ駆動型です — https://hijacklibs.net/api/hijacklibs.jsonを再ダウンロードしてそのリソースに上書きすることで更新できます(コード変更は不要)。データセット© HijackLibsプロジェクトおよび貢献者。PATHフォルダを評価し、不足しているDLLをPATHで検索することが知られているネイティブWindowsサービスの厳選マップに対してハイジャック候補を生成しますパイプラインは2つの段階を通じて誤検知を削減します:
ハードゲート
api-ms-*、ext-ms-*)Users / Authenticated Users / Everyone、およびLOCAL SERVICE/NETWORK SERVICEのようなリーク防止サブ管理者サービスアカウント)が実効書き込み権限を持つ場合にのみ書き込み可能とカウントされます。重要なのは、これはツールが実行されるトークンとは独立して計算されるため、昇格して実行してもSystem32/Program Filesが書き込み可能に見えることはありません。これが、昇格実行をLPEトリアージにとって意味のあるものにしている理由です。ソフトゲート
LoadLibraryEx緩和チェック推測する代わりに、DLLHijackHunter はハイジャックが機能することを証明しようとします:
sequenceDiagram
participant H as DLLHijackHunter
participant B as カナリアDLLビルダー
participant T as トリガー実行器
participant V as 被害者バイナリ
H->>B: カナリアDLLをビルド
B->>B: プリコンパイル済みカナリアを抽出<br/>(またはMSVCでプロキシをコンパイル)
B-->>H: canary.dll + 確認ファイルパス
H->>H: ハイジャックパスにDLLを配置
H->>T: バイナリ実行をトリガー
T->>V: サービス開始 / タスク実行 / COMアクティベート
V->>V: カナリアDLLをロード
V-->>H: 確認ファイルを書き込み<br/>PID、特権、整合性レベル
H->>H: 記録: CONFIRMED
H->>H: カナリアDLLをクリーンアップカナリアDLL:
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm)。そのため、1つのバイナリがすべての候補にサービスを提供します。スキャナーはデプロイパスから同じハッシュを計算し、そのファイルをポーリングします。バンドルされたバイナリは、src/DLLHijackHunter/Resources/canary_src.cの監査可能なソースからビルドされ、Resources/build_canary.batで再生成できます(MSVC C++ツールチェーンが必要です。スキャナーには不要です)。
機能プロキシ例外: 検索順序ハイジャックが存在しエクスポートを公開するDLLをターゲットにする場合、確認後にホストを生かし続けるにはエクスポート転送プロキシが必要です。これはMSVC(
cl.exe、vswhere/vcvarsallで検出)でDLLごとにコンパイルされます。ツールチェーンがない場合は、プリコンパイル済みカナリアが代わりに使用されます — それでもロードを確認します(DllMainが発火)が、エクスポートを転送しないため、確認が記録された後にホストプロセスがクラッシュする可能性があります。ファントムDLLやその他のエクスポートなし候補はコンパイラをまったく必要としません。
署名: 埋め込まれたカナリアは署名されていません。コード署名(より厳格なポリシーの下でロードされ、帰属可能になるように)には署名証明書が必要であり、メンテナー向けのリリース時ステップとして残されています。
プロキシ/エクスポート転送カナリアは実験的でありベストエフォートです。一部のターゲットは正しくロードできないか、以下によって予期しない動作をする可能性があります:
つまり、プロキシカナリアの失敗は、基盤となるハイジャックパスが不可能であることを常に意味するわけではありません。
--verify-load)フィルターパイプラインとカナリアフェーズの間に位置するオプトインの標準ユーザー検証です。該当する各候補について、書き込み可能なハイジャック位置に良性のプローブDLLを一時的に書き込み、その後、短命の子プロセス内の実際のWindowsローダーにDLLを名前で解決するよう要求します。ローダーが解決する場所が判定を決定します:
ntdll.dllの.local/検索順序「発見」)。設計と安全性のメモ:
LOAD_LIBRARY_SEARCH順序をモデル化するため、ファントム / 検索順序 / サイドロード候補にのみ適用されます。.local、PATH、AppInit/AppCert候補は異なるメカニズムを使用するため、スキップとして報告されます。# ローダー検証済み検索順序による標準ユーザートリアージ(カナリアなし、ETWなし)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
git clone https://github.com/ghostvectoracademy/DLLHijackHunter.git
cd DLLHijackHunter
# ビルド(自己完結型シングルファイル)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
-c Release -r win-x64 --self-contained `
-p:PublishSingleFile=true -o ./publish
# またはビルドスクリプトを使用
.\build.ps1
# フルアグレッシブスキャン(推奨、管理者が必要)
.\DLLHijackHunter.exe --profile aggressive
# セーフスキャン(ファイルドロップなし、トリガーなし)
.\DLLHijackHunter.exe --profile safe
# UACバイパス焦点スキャン
.\DLLHijackHunter.exe --profile uac-bypass
# 特定のバイナリをターゲット
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe"
# ファイル名でターゲット(部分一致)
.\DLLHijackHunter.exe --target notepad.exe
# 確認済みの発見結果のみ
.\DLLHijackHunter.exe --profile redteam --format json -o report.json
DLLHijackHunter — 自動化されたDLLハイジャック検出
オプション:
-p, --profile <profile> スキャンプロファイル [デフォルト: aggressive]
aggressive | strict | safe | redteam | uac-bypass
-o, --output <path> 出力ファイルパス(フォーマットを自動検出)
-f, --format <format> 出力フォーマット [デフォルト: console]
console | json | html
-t, --target <target> 特定のバイナリ、ディレクトリ、またはファイル名をターゲット
--min-confidence <value> 最小信頼度しきい値 0-100。省略時は各プロファイルの
しきい値が適用されます。これを渡すと上書きされます。
--no-canary カナリア確認を無効化
--no-etw ETWランタイム発見を無効化
--verify-load 実際のローダーで検索順序を検証(下記参照)。
標準ユーザー。良性プローブを一時的に書き込みます。
--confirmed-only カナリア確認済みの発見結果のみ表示
--lpe-only 厳格なLPEハンティング:System32/Program Filesを無視し、
標準ユーザー書き込み可能な脆弱性のみ表示
--log-file <path> 診断スキャンログをファイルに書き込み
-v, --verbose 詳細出力
注:
--min-confidenceは明示的に渡した場合のみ上書きとして扱われます。それ以外の場合は選択されたプロファイルのしきい値が使用されます(例:safe= 50%、strict= 80%)。
各発見結果は、最終的な優先順位付け層に結合される信頼度と影響のシグナルを受け取ります。
典型的な影響の考慮事項には以下が含まれます:
確認済みのカナリア実行は、最も強力な検証シグナルとして扱われるべきです。
層のゲーティング: HighおよびConfirmed層は、証明シグナル(発火したカナリア、ETWランタイムロード観測、または文書化されたナレッジベース一致)によって裏付けられた発見結果のために予約されています。純粋に静的な検索順序の一致は、どれほどクリーンでも、Medium層の最上位に制限され、Static-onlyとして注釈が付けられるため、未検証のヒューリスティックが高信頼度として提示されることはありません。
書き込み可能性は攻撃者相対で評価されるため、昇格実行と標準ユーザー実行の両方が意味を持ちます:
--lpe-only付きの標準ユーザー実行**です(コンパイラが利用できない場合は--no-canaryも)。生き残ったすべての発見結果は、非特権プリンシパルによって実際に書き込み可能です。DLLHijackHunter は、許可された環境での防御的セキュリティ研究、ラボ検証、監査、レッドチームシミュレーション用に設計されています。
所有している、または評価する明示的な許可があるシステムとネットワークでのみ使用してください。
DLLHijackHunter は以下をサポートします:
推奨ワークフロー:
MIT
ProjectMerai によって構築されました。
| タイプ | 説明 | ステルス性 | ステータス |
|---|
| ファントム | DLLがディスク上のどこにも存在しない | 高 | 実装済み |
| 検索順序 | Windows検索順序のより早い位置にDLLを配置する | 高 | 実装済み |
| サイドローディング | 正規アプリが自ディレクトリからDLLをロードすることを悪用 | 高 | 実装済み (AutoElevateコピー-to-tempパス) |
| .localリダイレクト | .localディレクトリリダイレクションによるハイジャック | 高 | 実装済み |
| ENV PATH | システムPATH内の書き込み可能ディレクトリの武器化 | 高 | 実装済み (厳選されたサービス/DLLマップ) |
| AppInit DLL | AppInit_DLLsレジストリ悪用 | 低 | 実装済み |
| AppCert DLL | AppCertDLLsレジストリ悪用 (すべてのCreateProcess/WinExec呼び出し元にロードされる) | 低 | 実装済み |
| CWD | カレントワーキングディレクトリのハイジャック | 低 | 計画中 — 現在どの発見パスでも生成されない |
| 機能 | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|
| 自動発見 | ✅ | ✅ | ✅ | ✅ | ❌ |
| ファントムDLL検出 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 検索順序分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| ACLベースの書き込み可能性チェック | ✅ | 部分的 | ❌ | 基本 | ❌ |
| ETWリアルタイムモニタリング | ✅ | ❌ | ❌ | ❌ | ✅ |
| カナリア確認 | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| 特権昇格チェック | ✅ | ❌ | ❌ | ❌ | ❌ |
| UACバイパス発見 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 誤検知削減 | ✅² | なし | 基本 | なし | なし |
| 再起動永続性チェック | ✅³ | ❌ | ❌ | ❌ | ❌ |
| プロキシDLL生成 | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| 信頼度スコアリング | ✅ | ❌ | ❌ | ❌ | ❌ |
| 自動トリガー (svc/task/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| HTML/JSONレポート | ✅ | ❌ | ❌ | TXT | ❌ |
| 脅威インテリジェンス相関 | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| 自動化されたPATHエクスプロイト | ✅ | ❌ | ❌ | ❌ | ❌ |
| ターゲット固有スキャン | ✅ | ❌ | ❌ | ❌ | ✅ |
| 自己完結型バイナリ | ✅ | ❌ | ❌ | ✅ | ❌ |
| プロファイル | ユースケース | カナリア | ETW | UACバイパス | 最小信頼度 | トリガー |
|---|
| aggressive | フル監査、ラボ環境 | ✅ | ✅ | ✅ | 15% | サービス、タスク、COM |
| strict | 高信頼度の発見結果のみ | ✅ | ✅ | ❌ | 80% | サービス、タスク |
| safe | 本番システム、読み取り専用 | ❌ | ❌ | ❌ | 50% | なし |
| redteam | 確認済み悪用可能のみ | ✅ | ✅ | ❌ | 50% | サービス、タスク、COM |
| uac-bypass | UACバイパスベクターのみ | ❌ | ❌ | ✅ | 20% | AutoElevateのみ |