UDRL -> Set Eaf_Bypass "true"
字数 1639 2025-08-29 22:41:10
Cobalt Strike 4.11 EAF Bypass与UDRL技术详解
1. EAF机制概述
EAF (Export Address Filtering) 是Windows Defender引入的一种安全机制,通过将PAGE_GUARD应用到特定DLL的内存区域来防止恶意代码执行。当EAF启用时:
- 关键DLL的内存空间会被标记为PAGE_GUARD属性
- 触发PAGE_GUARD异常时,PayloadRestrictions.dll注册的VEH(向量化异常处理)会接管
- VEH会检查当前RIP/EIP是否在未备份内存或可疑gadget上
- 如果检测到可疑行为,进程将被终止
2. CS4.11的EAF_Bypass功能
Cobalt Strike 4.11引入了EAF_Bypass功能,通过设置Set Eaf_Bypass "true"可以绕过EAF保护:
- 原理是利用DLL中的合法gadget进行内存读写操作
- 避免直接访问受保护内存区域
- 需要精心选择不会触发EAF+检测的gadget
3. UDRL技术详解
UDRL (User Defined Reflective Loader) 是CS4.4引入的功能,允许用户自定义反射加载器:
3.1 UDRL核心功能
- 完全控制beacon加载beacon.dll的行为
- 可自定义API调用和行为控制
- 提供更大的灵活性和规避能力
3.2 UDRL与EAF Bypass的结合
在实现EAF绕过时,UDRL需要处理以下关键点:
-
导出表访问:
- 不仅AddressOfFunctions需要gadget读写
- 导出表的VA也受EAF保护
- 建议将三个数组(AddressOfFunctions, AddressOfNames, AddressOfNameOrdinals)及导入表读取操作全部使用gadget
-
Spoof Call技术:
- 直接API调用可能触发Elastic EDR等检测
- 需要实现堆栈欺骗
- 寻找gadget时也要注意EAF规则
3.3 实现要点
- 在
Library\FunctionResolving.cpp中修改函数解析逻辑 - 使用内存中的合法gadget代替直接内存访问
- 确保gadget选择不会触发EAF+检测
- 实现完整的调用链欺骗
4. 实践步骤
4.1 环境配置
- 启用Windows Defender的EAF保护
- 配置Cobalt Strike 4.11+
- 在配置文件中设置
Set Eaf_Bypass "true"
4.2 UDRL实现
-
Gadget查找:
- 扫描内存寻找合适的读写gadget
- 避免使用会触发EAF+的gadget
- 示例gadget模式:
mov reg, [reg] ret
-
导出表处理:
- 重写导出表访问逻辑
- 使用gadget链代替直接内存读取
-
调用欺骗:
- 实现Spoof Call机制
- 构造合法的调用栈
- 使用ROP技术隐藏真实调用来源
4.3 测试验证
- 在Win10/Win11不同版本测试
- 验证是否触发PAGE_GUARD异常
- 检查EDR检测情况(特别是Elastic EDR)
- 确保后续操作不会被检测
5. 对抗EDR的进阶技巧
- 模块伪装:使用Module Stomping技术
- 调用链混淆:结合多种gadget使用
- 行为分散:将敏感操作分散到不同线程
- 时序混淆:加入随机延迟避免模式识别
6. 参考资源
7. 注意事项
- 不同Windows版本可能需要调整gadget
- EAF规则可能随Windows更新而变化
- 对抗EDR需要持续更新技术
- 仅用于合法授权测试
通过结合CS4.11的EAF_Bypass功能和UDRL的自定义能力,可以实现更高级的规避技术,但需要注意这些技术可能被EDR厂商持续更新检测方式。