
Сетевые браунауты Windows на уровне приложения в виде нативного кода на C и BOF
Сетевые браунауты Windows с привязкой к приложениям для детерминированной red-team-валидации.
Нативный C • Windows Filtering Platform • IPv4 + IPv6 • Динамическая очистка
Быстрый старт • Профили • CLI • Как это работает • Сборка • BOF • Валидация
[!CAUTION] Только контролируемые среды. Запускайте DutchOven только на системах, которыми вы владеете или на проверку которых у вас есть явное разрешение. Он изменяет действующую сетевую политику Windows и требует повышенного токена администратора. Перед использованием ознакомьтесь с SECURITY.md.
DutchOven — это намеренно небольшой red-team-примитив для 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 — единственный обязательный флаг. Профиль по умолчанию блокирует цель на 1,5 секунды в каждом 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 идентификатор приложения. Это не позволяет псевдониму пути 8.3, например ADMINI~1, незаметно создать фильтр, который не сможет совпасть с длинной формой идентификатора образа процесса.
Консоль выводит переходы состояний с абсолютными метками времени и метками относительно расписания:
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 создаёт релизные артефакты без отладочных символов и SHA256SUMS в каталоге artifacts/v<version>/.
Основные результаты сборки:
Windows-исполняемый файл линкуется только с системными библиотеками Windows: fwpuclnt, rpcrt4 и advapi32.
BOF упаковывает DutchOven в виде короткого синхронного импульса, который выполняется инлайн в x64 Beacon. Соберите COFF-объект, обновите версионируемый артефакт и проверьте его контракт импорта командой:
make bof
Загрузите bof/dutchoven.cna в Script Manager Cobalt Strike, затем вызовите его из консоли Beacon:
dutchoven "C:\Path\To\Target.exe"
dutchoven "C:\Path\To\Target.exe" heavy
Профиль по умолчанию — brownout. Профили сопоставляются с одним ограниченным интервалом блокировки:
| Профиль | Импульс |
|---|---|
light | 0.5 s |
brownout | 1.5 s |
heavy |
Каждый вызов открывает динамическую сессию WFP, атомарно устанавливает фильтры подключения IPv4 и IPv6, ожидает выбранный импульс, явно удаляет оба фильтра и закрывает сессию перед возвратом. Закрытие динамической сессии остаётся страховочным механизмом очистки, если явное удаление не сработает.
BOF использует динамическое разрешение функций для Kernel32, Rpcrt4 и Fwpuclnt; у него нет импортов C runtime. Он принимает один существующий абсолютный путь к исполняемому файлу, требует Beacon с повышенными правами и отказывается ограничивать процесс, в котором размещён BOF. Поскольку он выполняется инлайн, он намеренно не воспроизводит одноминутный многоцикловый планировщик автономного бинарника.
Полезный результат работы red-team требует независимых доказательств. Не считайте успешный вызов добавления фильтра доказательством того, что цель испытала предполагаемый браунаут.
Репозиторий включает Windows-стенд интеграционного тестирования, который автоматизирует эти проверки с помощью двух копий безвредного TCP-канареечного приложения. Для него требуются сессия PowerShell с повышенными правами и доступный нелокальный TCP-слушатель; loopback-трафик не является допустимой заменой маршрутизируемой валидации 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. Идентификатор приложения должен соответствовать исполняемому файлу, который фактически владеет сетевым потоком. Многопроцессные агенты, прокси, сетевые операции на уровне ядра и долгоживущие соединения могут изменить наблюдаемый результат, и их необходимо измерять, а не предполагать.
| Профиль | Блокировка | Пропуск | Период | Длительность | Назначение |
|---|
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 | Канареечное приложение для маршрутизируемых интеграционных тестов |
bof/dutchoven.x64.o | Версионируемый x64 Beacon Object File |
artifacts/v<version>/ | Релизные EXE и BOF без отладочных символов, а также контрольные суммы |
| 3.5 s |
blackout | 5 s |
| Путь | Содержимое |
|---|
src/main.c | Минимальная точка входа командной строки |
src/gate.c | Шлюз WFP, профили, тайминг и очистка |
tests/test_gate.c | Тесты парсера, профилей и граничных условий |
tests/windows_canary.c | Безвредный TCP-канареечник для маршрутизируемых интеграционных тестов Windows |
tests/windows_integration.ps1 | Стенд WFP-интеграции для штатного и принудительного завершения |
bof/ | Исходный код x64 BOF, обёртка Aggressor и проверщик контракта |