
Anvil は、Windows シッククライアントアプリケーション向けのランタイムファーストの攻撃対象領域評価ツールであり、ペネトレーションテスターやセキュリティ研究者が対象を絞ったアプリケーションセキュリティ評価を実施するために構築されています。1 回のターゲット指定実行で複数の攻撃クラスをカバーします。
ランタイムファーストの権限昇格および攻撃対象領域評価ツール for Windows シッククライアント。
Anvilは、Windows シッククライアントアプリケーション向けのランタイムファーストの権限昇格および攻撃対象領域評価ツールです。ファイルシステムを盲目的にスキャンするのではなく、Procmon キャプチャと Windows AccessCheck を組み合わせて、ランタイムに観測されかつ標準ユーザーによる書き込みが確認されたパスのみをレポートし、汎用的な列挙ツールにありがちな誤検出ノイズを排除します。
ほとんどのシッククライアント評価ツールは、1つまたは2つの攻撃クラスをカバーするだけです。Anvilは、ランタイム観測、ACL検証済みの悪用可能性、および幅広い攻撃対象領域がすべて同じターゲット実行に含まれ、ゲート付きパイプラインによって実用的な出力を維持する、という考えに基づいています。
すべての候補は、報告される前に4つの連続したゲートを通過します。
ハードゲート
AccessCheck API で検証モジュールロジックゲート
Supersede、OverwriteIf など) + クロスユーザー書き込み可能ガード.sys パスは除外ターゲット解決
ツールは、ターゲットを実行可能パスに解決します(--exe、--service、または --pid から)。サービスの場合は、ServiceInfo が現在の PID と状態とともに取得されます。
Procmon キャプチャ
プロセス整合性レベルは、起動直後(プロセスが生きている間)に読み取られ、コンテキストに保存されます。
モジュールごとのフィルタリング解析
各モジュールは、独自の .pmc フィルター(filters/ に保存)を使用して Procmon からのフィルタリングされた CSV エクスポートを要求します。CSV が解析され、一連のゲートが適用されます。
静的相関
com モジュールは、追加の静的パスを実行します。ターゲットバイナリに埋め込まれた CLSID をスキャンし、それぞれを HKLM および HKCU に対してチェックして、キャプチャウィンドウ中に実行されなかったハイジャック機会を表面化します。これらは [Static Correlation] タグでフラグが付けられます。
レポート
結果はターミナルに(カラーコード付きで)表示され、必要に応じて JSON またはスタンドアロン HTML レポートに書き出されます。
flowchart TB
%% Phase 1
subgraph Phase1["Phase 1: Target & Runtime Discovery"]
TR["Target Resolver<br/>--exe / --service / --pid"] -->
IL["Integrity Gate<br/>Medium-IL launch / Service restart"] -->
PM["Procmon Engine<br/>Runtime FS / Reg / Pipe events"]
end
%% Phase 2
subgraph Phase2["Phase 2: Signal Reduction"]
direction LR
PF["Per-Module PMC Filters<br/>High-signal traces only"] -->
CSV["Filtered CSV Export"]
end
%% Phase 3
subgraph Phase3["Phase 3: Exploitability Gates"]
HG["Hard Gates<br/>High-Integrity target<br/>Not protected path"] -->
ACL["AccessChk Validation<br/>Writable by standard user"] -->
LG["Logic Gates<br/>Module-specific rules"]
end
%% Phase 4
subgraph Phase4["Phase 4: Correlation"]
RT["Runtime Findings"]
ST["Static Correlation<br/>COM: CLSID binary scan / registry"]
end
%% Phase 5
subgraph Phase5["Phase 5: Reporting"]
SV["Severity Engine<br/>P1–P5"] --> OUT["Console Output"]
SV --> JSON["JSON Report"]
SV --> HTML["HTML Report"]
end
%% Cross-phase flow
PM --> PF
CSV --> HG
LG --> RT
ST -.-> RT
RT --> SV
%% Styling
classDef p1 fill:#0f2a44,stroke:#4cc9f0,color:#e6f1ff
classDef p2 fill:#2b193d,stroke:#f72585,color:#fde8f3
classDef p3 fill:#1f2d1c,stroke:#7ae582,color:#eaf7ea
classDef p4 fill:#3a1f1f,stroke:#ffb703,color:#fff3d6
classDef p5 fill:#0b2e2a,stroke:#00f5d4,color:#e6fffb
class Phase1 p1
class Phase2 p2
class Phase3 p3
class Phase4 p4
class Phase5 p5
linkStyle default stroke:#9aa4b2,stroke-width:2pxすべての Procmon ベースのモジュールには、filters/ ディレクトリに対応する .pmc フィルターファイルが必要です(フィルター 参照)。
Anvil は初回実行時に 2 つの依存関係を自動インストールします。手動でインストールすることもできます。
pip install rich pefile
pip install rich>=13.0 pefile>=2023.2.7
Anvil は 3 つの Sysinternals バイナリを使用します。
Anvil は実行のたびに、以下の優先順位で各ツールを解決します。
--procmon、--handle、または --accesschk(下記参照)HKCU\Software\Anvil(初回解決成功時に書き込まれます)live.sysinternals.com から取得し、%LOCALAPPDATA%\Anvil\sysinternals\ に保存ツールがどの経路でも解決されると、そのパスがレジストリキャッシュに書き込まれます。以降の実行では手順 1~3 を完全にスキップし、キャッシュされたパスを直接使用します。
ツールをダウンロードできない場合(インターネットなし、ファイアウォール、プロキシ)、Anvil は構造化エラーを表示して即座に終了します。不足しているツールと使用するフラグを示すエラーメッセージが表示されます。
任意のバイナリへのパスをフラグで指定します。Anvil はそれを %LOCALAPPDATA%\Anvil\sysinternals\ にコピーし、パスをレジストリキャッシュに書き込みます。初回実行後はフラグを再度使用する必要はありません。
python anvil.py --exe "C:\App\target.exe" --procmon "D:\Tools\Procmon64.exe" --handle "D:\Tools\handle.exe" --accesschk "D:\Tools\accesschk.exe"
# リポジトリをクローン
git clone https://github.com/shellkraft/Anvil.git
cd Anvil
# 実行 — 依存関係は初回スキャン時に自動インストール
python.exe anvil.py
ヒント: Anvil を実行する前に、ターミナルを管理者として実行で起動してください。
PyInstaller が必要です(pip install pyinstaller):
python -m PyInstaller --onefile --console --add-data "filters;filters" --add-data "modules/logo.png;." --icon .\modules\logo.ico --name Anvil anvil.py
出力バイナリは dist\Anvil.exe にあります。ターゲットマシンに Python のインストールは必要ありません。
注意: Windows SmartScreen は、署名されていないため、コンパイルされた実行可能ファイルの初回実行をブロックする可能性があります。
プリビルドの Anvil.exe は Releases ページで入手できます。もしインターネットからのランダムバイナリを信頼するという脅威モデルをお持ちであれば。
| バージョン | SHA-256 | VirusTotal |
|---|---|---|
| V1.0.0 | 0ecf5a62... | 4/72 |
SHA-256 は
certutil -hashfile Anvil.exe SHA256(Windows)またはsha256sum Anvil.exe(Linux)で確認できます。
python anvil.py [--exe PATH | --service NAME | --pid PID] [options]
| フラグ | 説明 |
|---|---|
--exe PATH | ターゲット実行可能ファイル。Procmon キャプチャのために Medium IL で起動されます。 |
--service NAME | Windows サービス名。実行可能ファイルはレジストリから解決され、起動をキャプチャするためにサービスが再起動されます。 |
--pid PID | すでに実行中のプロセスにアタッチします。Procmon は進行中のアクティビティをキャプチャします。 |
| フラグ | デフォルト | 説明 |
|---|---|---|
--modules LIST | all | 実行するモジュールのカンマ区切りリスト。 |
モジュール名: dll、com、registry、binary、configs、installdir、memory、symlink、unquoted、pesec、pipes
| フラグ | デフォルト | 説明 |
|---|---|---|
--procmon-runtime SEC | 30 | Procmon キャプチャウィンドウ(秒)。起動の遅いアプリケーションでは増やしてください。 |
デスクトップアプリケーションの基本スキャン:
python anvil.py --exe "C:\Program Files\MyApp\myapp.exe" --report report.html
起動の遅いアプリケーションのための長いキャプチャウィンドウ:
python anvil.py --exe "C:\Program Files\MyApp\myapp.exe" --procmon-runtime 60 --scan-install-dir
Windows サービスをターゲットにする:
python anvil.py --service MyAppSvc --modules dll,binary,unquoted,registry
すでに実行中のプロセスにアタッチ:
python anvil.py --pid 4872 --report report.html --verbose
特定のモジュールのみ実行:
python anvil.py --exe "C:\App\app.exe" --modules dll,symlink,unquoted
プロセスメモリをスキャンして追加のカスタム文字列を検索:
python anvil.py --exe "C:\App\app.exe" --modules memory --memory-strings "InternalSecret,DevPassword"
エアギャップマシン — Sysinternals を手動で提供(一度コピーされます):
python anvil.py --exe "C:\App\app.exe" --procmon "E:\Sysint\Procmon64.exe" --handle "E:\Sysint\handle.exe" --accesschk "E:\Sysint\accesschk.exe"
重大度に応じて色分けされ、オプションで --verbose 詳細ブロックが表示されます。rich パッケージが必要です(自動インストール)。
--report findings.json)機械可読な検出結果オブジェクトの配列:
[
{
"severity": "P1",
"module": "DLL Hijacking",
"message": "[System→User] Phantom DLL: version.dll",
"detail": "DLL name : version.dll\nAttempted : C:\\ProgramData\\MyApp\\version.dll\n..."
}
]
--report report.html) [推奨]自己完結型の単一ファイルレポート。以下を含みます。
すべての .pmc フィルターファイルはリポジトリの filters/ ディレクトリに含まれています。セットアップは不要です。Procmon ベースのモジュールは自動的にそれらを取得します。
フィルターファイルが失われたり破損した場合は、上記のルールを使用して Procmon で再作成します。Filter → Filter… で条件を設定し、File → Export Configuration… で filters/<name>.pmc に保存します。
Anvil は次回のモジュール実行時に自動的に .pmc ファイルを取得します。
Anvil は、セキュリティ研究、バグ報奨金プログラム、および許可された侵入テストのためのものです。自分が所有しているか、明示的な書面による許可を得ているシステムでのみ使用してください。
運用上の注意
| 機能 | AnviL | Spartacus | Robber | winPEAS | Procmon |
|---|
| 自動探索 | ✅ | ✅ | ✅ | ✅ | ❌ |
| ランタイム検証による探索 | ✅ | ❌ | ❌ | ❌ | ✅ |
| ファントム DLL 検出 | ✅ | ✅ | ❌ | ❌ | ◐ |
| 検索順序を考慮した分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| ACL ベースの書き込み可能性検証 | ✅ (AccessChk) | ◐ | ◐ | Basic | ❌ |
| モジュールごとの信号フィルタリング | ✅ (.pmc filters) | ❌ | ❌ | ❌ | ❌ |
| 誤検出排除(ゲート付きパイプライン) | ✅ | ❌ | ❌ | ❌ | ❌ |
| サービス再起動と PID 再取得 | ✅ | ❌ | ❌ | ❌ | ❌ |
| Medium-IL ユーザーシミュレーション | ✅ | ❌ | ❌ | ❌ | ❌ |
| DLL ハイジャック(シッククライアント対応) | ✅ | ❌ | ❌ | ◐ | ❌ |
| COM ハイジャック相関 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 名前付きパイプ ACL / 偽装分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| シンボリックリンク / ジャンクション悪用検出 | ✅ | ❌ | ◐ | ◐ | ❌ |
| メモリ内秘密情報(稼働中プロセススキャン) | ✅ | ❌ | ❌ | ◐ | ❌ |
| PE セキュリティ / 緩和策分析 | ✅ | ❌ | ❌ | ◐ | ❌ |
| 特権昇格評価(悪用手法を除く) | ✅ | ✅ | ✅ | ❌ | ❌ |
| 自動悪用 | ❌ | ✅ | ✅ | ❌ | ❌ |
| 信頼性 / 重大度スコアリング | ✅ (P1–P5) | ❌ | ❌ | ❌ | ❌ |
| ターゲット固有分析 (exe / svc / pid) | ✅ | ❌ | ❌ | ❌ | ✅ |
| 構造化レポート (JSON / HTML) | ✅ | ❌ | ❌ | TXT | ❌ |
| 自己完結型バイナリ配布 | ✅ | ✅ | ✅ | ✅ | ✅ |
| モジュール | フラグ | チェック内容 |
|---|
| DLL ハイジャック | dll | .dll の CreateFile イベント — 書き込み可能なディレクトリ内のファントム DLL およびロードされた DLL |
| COM ハイジャック | com | 標準ユーザーが書き込み可能な COM サーバーレジストリキー;ProgID のバイナリスキャン |
| バイナリハイジャック | binary | .exe の CreateFile イベント — ファントム EXE の配置および書き込み可能な EXE ディレクトリ |
| 安全でない設定 | configs | 書き込み可能なディレクトリからの設定ファイルアクセス(.ini、.xml、.json、.yaml など) |
| インストールディレクトリ | installdir | ルート ACL、昇格マニフェスト EXE、および書き込み可能なサブディレクトリ |
| メモリ文字列 | memory | 稼働中プロセスのメモリをスキャンして資格情報、トークン、API キー、JWT、接続文字列を検出 |
| シンボリックリンク攻撃 | symlink | ユーザー書き込み可能な temp / appdata パス内のジャンクションおよびシンボリックリンクベクトル |
| 引用符なしサービスパス | unquoted | 中間のファントムディレクトリが書き込み可能な引用符なし ImagePath を持つサービス |
| レジストリ特権昇格 | registry | 標準ユーザーが書き込み可能で、サービス/アプリケーションの動作を制御するレジストリキー |
| PE セキュリティフラグ | pesec | ターゲットバイナリの ASLR、DEP、CFG、SafeSEH、Authenticode の欠落 |
| 名前付きパイプ ACL | pipes | 許容的な DACL または偽装可能な ACE を持つ名前付きパイプ |
| バイナリ | 使用モジュール | ダウンロード |
|---|
Procmon64.exe | すべての Procmon ベースのモジュール | ProcessMonitor.zip |
handle.exe | 名前付きパイプ ACL モジュール | Handle.zip |
accesschk.exe | 名前付きパイプ ACL モジュール — パイプ DACL 列挙 | AccessChk.zip |
| フラグ | 説明 |
|---|
--procmon PATH | Procmon64.exe へのパス。%LOCALAPPDATA%\Anvil\sysinternals\ にコピーされます。 |
--handle PATH | handle.exe へのパス。%LOCALAPPDATA%\Anvil\sysinternals\ にコピーされます。 |
--accesschk PATH | accesschk.exe へのパス。%LOCALAPPDATA%\Anvil\sysinternals\ にコピーされます。 |
| フラグ | デフォルト | 説明 |
|---|
--report FILE | — | レポートを生成 — 拡張子が形式を決定します:.json は JSON、.html(またはその他)は自己完結型 HTML レポート。 |
--verbose | off | ターミナルに検出結果の詳細ブロックを表示します。 |
--no-color | off | ANSI カラー出力を無効にします。 |
--skip-authenticode | off | Authenticode 署名チェックをスキップします(大規模なインストールディレクトリで高速)。 |
--scan-install-dir | off | インストールディレクトリ内のすべての DLL を PE セキュリティチェックに含めます。 |
--memory-strings STR,... | — | プロセスメモリ内で検索する追加のカンマ区切り文字列。 |
| レベル | ラベル | 一般的な CVSS | 意味 |
|---|
| P1 | クリティカル | 8.0 – 8.8 | 自動トリガーされる権限昇格(ユーザー操作不要) |
| P2 | 高 | 7.0 – 7.9 | ユーザー操作または弱いトリガーで悪用可能 |
| P3 | 設定ミス | 4.0 – 6.9 | 引用符なしパス、緩和策の欠落 — 直接悪用不可 |
| P4 | 低影響 | 0.1 – 3.9 | 現実世界での影響が限定的な情報ベクトル |
| P5 | 情報 | N/A | コンテキストと観察結果であり、脆弱性ではない |
| ファイル | モジュール | 主要フィルタールール |
|---|
filters/dll.pmc | DLL ハイジャック | Operation is CreateFile、Path ends with .dll |
filters/binary.pmc | バイナリハイジャック | Operation is CreateFile、Path ends with .exe |
filters/config.pmc | 安全でない設定 | Operation is CreateFile(コード内で拡張子フィルター) |
filters/com.pmc | COM ハイジャック | Operation is RegQueryKey、Path contains HKLM |
filters/symlink.pmc | シンボリックリンク攻撃 | Operation is CreateFile |