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技术

实现方式

  1. 在正常EXE中预先加载DLL
  2. 在UDRL(Unhooked Direct Remote Loading)中判断是否已加载
  3. 分叉执行流

优势

  • 调用栈完全合法
  • 不会出现未备份内存的痕迹

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技术

基本原理

  1. 创建一条可告警线程
  2. 插入APC(异步过程调用)
  3. 让当前线程处于可告警状态执行APC函数

技术细节

  • 使用(HANDLE)-2表示当前线程
  • 调用KiUserApcDispatcher

效果

  • 调用栈中存在未备份内存但不匹配规则
  • 绕过直接LoadLibrary的两个告警

3.8 签名利用

观察

  • Elastic规则中有许多排除项
  • 即使调用栈回溯显示未备份内存,特定签名也不会被查杀

4. 其他注意事项

Elastic EDR还有以下严格检测规则需要应对:

  • 进程注入检测
  • API调用序列监控
  • 异常行为分析

5. 总结

本文详细介绍了多种绕过Elastic EDR DLL加载检测的技术,包括但不限于:

  • 代理加载优化
  • 预加载技术
  • 模块替换
  • DNS Beacon技巧
  • URL下载API利用
  • APC线程技术
  • 签名白名单利用

对抗EDR是一个持续的过程,随着检测技术的更新,绕过技术也需要不断创新。读者可以基于这些基础技术发展出更多变种方法。

Elastic EDR规则检测下的对抗技术详解 1. 背景与基本原理 Elastic EDR通过ETWti进行栈回溯检测可疑的DLL加载行为,特别是对网络相关DLL(如ws2_ 32.dll、winhttp.dll、wininet.dll)的加载会进行严格监控。 正常加载与恶意加载的栈回溯区别 正常加载 :调用栈显示从合法模块(如kernel32.dll)发起 恶意加载(C2不做规避) :调用栈显示从未备份内存(unbacked memory)发起 2. Elastic EDR检测规则分析 检测规则位于: 规则特点: 标记了一系列敏感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是一个持续的过程,随着检测技术的更新,绕过技术也需要不断创新。读者可以基于这些基础技术发展出更多变种方法。