面向应用范围的 Windows 网络局部中断,用于确定性的红队验证。
原生 C • Windows 筛选平台 • IPv4 + IPv6 • 动态清理
快速开始 • 操作预设配置 • CLI 参考 • 工作原理 • 构建 • BOF • 验证工作流
[!CAUTION] 仅限受控环境。 只能在您拥有或获得明确授权评估的系统上运行 DutchOven。 它会更改当前的 Windows 网络策略,并且需要提升的管理员令牌。 使用前请阅读 SECURITY.md。
DutchOven 是一个刻意保持精简的 Windows 红队原语,它将显式可执行文件路径置于一个确定性网络闸门之后。在每个周期内,匹配的应用程序会在一个有界的时间间隔内被阻断,并在剩余时间内被放行。
结果是可重复的局部中断(brownout),而不是服务停止或永久防火墙规则。它提供了一种受控方式,用于在进程保持存活的同时,测量重试逻辑、缓冲、健康状态转换、延迟投递和恢复行为。
| 设计选择 | 操作者价值 |
|---|---|
| 应用范围的 WFP 筛选器 | 将实验限制在操作者提供的路径范围内 |
| 定时阻断/放行占空比 | 产生可测量的性能降级,而不仅仅是在线/离线两种状态 |
| IPv4 与 IPv6 原子化变更 | 让两个地址族保持相同的调度节奏 |
| 动态 WFP 会话 | 引擎会话关闭时移除筛选器及生成的子层 |
| 原生 C 实现 | 不依赖 Go、.NET、服务安装或自定义驱动程序 |
| 仅限显式目标 | 不进行产品枚举、进程猜测,也没有内置目标数据库 |
DutchOven 管控新的出站连接授权。WFP 已授权的现有连接不会被追溯终止;在验证不间断的长生命周期连接时,请使用新的 canary 连接,或自行强制目标重新连接。
打开一个提升权限的 PowerShell 窗口。
在不更改 WFP 的情况下验证已解析的目标和时序:
.\dutchoven.exe --app 'C:\Path\To\Target.exe' --dry-run
运行默认的 brownout 预设配置:
.\dutchoven.exe --app 'C:\Path\To\Target.exe'
这就是完整的最小调用方式。--app 是唯一必需的参数。默认预设配置会在每个 5 秒周期内阻断目标 1.5 秒,并在一分钟后退出。
使用 Ctrl+C 可提前停止。DutchOven 会在关闭其 WFP 会话之前移除活动筛选器;如果进程被中断,动态会话就是清理的后备保障。
预设配置内置了实用的调度方案,操作者无需逐一指定每个时序值。
使用一个可选参数选择预设配置:
.\dutchoven.exe --app 'C:\Path\To\Target.exe' --profile heavy
dutchoven --app <absolute.exe> [--app <absolute.exe> ...] [options]
使用 dutchoven version 打印构建版本。
无论参数顺序如何,高级时序参数都会覆盖所选预设配置:
.\dutchoven.exe `
--app 'C:\Path\To\Target.exe' `
--period-ms 8000 `
--block-ms 2000 `
--duration-ms 120000 `
--warmup-ms 5000
JSON Lines 面向测试框架和证据收集场景:
.\dutchoven.exe --app 'C:\Path\To\Target.exe' --profile heavy --json
解析器强制实施以下时序限制:
100–60000 ms1 ms 至整个周期900000 ms(15 分钟)60000 msexplicit executable path
│
▼
WFP application ID
│
├── ALE_AUTH_CONNECT_V4 ──┐
└── ALE_AUTH_CONNECT_V6 ──┤── BLOCK / PASS schedule
│
└── dynamic WFP session cleanup
Windows 目标会以 Unicode 形式解析,并在 DutchOven 向 WFP 请求应用程序标识之前规范化为其长路径。这可以防止诸如 ADMINI~1 之类的 8.3 路径别名静默创建一个无法匹配进程长格式映像标识的筛选器。
控制台打印带有墙上时钟时间和调度相对时间戳的状态转换:
Targets: 1
C:\Path\To\Target.exe
Schedule: block=1500ms pass=3500ms period=5000ms duration=60000ms warmup=0ms
Profile: brownout
Mode: brownout
BLOCK cycle=1 filters=2 wall_ms=1786973903811 elapsed_ms=0
PASS cycle=1 wall_ms=1786973908813 elapsed_ms=5000
...
CLEAN filters=0 session=closed cycles=12 wall_ms=1786973963812 elapsed_ms=60000
默认的 Linux 构建用于测试解析和 dry-run 行为。实际的 WFP 闸门需要原生 Windows 交叉构建。
make check
make release
make check 运行可移植测试、交叉构建 Windows 产物,并验证 BOF 导入契约。make release 在 artifacts/v<version>/ 下生成剥离后的发布产物和 SHA256SUMS。
主要产物:
Windows 可执行文件仅链接 Windows 系统库:fwpuclnt、rpcrt4 和 advapi32。
BOF 将 DutchOven 打包为在 x64 Beacon 中内联运行的短促的同步脉冲。使用以下命令构建 COFF 对象、刷新带版本号的产物并验证其导入契约:
make bof
在 Cobalt Strike 的脚本管理器中加载 bof/dutchoven.cna,然后从 Beacon 控制台调用它:
dutchoven "C:\Path\To\Target.exe"
dutchoven "C:\Path\To\Target.exe" heavy
默认预设配置为 brownout。预设配置映射到单个有界的阻断间隔:
| 预设配置 | 脉冲 |
|---|---|
light | 0.5 s |
brownout | 1.5 s |
heavy | 3.5 s |
每次调用都会打开一个动态 WFP 会话,原子化安装 IPv4 和 IPv6 连接筛选器,等待所选脉冲时长,显式移除这两个筛选器,并在返回前关闭会话。如果显式移除失败,关闭动态会话仍然是清理的后备保障。
BOF 对 Kernel32、Rpcrt4 和 Fwpuclnt 使用动态函数解析;它没有任何 C 运行时导入。它接受一个已存在的绝对可执行文件路径,要求 Beacon 具有提升权限,并拒绝管控承载 BOF 的进程本身。由于它是内联执行的,因此刻意不复制独立二进制的一分钟多周期调度器。
有价值的红队结果需要独立证据。不要将一次成功的添加筛选器调用视为目标确实经历了预期局部中断的证明。
本仓库包含一个 Windows 集成测试工具,它使用两个无害 TCP canary 副本来自动化上述断言。它需要一个提升权限的 PowerShell 会话和一个可访问的非本地 TCP 监听器;回环流量不能替代经过路由的 WFP 验证。
.\tests\windows_integration.ps1 `
-DutchOvenPath '.\build-windows\dutchoven.exe' `
-CanaryPath '.\build-windows\windows_canary.exe' `
-ServerAddress '192.0.2.10' `
-ServerPort 8443
该测试工具验证基线连通性、定向阻断、对照应用不受影响、正常恢复、通过动态会话实现的强制终止恢复,以及零 WFP 残留。
DutchOven 0.4.1 已在装有 Elastic Defend 9.4.2 的 Windows Server 2022 上完成验证:
Elastic 记录了 DutchOven 的进程启动、进程结束、SYSTEM 身份和完整命令行,并在恢复后投递了缓冲的遥测数据。在该配置下,它没有产生 Elastic Defend 警报。请将此视为一次测量到的结果,而非普适的检测或规避声明。
DutchOven 刻意不:
需要管理员权限,因为添加 WFP 对象需要对基础筛选引擎(Base Filtering Engine)具有写入访问权。应用程序标识必须与实际拥有网络流的可执行文件匹配。多进程代理、代理服务器、内核网络和长生命周期连接都可能改变观察到的结果,必须进行测量而不能凭空假设。
| 预设配置 | 阻断 | 放行 | 周期 | 持续时间 | 预期用途 |
|---|
light | 0.5 s | 4.5 s | 5 s | 60 s | 低影响重试观察 |
brownout | 1.5 s | 3.5 s | 5 s | 60 s | 均衡的默认实验 |
heavy | 3.5 s | 1.5 s | 5 s | 60 s | 队列与恢复压力测试 |
blackout | 5 s | 0 s | 5 s | 30 s | 短时、有界的完全中断 |
| 参数 | 必需 | 说明 |
|---|
--app <absolute.exe> | 是 | 目标可执行文件路径;多进程应用可重复指定 |
--profile <name> | 否 | light、brownout、heavy 或 blackout |
--period-ms <ms> | 否 | 覆盖完整的阻断/放行周期 |
--block-ms <ms> | 否 | 覆盖每个周期中的阻断时长 |
--duration-ms <ms> | 否 | 覆盖有界的总运行时长 |
--warmup-ms <ms> | 否 | 在第一个阻断间隔之前允许流量通过 |
--dry-run | 否 | 验证并打印配置,而不打开 WFP |
--json | 否 | 以 JSON Lines 格式输出配置和状态转换 |
--help | 否 | 打印命令帮助 |
| 产物 | 用途 |
|---|
build/dutchoven | POSIX 解析器与 dry-run 二进制 |
build/dutchoven_tests | 核心单元测试 |
build-windows/dutchoven.exe | 原生 Windows WFP 闸门 |
build-windows/dutchoven_tests.exe | 原生 Windows 测试二进制 |
build-windows/windows_canary.exe | 路由集成测试 canary |
bof/dutchoven.x64.o | 带版本号的 x64 Beacon 对象文件 |
artifacts/v<version>/ | 剥离后的发布 EXE、BOF 和校验和 |
blackout | 5 s |
| 路径 | 内容 |
|---|
src/main.c | 极简命令行入口点 |
src/gate.c | WFP 闸门、预设配置、时序与清理 |
tests/test_gate.c | 解析器、预设配置和边界测试 |
tests/windows_canary.c | 用于路由 Windows 集成测试的无害 TCP canary |
tests/windows_integration.ps1 | 正常与强制清理的 WFP 集成测试工具 |
bof/ | x64 BOF 源码、Aggressor 包装器和契约检查器 |