
네이티브 C 및 BOF 형식으로 구현된 애플리케이션 범위의 Windows 네트워크 브라운아웃
결정적 레드팀 검증을 위한 애플리케이션 범위 Windows 네트워크 브라운아웃.
네이티브 C • Windows Filtering Platform • 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
기본 브라운아웃 프로필을 실행합니다:
.\dutchoven.exe --app 'C:\Path\To\Target.exe'
이것이 최소 실행의 전부입니다. --app은 유일한 필수 플래그입니다. 기본 프로필은 5초마다 1.5초 동안 대상을 차단하고 1분 후 종료합니다.
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에 애플리케이션 ID를 요청하기 전에 긴 경로로 정규화됩니다. 이는 ADMINI~1과 같은 8.3 경로 별칭이 프로세스의 긴 형식 이미지 ID와 일치할 수 없는 필터를 조용히 생성하는 것을 방지합니다.
콘솔은 벽시계(wall-clock) 및 일정 기준 타임스탬프와 함께 상태 전환을 출력합니다:
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의 Script Manager에서 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에 대해 Dynamic Function Resolution을 사용하며 C 런타임 임포트가 없습니다. 기존 절대 실행 파일 경로 하나를 허용하고 상승된 Beacon을 요구하며 BOF를 호스팅하는 프로세스는 게이팅하지 않습니다. 인라인으로 실행되므로 독립 실행형 바이너리의 1분 다중 사이클 스케줄러를 의도적으로 재현하지 않습니다.
유용한 레드팀 결과에는 독립적인 증거가 필요합니다. 필터 추가 호출이 성공했다고 해서 대상이 의도된 브라운아웃을 겪었다는 증거로 간주하지 마세요.
리포지토리에는 무해한 TCP 카나리 두 개로 이러한 검증을 자동화하는 Windows 통합 하네스가 포함되어 있습니다. 상승된 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 ID, 전체 명령줄을 기록한 후 복구 후 버퍼링된 텔레메트리를 전달했습니다. 해당 구성에서는 Elastic Defend 알림이 생성되지 않았습니다. 이를 보편적인 탐지 또는 회피 주장이 아닌 단일 측정 결과로 간주하세요.
DutchOven은 의도적으로 다음을 수행하지 않습니다:
WFP 개체를 추가하려면 Base Filtering Engine에 대한 쓰기 액세스가 필요하므로 관리자 권한이 필요합니다. 애플리케이션 ID는 실제로 네트워크 흐름을 소유한 실행 파일과 일치해야 합니다. 다중 프로세스 에이전트, 프록시, 커널 네트워킹, 장기 연결은 관찰된 결과를 변경할 수 있으므로 가정하지 말고 측정해야 합니다.
| 프로필 | 블록 | 패스 | 주기 | 지속 시간 | 의도된 용도 |
|---|
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 및 체크섬 |
blackout | 5 s |
| 경로 | 내용 |
|---|
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 래퍼 및 계약 검사기 |