Elastic EDR 规则检测下的对抗
字数 1440 2025-08-30 06:50:11
Elastic EDR规则检测下的对抗技术详解
1. 背景与基本原理
Elastic EDR通过ETWti进行栈回溯检测可疑的DLL加载行为,特别是对网络相关DLL(如ws2_32.dll、winhttp.dll、wininet.dll)的加载会进行严格监控。
正常加载与恶意加载的栈回溯区别
- 正常加载:调用栈显示从合法模块(如kernel32.dll)发起
- 恶意加载(C2不做规避):调用栈显示从未备份内存(unbacked memory)发起
2. Elastic EDR检测规则分析
检测规则位于:
https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/windows/defense_evasion_network_module_loaded_from_suspicious_unbacked_memory.toml
规则特点:
- 标记了一系列敏感DLL
- 回溯调用栈进行匹配检测
- 对特定调用链模式进行告警
3. 绕过技术详解
3.1 BRC4代理加载方法(已修复)
原始方法:
- 通过代理加载敏感DLL
- 参考:https://0xdarkvortex.dev/proxying-dll-loads-for-hiding-etwti-stack-tracing/
问题:
- 调用链中仍包含kernelbase.dll
- 符合Elastic的查杀模式
改进方法:
- 移除调用链中的kernelbase.dll
- 使调用栈看起来更合法
3.2 PreLoad技术
实现方式:
- 在正常EXE中预先加载DLL
- 在UDRL(Unhooked Direct Remote Loading)中判断是否已加载
- 分叉执行流
优势:
- 调用栈完全合法
- 不会出现未备份内存的痕迹
3.3 SpoofCall(堆栈欺骗)
注意事项:
- Elastic有针对堆栈欺骗的检测
- 需要额外绕过措施
3.4 Module Stomping技术
效果:
- 使用UDRL模式时
- 栈回溯显示为合法模块(如Chakra.dll)
3.5 DNSBeacon取巧
原理:
- 使用DNSAPI.dll(不在规则列表中)替代敏感DLL
- 寻找已导入ws2_32.dll的白文件进行patch
缺点:
- DNS上线方式性能较差
- 执行拖取lsass、截图等操作速度慢
- A记录查询模式尤其缓慢
3.6 UrlDownloadToFileA方法
实现参考:
- 菊师傅在Kcon的分享思路
- AtomLdr项目中的技术
具体API:
- UrlMon.dll中的UrlDownloadToFileA
优势:
- 帮助加载DLL而不触发告警
- Elastic EDR不会对此行为告警
3.7 APC技术
基本原理:
- 创建一条可告警线程
- 插入APC(异步过程调用)
- 让当前线程处于可告警状态执行APC函数
技术细节:
- 使用
(HANDLE)-2表示当前线程 - 调用KiUserApcDispatcher
效果:
- 调用栈中存在未备份内存但不匹配规则
- 绕过直接LoadLibrary的两个告警
3.8 签名利用
观察:
- Elastic规则中有许多排除项
- 即使调用栈回溯显示未备份内存,特定签名也不会被查杀
4. 其他注意事项
Elastic EDR还有以下严格检测规则需要应对:
- 进程注入检测
- API调用序列监控
- 异常行为分析
5. 总结
本文详细介绍了多种绕过Elastic EDR DLL加载检测的技术,包括但不限于:
- 代理加载优化
- 预加载技术
- 模块替换
- DNS Beacon技巧
- URL下载API利用
- APC线程技术
- 签名白名单利用
对抗EDR是一个持续的过程,随着检测技术的更新,绕过技术也需要不断创新。读者可以基于这些基础技术发展出更多变种方法。