
튜토리얼, 점수 기반 실습, 시험으로 구성된 실습형 AWS WAF 훈련 게임으로, 플레이어가 오탐을 피하면서 실제 공격 형태를 차단하는 Web ACL 규칙을 작성합니다.
실제 공격을 방어하며 AWS WAF를 배우는 실습형 트레이닝 게임입니다.
English | 日本語
관리자용: 환경 구축 방법, 참가자에게 배포하는 방법, 운영 및 정리 방법은 관리자 가이드 (docs/ADMIN.md)에 다루고 있으며, 참가자용 배포 자료는 플레이어 시작 가이드 (docs/PLAYER_GUIDE.md)에 있습니다. 두 가이드 모두 현재 일본어로 제공됩니다.
공격을 받는 상황에서 AWS WAF를 배우기 위한 실습 환경입니다.
혼자 플레이하거나 다른 사람과 경쟁할 수 있습니다.

튜토리얼의 공격과 단계를 읽고, 취약점 랩에서 규칙을 설계하고, 공격을 실행하고, 점수와 모범 답안을 확인한 뒤, 마지막으로 관리자 페이지에서 콘테스트를 여는 흐름(약 70초)입니다. 고화질 버전은 docs/demo-en.mp4에 있습니다.
실제 AWS WAF 대신 모범 답안으로 채점하는 개발 모드(
make dev)에서 녹화되었습니다.
┌───────────────────── per player ──────────────────┐
Browser ── Lambda Function URL (gameapi: UI + API) │
│ async invoke │
▼ │
Lambda (trafficgen) ── HTTPS ─▶ ALB ◀── Web ACL (edited by the player)
│ │ │
│ ▼ │
│ Lambda (targetapp: dummy online shop) │
▼ └────────────────────────────────────┘
DynamoDB (runs, best scores, locks)
wafdojo-<name>-cf, us-east-1)도 갖는다. CloudFront는 ALB가 아닌 더미 앱의 Lambda Function URL을 직접 앞단에서 처리하므로, ALB의 Web ACL 규칙은 여기에 적용되지 않는다. 이를 건너뛰려면 enable_cloudfront = false로 설정한다.X-Forwarded-For의 문서용 주소(RFC 5737)로 표현된다(사이트가 CDN 뒤에 있다고 가정한다).| ID | 주제 | 배우는 내용 |
|---|---|---|
| tutorial-1-sqli | SQL 인젝션 | 관리형 규칙 그룹 |
| tutorial-2-xss | 리뷰 양식의 XSS | 사용자 지정 규칙(Rule builder), 본문 검사, 텍스트 변환 |
| tutorial-3-ipset | 위협 목록에 있는 IP | IP 집합, CIDR, X-Forwarded-For |
| tutorial-4-useragent | 취약점 스캐너 | 헤더 문자열 매칭, OR 문, 소문자 변환 |
| tutorial-5-ratelimit | 단일 IP로부터의 플러드 | 속도 기반 규칙, 집계 키 |
| tutorial-6-ja4 | 브라우저로 위장한 스크레이퍼 | JA4 지문의 동작 방식과 읽는 법(a_b_c), 정확한 JA4 매칭, WAF 로그 분석 |
| ID | 주제 | 배우는 내용 |
|---|---|---|
| game-1-fakebot | Googlebot으로 위장한 스크레이퍼 | AND / NOT 조합(UA가 Googlebot이고 IP가 Google의 것이 아님) |
| game-2-admin | 관리자 패널에 대한 외부 접근 | URI 경로 조건 + IP 허용 목록, 대소문자 구분 |
| game-3-traversal | 경로 순회 | 텍스트 변환 중첩(이중 디코딩), 오탐 방지 |
| game-4-cms | 편집자를 차단하는 XSS 규칙 | 예외 구성, 규칙 우선순위, 기존 규칙 재검토 |
| game-5-bruteforce | 로그인 무차별 대입 + 기업 NAT | 범위 축소 문, 임계값 설계 |
| game-6-ja4regex | JA4를 계속 바꾸는 봇 군단 + 같은 라이브러리를 쓰는 파트너 | JA4 정규식(공유되는 b 부분 포착), 미지의 변형 대비, AND NOT을 사용한 예외 |
튜토리얼에서 만든 규칙은 그대로 유지되므로, 게임 모드에서는 때때로 오탐을 일으킨다(스테이지 4와 5). 새로운 공격을 막는 것뿐 아니라 기존 규칙을 재검토해야 한다.
각 챌린지는 다음과 같이 시작한다. "새로운 취약점이 나왔다. 다음 조건에서 차단할 수 있다. 규칙을 작성하라." 목표는 새로운 취약점이 나타날 때마다 스스로 규칙을 작성할 수 있게 되는 것이다. 한 번 시도하면 모범 답안 규칙 JSON(콘솔의 Rule JSON 편집기에 바로 붙여넣을 수 있음)과 해설을 볼 수 있다. 많은 Level 2 및 3 챌린지에는 "흔한 함정" 규칙과 그것이 실패하는 이유도 포함되어 있다.
| 레벨 | 내용 | 챌린지 |
|---|---|---|
| 레벨 1: 권고문 따르기 | 무엇을 검사할지, 어떻게 매칭할지, 정확한 문자열까지 명시한 지침을 정밀한 규칙으로 변환 | Log4Shell, Spring4Shell, Shellshock, Confluence OGNL, F5 BIG-IP iControl REST, Next.js 미들웨어 우회, Apache HTTP Server 경로 순회, Text4Shell, Metabase GeoJSON (CVE-2021-41277), ProxyLogon (CVE-2021-26855), Confluence Velocity (CVE-2023-22527) |
| 레벨 2: 권고문을 WAF로 변환 | 산문 형태의 조건으로부터 검사 대상 컴포넌트, 변환, 매칭 유형을 직접 선택 | PHP-CGI (CVE-2024-4577), Citrix ADC, FortiOS SSL-VPN, WebLogic 콘솔, Confluence 설정, Spring Cloud Function, Struts 2 S2-045, vCenter vROps, XXE, GraphQL 인트로스펙션, ProxyNotShell, CRLF 인젝션, X-Original-URL, F5 BIG-IP TMUI (CVE-2020-5902), TeamCity (CVE-2024-27198) |
| 레벨 3: PoC로부터 도출하기 | 완화 지침 없음. 공격의 본질을 찾아내고 두 가지 변형과 오탐 모두에 대비 | 난독화된 Log4Shell, SSRF (메타데이터), SSTI, OS 명령 인젝션, 프로토타입 오염, 오픈 리다이렉트, 파일 업로드, PAN-OS GlobalProtect (CVE-2024-3400), 원본 권고문 읽기: Ivanti Connect Secure (CVE-2023-46805 / CVE-2024-21887), GitLab (CVE-2023-7028) |
| 레벨 4: 관리형 규칙과 WAF의 한계 | 관리형 규칙이 정상 트래픽을 차단할 때 보호를 유지하면서 수정 (규칙별 Count 재정의 + 레이블 매칭). 본문 검사 한도와 같은 WAF 자체의 한계에 대비 | 핵심 규칙 세트 SizeRestrictions_BODY (대용량 업로드), NoUserAgent_HEADER (IoT 기기), GenericRFI_QUERYARGUMENTS (내부 웹훅 도구), 8 KB 벽 (본문 검사 한도와 초과 크기 처리, ALB에서는 8 KB로 고정), CloudFront의 16 KB 벽을 64 KB로 확장 (플레이어 자신의 CloudFront에서 직접 경험) |
챌린지가 길러주는 것:
__typename, /mgmt-news, ${name} 같은 유사한 정상 트래픽이 포함됨)공격 요청은 실제 공격의 형태를 무해하게 재현한 것이며, 모든 외부 목적지는 attacker.example과 같은 예약 도메인을 사용합니다.
go test ./...는 46개 랩, 시험, 운영 챌린지의 모범 답안이 모든 공격을 차단하고 정상 요청은 차단하지 않는지 확인합니다 (internal/wafrule의 평가기가 AWS WAF의 매칭을 로컬에서 재현).mkdir -p /tmp/rules && WAFDY_EXPORT_RULES=/tmp/rules go test -run TestExportLabRules ./internal/scenario/
for f in /tmp/rules/*.json; do aws wafv2 check-capacity --scope REGIONAL --cli-binary-format raw-in-base64-out --rules file://$f; done
Level 4에서 사용되는 Core 규칙 세트만으로도 700 WCU를 소비합니다. 실습 모델 답안은 합계 약 1,000 WCU에 달하며, 이는 튜토리얼 및 게임 규칙과 함께 Web ACL 한도(기본값 1,500 WCU)에 근접합니다. 이미 숙달한 챌린지의 규칙을 삭제해도 기록은 유지됩니다.
Level 4 관리형 규칙은 AWS가 공개한 규칙 설명을 바탕으로 평가기에서 재현한 것입니다(실제 내용은 공개되지 않으므로 정확한 재현은 아닙니다). 규칙 및 레이블 이름은 AWS의 DescribeManagedRuleGroup API를 통해 실제 이름과 대조하여 확인했습니다.
실제 운영과 마찬가지로 먼저 Count 규칙으로 "정찰"(점수 미반영)을 수행하고 WAF 로그를 분석한 뒤 실제 실행에 들어갑니다.
| 챌린지 | 내용 |
|---|---|
| 오탐 원인 찾기 | 로그에서 XSS 규칙을 트리거하는 정상 트래픽(파트너의 이메일 템플릿 동기화)을 찾아 예외를 설정합니다. 정상 트래픽은 화면에 표시되지 않습니다 |
| 로그에서 봇 식별하기 | Logs Insights에서 /login 요청을 집계하여 크리덴셜 스터핑 봇의 JA4를 찾습니다. JA4는 화면에 표시되지 않습니다 |
아직 보지 못한 실습 공격의 변형을 전송하는 테스트입니다. 실습 모델 답안을 복사하는 것만으로는 통과할 수 없습니다.
| 챌린지 | 내용 |
|---|---|
| Log4Shell 변형 | 중첩, 이중 인코딩, JSON 이스케이프를 사용하여 헤더, 쿼리, 본문 어디든 Log4Shell 삽입 |
| 경로 순회 대장정 | 경로, 쿼리, 쿠키, JSON에서 Linux 및 Windows 스타일의 다양한 인코딩을 사용한 순회 |
| 닫혀 있어야 할 문 | 대문자, 중복 슬래시, ../ 우회, ;, 인코딩을 통한 .git, .env, actuator 등에 대한 접근 |