面向 Windows 胖客户端的运行时优先权限提升与攻击面评估工具。
Anvil 是一款面向 Windows 胖客户端应用程序的运行时优先权限提升与攻击面评估工具。它并非盲目扫描文件系统,而是将 Procmon 捕获与 Windows AccessCheck 相结合,仅报告运行时实际观察到 并且 经确认可由标准用户写入的路径,从而消除了通用枚举工具中普遍存在的误报噪音。
大多数胖客户端评估工具仅覆盖一两种攻击类别。Anvil 的设计理念是:运行时观察、ACL 验证的可利用性以及广泛的攻击面应整合在同一目标运行中,并采用分级管道确保输出结果具备可操作性。
每个候选路径在报告前需依次通过四道关卡。
硬性关卡
AccessCheck API 验证模块逻辑关卡
Supersede、OverwriteIf 等)+ 跨用户可写入保护.sys 路径目标解析
工具将目标解析为可执行文件路径(通过 --exe、--service 或 --pid)。如果是服务,则获取 ServiceInfo 并记录当前 PID 和状态。
Procmon 捕获
进程完整性等级在启动后立即(进程存活时)读取并存储在上下文中。
按模块过滤分析
每个模块使用自己的 .pmc 过滤器(存储在 filters/ 中)请求 Procmon 导出一个经过滤的 CSV。解析 CSV 后,应用一系列关卡:
静态关联
com 模块执行额外的静态扫描——扫描目标二进制中嵌入的 CLSID,并逐一检查 HKLM 和 HKCU——以发现捕获窗口期间未触发的劫持机会。这些结果带有 [静态关联] 标签。
报告
结果打印到终端(带颜色编码),并可选择输出为 JSON 或独立的 HTML 报告。
flowchart TB
%% Phase 1
subgraph Phase1["阶段 1:目标与运行时发现"]
TR["目标解析器<br/>--exe / --service / --pid"] -->
IL["完整性关卡<br/>Medium-IL 启动 / 服务重启"] -->
PM["Procmon 引擎<br/>运行时 FS / Reg / Pipe 事件"]
end
%% Phase 2
subgraph Phase2["阶段 2:信号缩减"]
direction LR
PF["按模块 PMC 过滤器<br/>仅高信号轨迹"] -->
CSV["过滤后的 CSV 导出"]
end
%% Phase 3
subgraph Phase3["阶段 3:可利用性关卡"]
HG["硬性关卡<br/>高完整性目标<br/>非受保护路径"] -->
ACL["AccessChk 验证<br/>标准用户可写入"] -->
LG["逻辑关卡<br/>模块特定规则"]
end
%% Phase 4
subgraph Phase4["阶段 4:关联"]
RT["运行时发现"]
ST["静态关联<br/>COM:CLSID 二进制扫描 / 注册表"]
end
%% Phase 5
subgraph Phase5["阶段 5:报告"]
SV["严重等级引擎<br/>P1–P5"] --> OUT["控制台输出"]
SV --> JSON["JSON 报告"]
SV --> HTML["HTML 报告"]
end
%% 跨阶段流程
PM --> PF
CSV --> HG
LG --> RT
ST -.-> RT
RT --> SV
%% 样式
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 在首次运行时自动安装其两个依赖项。您也可以手动安装:
pip install rich pefile
pip install rich>=13.0 pefile>=2023.2.7
Anvil 使用三个 Sysinternals 二进制文件。
每次运行时,Anvil 按以下优先级解析每个工具:
--procmon、--handle 或 --accesschk(见下文)HKCU\Software\Anvil(首次成功解析时写入)where 式搜索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] [选项]
| 标志 | 描述 |
|---|---|
--exe PATH | 目标可执行文件。以 Medium IL 启动以进行 Procmon 捕获。 |
--service NAME | Windows 服务名称。从注册表解析 EXE;重新启动服务以捕获启动过程。 |
--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 劫持",
"message": "[系统→用户] 幻影 DLL: version.dll",
"detail": "DLL 名称 : version.dll\n尝试路径 : C:\\ProgramData\\MyApp\\version.dll\n..."
}
]
--report report.html)[推荐]自包含的单文件报告,包含:
所有 .pmc 过滤器文件均包含在仓库的 filters/ 目录中——无需额外设置。基于 Procmon 的模块将自动加载它们。
如果过滤器文件丢失或损坏,请使用上述规则在 Procmon 中重新创建:依次选择 过滤器 → 过滤器… 配置条件,然后 文件 → 导出配置… 并保存到 filters/<名称>.pmc。
下次运行该模块时,Anvil 将自动加载该 .pmc 文件。
Anvil 专为安全研究、漏洞赏金狩猎和授权的渗透测试而设计。请仅在你拥有所有权或已获得明确书面许可的系统上使用它。
操作注意事项
| 特性 | AnviL | Spartacus | Robber | winPEAS | Procmon |
|---|
| 自动化发现 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 运行时验证的发现 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 幻影 DLL 检测 | ✅ | ✅ | ❌ | ❌ | ◐ |
| 搜索顺序感知分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 基于 ACL 的可写性验证 | ✅ (AccessChk) | ◐ | ◐ | 基本 | ❌ |
| 按模块信号过滤 | ✅ (.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 | 用户可写的临时 / 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 | 关闭 | 在终端中打印完整发现详情块。 |
--no-color | 关闭 | 禁用 ANSI 颜色输出。 |
--skip-authenticode | 关闭 | 跳过 Authenticode 签名检查(适用于大型安装目录的场景,可提高速度)。 |
--scan-install-dir | 关闭 | 在 PE 安全检查中包含安装目录中的所有 DLL。 |
--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 劫持 | 操作是 CreateFile,路径以 .dll 结尾 |
filters/binary.pmc | 二进制劫持 | 操作是 CreateFile,路径以 .exe 结尾 |
filters/config.pmc | 不安全配置 | 操作是 CreateFile(扩展名过滤在代码中) |
filters/com.pmc | COM 劫持 | 操作是 RegQueryKey,路径包含 HKLM |
filters/symlink.pmc | 符号链接攻击 | 操作是 CreateFile |