面向应用范围的 Windows 网络间歇性降级,用于确定性的红队验证。
原生 C • Windows 筛选平台 • IPv4 + IPv6 • 动态清理
快速开始 • 配置文件 • CLI • 工作原理 • 构建 • BOF • 验证
[!CAUTION] 仅限受控环境。 仅在您拥有或获得明确授权进行评估的系统上运行 DutchOven。它会更改实时 Windows 网络策略,并且需要提升的管理员令牌。使用前请查阅 SECURITY.md。
DutchOven 是一个刻意保持小巧的 Windows 红队原语,它将显式的可执行文件路径置于确定性的网络门控之后。在每个周期内,匹配的应用程序会在有限的时间间隔内被阻止,并在剩余时间内被允许通过。
其结果是可重复的间歇性降级,而非停止服务或永久防火墙规则。它提供了一种受控方式,用于在进程保持存活期间测量重试逻辑、缓冲、健康状态转换、延迟交付和恢复行为。
| 设计选择 | 对操作者的价值 |
|---|---|
| 面向应用范围的 WFP 筛选器 | 将实验限制在操作者提供的路径上 |
| 定时阻止/放行占空比 | 产生可测量的性能下降,而不仅仅是在线/离线状态 |
| 原子化 IPv4 和 IPv6 变更 | 使两个地址族保持在同一时间表上 |
| 动态 WFP 会话 | 当引擎会话关闭时移除筛选器和生成的子层 |
| 原生 C 实现 | 无 Go、.NET、服务安装或自定义驱动依赖 |
| 仅限显式目标 | 无产品枚举、进程猜测或内置目标数据库 |
DutchOven 门控的是新的出站连接授权。WFP 已经授权的现有连接不会被追溯终止;在验证不间断的长连接流时,请使用新的金丝雀连接,或独立强制目标重新连接。
打开一个提升权限的 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 会话之前会移除活动过滤器;如果进程被中断,动态会话是清理的兜底机制。
配置内置了实用的时间安排,因此操作人员无需指定每一个时间值。
| 配置 | 阻断 | 放行 | 周期 | 持续时间 | 预期用途 |
|---|---|---|---|---|---|
light | 0.5 秒 | 4.5 秒 | 5 秒 | 60 秒 | 低影响重试观察 |
brownout | 1.5 秒 | 3.5 秒 | 5 秒 | 60 秒 | 均衡的默认实验 |
heavy | 3.5 秒 | 1.5 秒 | 5 秒 | 60 秒 | 队列与恢复压力测试 |
blackout | 5 秒 | 0 秒 | 5 秒 | 30 秒 | 短暂、有界的完全中断 |
使用一个可选标志选择配置:
.\dutchoven.exe --app 'C:\Path\To\Target.exe' --profile heavy
dutchoven --app <absolute.exe> [--app <absolute.exe> ...] [options]
| 参数 | 必需 | 描述 |
|---|---|---|
--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 | 否 | 打印命令帮助 |
使用 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 目标在 DutchOven 向 WFP 请求应用程序标识之前,会以 Unicode 形式解析并规范化为其长路径。这可以防止诸如 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 构建会执行解析和试运行行为。实时 WFP 门控需要 原生 Windows 交叉构建。
make check
make release
make check 运行可移植测试、交叉构建 Windows 产物,并验证 BOF 导入契约。make release 在 artifacts/v<version>/ 下生成剥离后的发布产物和 SHA256SUMS。
主要输出:
| 产物 | 用途 |
|---|---|
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 | 路由集成测试金丝雀 |
bof/dutchoven.x64.o | 带版本号的 x64 Beacon Object File |
artifacts/v<version>/ | 剥离后的发布 EXE、BOF 和校验和 |
Windows 可执行文件仅链接 Windows 系统库:fwpuclnt、rpcrt4 和 advapi32。
BOF 将 DutchOven 打包为一个简短的同步脉冲,在 x64 Beacon 中内联运行。构建 COFF 对象、刷新带版本号的产物,并通过以下命令验证其导入契约:
make bof
在 Cobalt Strike 的 Script Manager 中加载 bof/dutchoven.cna,然后从 Beacon 控制台调用它:
dutchoven "C:\Path\To\Target.exe"
dutchoven "C:\Path\To\Target.exe" heavy
默认配置文件是 brownout。配置文件映射到单个有界阻塞区间:
| 配置文件 | 脉冲 |
|---|---|
light | 0.5 秒 |
brownout | 1.5 秒 |
heavy | 3.5 秒 |
blackout | 5 秒 |
每次调用都会打开一个动态 WFP 会话,原子地安装 IPv4 和 IPv6 连接过滤器,等待选定的脉冲,显式移除两个过滤器,并在返回前关闭会话。如果显式移除失败,关闭动态会话仍然是清理的兜底措施。
该 BOF 对 Kernel32、Rpcrt4 和 Fwpuclnt 使用动态函数解析;它没有 C 运行时导入。它接受一个已存在的绝对可执行文件路径,要求具有提升权限的 Beacon,并拒绝拦截承载该 BOF 的进程。由于它以内联方式执行,它有意不复现独立二进制文件的一分钟多周期调度器。
有用的红队结果需要独立证据。不要将成功添加过滤器的调用视为目标经历了预期 brownout 的证明。
该仓库包含一个 Windows 集成测试框架,它使用两个无害 TCP 金丝雀副本自动执行这些断言。它需要提升权限的 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 已在 Windows Server 2022 上使用 Elastic Defend 9.4.2 完成验证:
Elastic 记录了 DutchOven 的进程启动、进程结束、SYSTEM 身份和完整命令行,然后在恢复后交付了缓冲的遥测数据。在该配置下,它未产生 Elastic Defend 告警。请将此视为一项实测结果,而非通用的检测或规避声明。
DutchOven 有意不执行以下操作:
需要管理员权限,因为添加 WFP 对象需要对基础筛选引擎(Base Filtering Engine)的写入访问权限。应用程序身份必须与实际拥有网络流的可执行文件匹配。多进程代理、代理服务器、内核网络和长连接可能会改变观察到的结果,必须进行实测而非假设。
| 路径 | 内容 |
|---|---|
src/main.c | 最小命令行入口点 |
src/gate.c | WFP 门控、配置文件、计时和清理 |
tests/test_gate.c | 解析器、配置文件和边界测试 |
tests/windows_canary.c | 用于路由 Windows 集成测试的无害 TCP 金丝雀 |
tests/windows_integration.ps1 | 正常和强制清理 WFP 集成测试框架 |
bof/ | x64 BOF 源代码、Aggressor 包装器和契约检查器 |