自动化的DLL劫持发现、验证和确认。将本地错误配置转化为武器化的、已确认的攻击路径。
自动化 DLL 劫持发现、验证与确认
将本地错误配置转化为武器化的、已确认的攻击路径。
DLLHijackHunter 是一款自动化的 Windows DLL 劫持检测工具,超越了静态分析的范畴。它通过多阶段流水线来发现、验证并确认 DLL 劫持机会:
大多数 DLL 劫持工具止步于“这个 DLL 可能可被劫持”。DLLHijackHunter 则尝试对其进行验证,与已知的漏洞利用情报进行交叉比对,并在可能的情况下确认真实的执行路径。
flowchart TB
subgraph Phase1["阶段 1:发现"]
SE["静态引擎<br/>服务、任务、启动项、<br/>COM、运行键"]
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 --> Phase5
| 类型 | 描述 | 隐蔽性 | 状态 |
|---|---|---|---|
| 幻影(Phantom) | DLL 在磁盘上任何位置都不存在 | 高 | 已实现 |
| 搜索顺序(Search Order) | 将 DLL 放置在 Windows 搜索顺序中更靠前的位置 | 高 | 已实现 |
| 侧加载(Side-Loading) | 滥用合法应用程序从其目录加载 DLL 的行为 | 高 | 已实现(AutoElevate 复制到临时目录路径) |
| .local 重定向 | 通过 .local 目录重定向进行劫持 | 高 | 已实现 |
| ENV PATH | 利用系统 PATH 中可写目录进行武器化 | 高 | 已实现(精选服务/DLL 映射) |
| AppInit DLL | AppInit_DLLs 注册表滥用 | 低 | 已实现 |
| AppCert DLL | AppCertDLLs 注册表滥用(加载到每个 CreateProcess/WinExec 调用者中) | 低 | 已实现 |
| CWD | 当前工作目录劫持 | 低 | 已计划 — 目前没有任何发现路径会产生此类型 |
IFEO 调试器条目会被枚举,且引用的二进制文件会被分析其 DLL 导入,但没有专门的 IFEO/KnownDLL 绕过劫持类型 — 这些不会作为独立检测进行宣传。
DLLHijackHunter 包含专门的 UAC 绕过发现功能:
System32 和 SysWOW64 中嵌入清单包含 <autoElevate>true</autoElevate> 的 EXEHKLM\SOFTWARE\Classes\CLSID 中 Elevation\Enabled=1 的 COM 对象SetDllDirectory 或 SetDefaultDllDirectories 的 AutoElevate 二进制文件,模拟“将 EXE 复制到可写文件夹 + 投放 DLL”的攻击路径Resources/hijacklibs.json。匹配会提升置信度并将发现链接到其 HijackLibs 参考页面;没有匹配则无影响。该数据集是数据驱动的 — 通过重新下载 https://hijacklibs.net/api/hijacklibs.json 覆盖该资源即可刷新(无需更改代码)。数据集 © HijackLibs 项目及其贡献者。PATH 文件夹,并为精选的原生 Windows 服务映射生成劫持候选,这些服务已知会搜索 PATH 以查找缺失的 DLL该流水线通过两个阶段减少误报:
硬门控
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),因此一个二进制文件即可服务于所有候选。扫描器从部署路径计算相同的哈希并轮询该文件。捆绑的二进制文件由 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 候选使用不同的机制,并报告为已跳过(Skipped)。# 使用加载器验证搜索顺序的标准用户分类(无金丝雀、无 ETW)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
| 特性 | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|---|---|---|---|---|
| 自动化发现 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 幻影 DLL 检测 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 搜索顺序分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 基于 ACL 的可写性检查 | ✅ | 部分 | ❌ | 基础 | ❌ |
| ETW 实时监控 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 金丝雀确认 | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| 特权提升检查 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 绕过发现 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 误报减少 | ✅² | 无 | 基础 | 无 | 无 |
| 重启持久性检查 | ✅³ | ❌ | ❌ | ❌ | ❌ |
| 代理 DLL 生成 | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| 置信度评分 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 自动触发(服务/任务/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| HTML/JSON 报告 | ✅ | ❌ | ❌ | TXT | ❌ |
| 威胁情报关联 | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| 自动化 PATH 利用 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 目标特定扫描 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 自包含二进制文件 | ✅ | ❌ | ❌ | ✅ | ❌ |
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