自动化的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 --> Phase5IFEO 调试器条目会被枚举,且引用的二进制文件会被分析其 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
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 构建。
| 类型 | 描述 | 隐蔽性 | 状态 |
|---|
| 幻影(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 | 当前工作目录劫持 | 低 | 已计划 — 目前没有任何发现路径会产生此类型 |
| 特性 | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|
| 自动化发现 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 幻影 DLL 检测 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 搜索顺序分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 基于 ACL 的可写性检查 | ✅ | 部分 | ❌ | 基础 | ❌ |
| ETW 实时监控 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 金丝雀确认 | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| 特权提升检查 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 绕过发现 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 误报减少 | ✅² | 无 | 基础 | 无 | 无 |
| 重启持久性检查 | ✅³ | ❌ | ❌ | ❌ | ❌ |
| 代理 DLL 生成 | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| 置信度评分 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 自动触发(服务/任务/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| HTML/JSON 报告 | ✅ | ❌ | ❌ | TXT | ❌ |
| 威胁情报关联 | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| 自动化 PATH 利用 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 目标特定扫描 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 自包含二进制文件 | ✅ | ❌ | ❌ | ✅ | ❌ |
| 配置文件 | 使用场景 | 金丝雀 | ETW | UAC 绕过 | 最低置信度 | 触发器 |
|---|
| aggressive | 全面审计、实验室环境 | ✅ | ✅ | ✅ | 15% | 服务、任务、COM |
| strict | 仅高置信度发现 | ✅ | ✅ | ❌ | 80% | 服务、任务 |
| safe | 生产系统、只读 | ❌ | ❌ | ❌ | 50% | 无 |
| redteam | 仅已确认可利用 | ✅ | ✅ | ❌ | 50% | 服务、任务、COM |
| uac-bypass | 仅 UAC 绕过向量 | ❌ | ❌ | ✅ | 20% | 仅 AutoElevate |