HookChain: 深入解析高级 EDR 绕过技术
HookChain 是一种新型技术,通过利用底层 Windows API 并操控系统调用与用户态钩子的交互方式,来绕过终端检测与响应(EDR)解决方案。让我们通过实际案例深入了解 HookChain 的运作机制。
函数钩子与 EDR 监控的运作机制
现代 EDR 解决方案通常在 NTDLL.DLL
层面监控 Windows API 调用,因为这个 DLL 是用户态应用程序和内核之间的桥梁。例如,当应用程序需要分配内存时,它会调用 NtAllocateVirtualMemory
函数,EDR 解决方案可以通过钩住这个函数来监控或阻止恶意活动。
传统 EDR 钩子示例
在典型的 EDR 监控环境中,过程是这样的:
-
恶意软件尝试通过调用 NtAllocateVirtualMemory
来分配内存。 -
EDR 已在 NTDLL.DLL
中钩住了NtAllocateVirtualMemory
。这个钩子会拦截函数调用并将其转发给 EDR 进行检查。 -
如果 EDR 检测到可疑行为,可能会阻止函数调用或施加限制后再允许。 -
然后函数继续传递到内核并返回结果。
HookChain 通过操控调用过程来打破这个流程。
HookChain 实战:绕过钩子
在 HookChain 中,攻击者不会直接调用被 EDR 监控的 NtAllocateVirtualMemory
。相反,他们使用间接系统调用和动态 SSN 映射来规避检测。
第一步:SSN(系统服务号)映射
Windows 中的每个系统调用都有一个相关联的系统服务号(SSN),用于在系统服务描述符表(SSDT)中识别该系统调用。HookChain 会动态映射这些 SSN。
举例来说:
-
NtAllocateVirtualMemory
有一个对应的 SSN(假设在这种情况下是0x18
) -
HookChain 不直接调用 API,而是映射这个 SSN 并查找实际的内核函数地址
第二步:使用间接系统调用
在这个阶段,HookChain 通过使用 Halo's Gate 或其他技术来识别 NTDLL
中未被钩住的相邻函数,从而绕过被钩住的 NTDLL
函数。
Halo's Gate 示例
假设攻击者想要绕过被 EDR 钩住的 NtAllocateVirtualMemory
,HookChain 会执行以下操作:
-
字节扫描检测钩子:读取
NtAllocateVirtualMemory
的前 32 个字节来检测是否被钩住。如果原始指令序列(mov r10, rcx; mov eax, SSN
)被改变,就认为该函数已被钩住。 -
寻找相邻未钩住函数:HookChain 在
NTDLL
中搜索未被钩住的相邻函数,比如NtQueryInformationProcess
。找到后,计算从NtAllocateVirtualMemory
到这个未钩住函数的相对距离,并使用这个相邻函数的地址来间接执行系统调用。 -
执行系统调用:攻击者现在可以通过未钩住的相邻函数执行系统调用,完全绕过 EDR。
第三步:修改导入地址表(IAT)
HookChain 的核心策略之一是修改关键 DLL(如 kernel32.dll
、kernelbase.dll
等)的导入地址表(IAT)。IAT 存储了指向导入函数的指针,通过覆写这些指针,HookChain 确保 API 调用能绕过 EDR 的钩子。
IAT 钩子示例
-
确定目标 DLL:假设攻击者知道目标应用程序使用
kernel32.dll
来进行系统调用(如ReadFile
或WriteFile
),这些调用最终会调用NTDLL
函数(如NtReadFile
和NtWriteFile
)。 -
钩住 IAT:HookChain 修改
kernel32.dll
中ReadFile
的 IAT 条目,使其指向 HookChain 的自定义处理程序而不是原始函数。这个处理程序随后执行间接系统调用(绕过 EDR)来调用原始的NTDLL
函数。 -
执行攻击:应用程序继续调用
ReadFile
,但不知道其 IAT 条目已被钩住。被钩住的 IAT 条目将函数重定向到 HookChain 的处理程序,确保系统调用在不被 EDR 拦截的情况下执行。
HookChain 执行流程的技术剖析
让我们深入分析一个具体的攻击场景:
-
HookChain 植入:
-
攻击者首先将必要的 DLL 加载到进程空间(如 kernel32.dll
和ntdll.dll
) -
HookChain 通过读取 NTDLL
中的函数字节来检查函数钩子,以检测任何 EDR 钩子 -
使用动态映射来映射关键系统调用(如 NtAllocateVirtualMemory
)的 SSN -
构建 SYSCALL_LIST:HookChain 构建一个数组 SYSCALL_LIST,每个条目包含:
-
每个关键函数的 SSN(系统服务号) -
对应函数在 NTDLL
中的虚拟地址 -
用于间接系统调用的 SYSCALL 指令地址 -
通过 IAT 重定向:一旦 IAT 中的函数指针被钩住,HookChain 确保所有对关键 API 的调用(如
ReadFile
或VirtualAlloc
)都重定向到它自己的处理程序。这个处理程序确保系统调用是间接执行的,不会经过原始的、被钩住的NTDLL
函数。 -
透明执行流程:在 HookChain 植入完成后,EDR 看到的是正常的执行流程。例如:
-
函数调用看起来像是正常地从 kernel32.dll
到ntdll.dll
-
但实际上,HookChain 拦截了调用,绕过了 NTDLL
钩子,通过相邻未钩住的函数执行了系统调用
按照这些步骤,我们成功实现了 shellcode 注入
实战测试
这是我们使用 HookChain 技术的 shellcode 注入器的测试结果
真实案例研究:Lazarus 组织与 HookChain 技术
高级持续性威胁(APT)组织,如 Lazarus 组织,已经被发现使用了与 HookChain 类似的技术。在 2021 年的一次攻击中,Lazarus 使用了他们恶意软件工具包的一个变种,通过使用直接系统调用来绕过内核和用户态的 EDR 监控。
HookChain 更进一步,利用动态系统调用映射和相邻函数调用来规避检测。在部署了 CrowdStrike 或 SentinelOne 等 EDR 产品的环境中,HookChain 绕过 NTDLL 钩子的能力已被证明能有效规避检测,使攻击者能不被干扰地执行他们的操作。
高级绕过机制:HookChain 与 SysWhispers 的比较
SysWhispers 是另一种旨在通过直接调用系统调用来绕过被钩住的 Windows API 的技术。然而,HookChain 通过动态 SSN 映射和相邻函数重定向来区分自己,这使得它在多个函数被钩住或 Windows 版本之间系统调用号发生变化的情况下更具适应性。
虽然 SysWhispers 依赖预定义的系统调用号和静态系统调用存根,但 HookChain 可以实时动态调整其方法。这使得 HookChain 在 EDR 解决方案监控多个 API 或钩住内核态函数的场景中更具韧性。
EDR 与 HookChain 的未来发展
随着HookChain被威胁行为者更广泛地采用,EDR 解决方案需要与时俱进。一个有前景的发展方向是基于虚拟机监控器的监控,它能在系统调用到达操作系统内核之前拦截并分析它们。人工智能(AI)和机器学习模型也将变得至关重要,因为它们可以基于静态检测方法可能遗漏的细微异常来学习识别可疑的系统调用行为。
此外,基于行为的系统调用分析可能成为一个关键的防御手段,使 EDR 不仅能跟踪系统调用,还能理解它们的上下文和流程。这将使得像 HookChain 这样的技术在不引起警报的情况下规避检测变得更加困难。
EDR 解决方案面临的挑战
EDR 系统通常依赖于放置在用户态 API(如 NTDLL)中的钩子来监控和阻止恶意活动。然而,许多 EDR 并未对 NTDLL 进行全面监控,使某些钩子容易被 HookChain 这样的绕过技术利用。94% 的被分析的 EDR 解决方案在 NTDLL 之上的子系统层没有设置钩子。
这留下了一个可被攻击者利用的重大漏洞。
注:来自 Helvio Carvalho Junior 的论文
结论:军备竞赛仍在继续
HookChain 展示了 EDR 绕过技术的最新进展,证明了攻击者在不断创新新技术来绕过即便是最先进的防御系统。随着组织越来越依赖高级安全解决方案,保持在这些新兴技术前沿的需求从未如此迫切。防御者必须结合内核级监控、行为分析和持续的威胁情报来在这个不断变化的战场上保持领先。
归根结底,网络安全就是一场猫鼠游戏,当防御者适应了 HookChain 这样的技术时,攻击者无疑会设计出更具创造性的方法来达成他们的目标。
参考文献
Helvio Carvalho Junior. 2024. HookChain(https://arxiv.org/abs/2404.16856
):我在这项基础研究的基础上进行了扩展,增加了更多实现方案和改进以增强原有方法。
注:本工作基于 Helvio Carvalho Junior. 2024. HookChain 的基础概念,同时引入了多项改进和额外的实现方案来增强原始方法。这些改进包括:
增强的钩子规避技术:除了导入地址表(IAT)操作和间接系统调用外,我们还探索了更多规避策略,解决了一些 EDR 解决方案的内核态检查盲点。 被钩住函数的动态解析替代方法:在利用 Halo's Gate 的同时,我们还引入了其他 SSN(系统服务号)解析方法,如自定义哈希和 Heaven's Gate,以进一步降低被检测的可能。 高级 DLL 加载机制:引入了分段或随机加载技术来避免基于行为的检测,通过时间和变化来增强规避能力。 API 级混淆增强:在间接系统调用的基础上,加入了多层混淆,如参数加密,提供了更强的函数调用监控防护。 实时钩子验证和恢复:包含了一个定期验证和恢复未钩住地址的机制,使解决方案能够适应运行时 EDR 监控。 扩展的注入技术:除了 IAT 钩子外,本工作还探索了进程镂空、DLL 镂空和反射式 DLL 注入等方法,扩展了原始研究以涵盖更广泛的规避技术。
这些扩展展示了对突破初始方法局限性的努力,使该技术在面对不断演进的终端检测策略时更加强大和富有韧性。
原文始发于微信公众号(独眼情报):HookChain:深入探究高级 EDR 绕过技术
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论