综合来源:
现代 EDR(端点检测与响应)的工作模式依赖持续的双向云端通信:
1 | 端点 EDR Agent ←────→ 云端管理控制台 |
EDR Silencing 的核心思路:不终止 EDR 进程,不触碰内核驱动,只切断这条通信链路。
效果:
为什么叫 “Silencing” 而不是 “Killing”?
进程还活着,只是嘴被捂住了。对防御方来说,这比杀掉进程更危险——杀进程会触发告警,但静默不会。
| 时间 | 事件 |
|---|---|
| 早期勒索软件时代 | 使用内核驱动(Ring 0)直接中断 EDR 通信,需要驱动签名,风险高,可能 BSOD |
| 2023年 | MDSec 披露内部工具 FireBlock,首次公开使用 WFP 用户态方案实现 EDR Silencing |
| 2023年后 | 社区基于此思路开发大量 PoC:EDRSilencer、SilentButDeadly、WFP_EDR、EDRSandblast 等 |
关键转变:从内核态 → 用户态,从需要驱动签名 → 只需本地管理员权限。
这是理解整个技术的基础。
1 | ┌─────────────────────────────────────┐ |
你作为攻击者只需要:
你不需要:
| 维度 | 内核驱动(旧方法) | 用户态 WFP(新方法) |
|---|---|---|
| 权限要求 | SYSTEM + 驱动签名 | 本地管理员 |
| 技术门槛 | 极高 | 中等 |
| 稳定性风险 | 可能 BSOD | 几乎没有 |
| 检测面 | 驱动加载事件 | WFP Event ID |
| BYOVD 需求 | 通常需要 | 不需要 |
| 工具代表 | 早期勒索软件 | EDRSilencer |
所有方法均需要本地管理员权限。
原理:Windows Defender 防火墙本质上也是通过 WFP 实现的,但规则通过不同接口写入。
工具:
netsh advfirewall 命令行工具INetFwRule / INetFwRules COM 接口(EDRSandblast 使用此方式)规则存储位置(注册表):
1 | HKLM\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{GUID} |
规则数据格式(REG_SZ 字符串):
1 | v2.32|Action=Block|Active=TRUE|Dir=Out|App=C:\...\MsSense.exe|Name=BlockEDR| |
关键字段:
Action — Block 或 AllowActive — 规则是否激活Dir — In(入站)或 Out(出站)App — 目标进程路径注意:Windows Defender 开启时会阻止对
MsMpEng.exe创建防火墙规则,但对其他 EDR 产品无此保护。
这是 EDR Silencing 的核心技术,也是最隐蔽的方式。
| 类型 | 生命周期 | 攻击者偏好 |
|---|---|---|
| Dynamic | 会话结束即删除 | 低 |
| Static | 手动删除前持续存在 | 中 |
| Persistent | 重启后依然存在,直到显式删除 | 高 |
| Built-in | 系统内置 | — |
执行步骤(底层 API 调用流程):
1 | // Step 1: 枚举进程,匹配已知 EDR 进程名 |
EDRSilencer 实际添加的 4 个 Layer(同时阻断 IPv4/IPv6 出入站):
1 | FWPM_LAYER_ALE_AUTH_CONNECT_V4 ← 出站 IPv4 连接授权 |
WFP Filter 存储位置(注册表):
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE\Parameters\Policy\Persistent\Filter\{GUID} |
注意:Filter 数据以 REG_BINARY 字节数组存储,不是可读字符串,解析较复杂。
Provider 本质是元数据标签,用于归组管理 Filter,对过滤行为本身无影响。EDRSilencer 伪装成 “Microsoft Corporation” 是一种 opsec 技巧,但非常脆弱:
命令行快速查看 WFP Filter:
1 | netsh wfp show filters |
输出导出到 filters.xml,可以查看所有当前 WFP 规则。
原理:将 EDR 云端域名解析指向无效 IP,DNS 层面断开连接。
1 | Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" ` |
hosts.ics 是 Windows Internet Connection Sharing 服务生成的变体文件,也需要一并修改。
原理:NRPT 控制特定域名使用哪个 DNS 服务器,优先级高于默认 DNS。将 EDR 域名解析重定向到 127.0.0.1。
1 | Add-DnsClientNrptRule -Namespace ".endpoint.security.microsoft.com" ` |
Microsoft 公开发布了 Defender for Endpoint 所有域名列表,攻击者可直接利用。
NRPT 规则存储位置:
1 | HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient\DnsPolicyConfig |
原理:向路由表注入自定义路由,使发往 EDR 云端 IP 的数据包被错误路由。
1 | Get-NetIPInterface |
原理:IPSec 过滤规则工作在网络层,即使 IPSec 未在端点上配置,也可以用 netsh 添加 Block 规则。
1 | netsh ipsec static add policy name=ipurplePolicy description=ipurplePolicy |
IPSec 策略存储位置:
1 | HKLM\Software\Policies\Microsoft\Windows\IPSec\Policy\Local\ipsecFilter{GUID}\ipsecData |
注意:IP 地址以十六进制格式存储,非人类可读。
工具:IPMute — PowerShell 脚本,作者 Iliya Dafchev
原理:
效果:本地路由表会认为这些 IP 是本机地址,不再转发到互联网,连接失败。
不同添加方式对应的进程:
| 进程 | 操作方式 |
|---|---|
wmiprvse.exe |
PowerShell cmdlet 修改 |
DllHost.exe |
GUI 图形界面修改 |
netsh.exe |
netsh 命令修改 |
svchost.exe |
DHCP 分配 |
辅助 IP 存储位置:
1 | HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID}\IPAddress |
以 CrowdStrike CSFalconService.exe 向云端发送告警为例:
1 | CSFalconService.exe |
1 | CSFalconService.exe |
OUTBOUND_TRANSPORT 层,无法绕过来自 Huntress 的 Jonathan Johnson(曾在 BlackHat 演讲)提出了两种方案,核心思路都是:监控注册表变化,然后采取行动。
机制:在内核中注册 RegNtPreSetValueKey 注册表预回调。
1 | 攻击者调用 FwpmFilterAdd0() |
优点:完全阻断,攻击者无法成功添加规则。
缺点:
机制:注册 RegNtPostSetValueKey 注册表后回调,允许写入后立即清除。
架构设计(来自 JonMon PoC):
1 | 攻击者调用 FwpmFilterAdd0() |
关键点:
两种方案对比:
| 维度 | Prevention | Immediate Removal |
|---|---|---|
| 内核复杂度 | 高(需内核解析) | 低(解析在用户态) |
| 攻击者体验 | 规则添加失败 | 规则添加成功但瞬间消失 |
| 稳定性 | 稍低 | 较高 |
| 实现难度 | 中等 | 中等 |
| 推荐程度 | 一般 | 推荐 |
1 | 计算机配置 > Windows 设置 > 安全设置 > 高级审核策略配置 > 审核策略 |
⚠️ 启用这些策略会显著增加日志量,需评估存储容量。
| WFP API | Event ID | 含义 |
|---|---|---|
FwpmProviderAdd0 |
5441 | 新 Provider 被添加 |
FwpmFilterAdd0 |
5444 | 新 Filter 被添加 |
FwpmFilterAdd0 |
5157 | 连接被 WFP 阻断(最直接的检测点) |
FwpmFilterDeleteById0 |
5445 | Filter 被删除 |
| — | 5447 | WFP Filter 被更改(可用于触发 Immediate Removal) |
重点关注 5444 和 5157,尤其是:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE\Parameters\Policy\Persistent\Filter |
监控此键下的新增子键(新 Filter 被写入)。
netsh wfp show filters — 导出当前所有 WFP 规则到 XMLGet-FwFilter -FilterId <id> 或 Get-FwFilter -FilterKey <guid> — PowerShell 查询特定 Filter监控注册表路径:
1 | HKLM\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{GUID} |
解析 REG_SZ 字符串中的 App= 字段,判断是否指向已知 EDR 进程路径。
1 | 对象访问 > 审核文件系统 (Audit File System) |
在文件系统审计中手动添加 hosts 文件路径,并配置 Read/Write/Modify 审计权限。
触发 Event ID:4663(对象被访问/修改)
监控注册表路径:
1 | HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\DnsPolicyConfig |
注意:Add-DnsClientNrptRule 内部通过 WMI 操作,因此修改行为来自 WmiPrvSE.exe 进程。
触发 Event ID:
| 操作 | Event ID |
|---|---|
| 句柄请求 | 4656 |
| 访问对象 | 4663 |
| 注册表值修改 | 4657 |
监控注册表路径:
1 | HKLM\Software\Policies\Microsoft\Windows\IPSec\Policy\Local\ |
触发 Event ID:
| 操作 | Event ID |
|---|---|
| 句柄请求 | 4656 |
| 对象访问 | 4663 |
| 注册表值修改 | 4657 |
| IPSec 策略被应用 | 5460 |
| IPSec 策略被加载 | 5471 |
关联点:netsh.exe 进程访问 IPSec 注册表键 + 5460/5471 事件同时出现。
1 | title: WFP Blocked Outbound Connection From Common EDR Agent Binary |
| 工具 | 作者/来源 | 方法 | 语言 | 开源 |
|---|---|---|---|---|
| EDRSilencer | Chris Au (@netero_1010) | WFP FwpmFilterAdd0 | C | ✅ |
| SilentButDeadly | loosehose | WFP FwpmFilterAdd0 | — | ✅ |
| WFP_EDR | k4nfr3 | WFP + SubscriptionManager | Go | ❌(无源码) |
| BlockEDRTraffic | Bordergate | WFP FwpmFilterAdd0 | C++ | ✅ |
| EDRSandblast | Wavestone | Windows Firewall COM | C++ | ✅ |
| IPMute | Iliya Dafchev | 辅助 IP 地址 | PowerShell | ✅ |
| JonMon | Jonathan Johnson | 防御 PoC(RegNtPost回调) | — | ✅ |
| WFP Explorer | Pavel Yosifovich | WFP 规则可视化(蓝队工具) | — | ✅ |
⚠️ WFP_EDR 没有公开源码,不要在生产环境中运行不可信二进制文件。
| 维度 | Purple Team 文章 | Huntress 文章 |
|---|---|---|
| 视角 | 攻防全景(Red + Blue) | 防御深度(以攻促防) |
| 攻击方法覆盖 | WFP / Hosts / NRPT / 路由表 / IPSec / 辅助IP(6种) | Windows Firewall / WFP(2种,更深入) |
| 防御重点 | 审计策略启用 + 注册表监控 + Event ID | 内核回调机制 + 实时清除方案 |
| 独特贡献 | 完整 Playbook + SIGMA 规则 | RegNtPreSetValueKey/PostSetValueKey 防御架构 |
| 工具视角 | 攻击工具 PoC 全景梳理 | 攻击工具原理分析 + 防御 PoC(JonMon) |
| 核心洞察 | 多种方法覆盖,检测需分层 | 防御的关键在于注册表监控,而非进程监控 |
| 术语 | 解释 |
|---|---|
| WFP | Windows Filtering Platform,Windows 网络过滤框架,Vista 引入 |
| BFE | Base Filtering Engine,WFP 的用户态管理服务,运行在 svchost |
| ALE | Application Layer Enforcement,WFP 的应用层执行层,支持按进程匹配 |
| FWP_ACTION_BLOCK | WFP Filter 动作类型:阻断匹配流量 |
| FWP_BYTE_BLOB | WFP 用于表示应用程序 ID 的数据结构 |
| Provider | WFP 中的策略提供者标签,用于归组管理 Filter |
| NRPT | Name Resolution Policy Table,名称解析策略表,控制 DNS 解析路径 |
| RegNtPreSetValueKey | 内核注册表预回调,写入前触发,可返回 ACCESS_DENIED 阻止写入 |
| RegNtPostSetValueKey | 内核注册表后回调,写入后触发,适合即时清除方案 |
| INetFwRules::Remove | COM 接口方法,运行时删除防火墙规则(比直接删注册表键更正确) |
| FwpmFilterDeleteById0 | WFP API,运行时删除指定 Filter(比删注册表键更正确) |
| BYOVD | Bring Your Own Vulnerable Driver,带入易受攻击的驱动,EDR Silencing 不需要此技术 |
| T1562 | MITRE ATT&CK 技术编号:削弱防御(Impair Defenses) |
笔记整理完毕。建议配合 WFP Explorer 在测试环境中实际观察 WFP 规则变化,加深理解。