
AWS WAFの実践的なトレーニングゲーム。チュートリアル、採点付きラボ、試験を備え、プレイヤーは誤検知を避けつつ実際の攻撃パターンをブロックするWeb ACLルールを作成します。
本物の攻撃を防ぎながら AWS WAF を学ぶ、ハンズオンのトレーニングゲームです。
English | 日本語
管理者の方へ: 環境の作り方・参加者への配り方・運用・片付けは 管理者ガイド (docs/ADMIN.md) に、参加者に配る説明は プレイヤー向けのはじめ方 (docs/PLAYER_GUIDE.md) にまとめています。
AWS WAF を「攻撃を受けながら」学ぶための学習環境です。
一人でも、複数人で競っても遊べます。

チュートリアルで攻撃と手順を確認し、脆弱性対応ラボでルールを考えて攻撃を開始、採点と模範解答を見て、最後に管理者ページから競技を開くまでの流れです(約 70 秒)。高画質版は docs/demo-ja.mp4 をご覧ください。
画面は開発モード (
make dev) で撮影しています。開発モードでは本物の AWS WAF の代わりに模範解答で採点します。
┌─────────────── プレイヤーごと ───────────────┐
ブラウザ ── Lambda Function URL (gameapi: 画面 + API) │
│ 非同期呼び出し │
▼ │
Lambda (trafficgen) ── HTTPS ─▶ ALB ◀── Web ACL (プレイヤーが編集)
│ │ │
│ ▼ │
│ Lambda (targetapp: ダミーの EC サイト)
▼ └───────────────────────────────┘
DynamoDB(実行結果・ベストスコア・ロック)
wafdojo-<名前>-cf、us-east-1) も作ります。CloudFront の後ろには ALB ではなくダミーアプリ (Lambda Function URL) を直接つなぐので、ALB 側の Web ACL のルールは効きません。enable_cloudfront = false で作らないようにもできます。X-Forwarded-For に入れて表現しています(「CDN の後ろにあるサイト」という設定)。| ID | 内容 | 学べること |
|---|---|---|
| tutorial-1-sqli | SQL インジェクション | マネージドルールグループ |
| tutorial-2-xss | 口コミ欄への XSS | カスタムルール (Rule builder)、Body の検査、テキスト変換 |
| tutorial-3-ipset | 攻撃者リストの IP | IP セット、CIDR、X-Forwarded-For |
| tutorial-4-useragent | 脆弱性スキャナー | ヘッダーの文字列マッチ、OR ステートメント、Lowercase 変換 |
| tutorial-5-ratelimit | 単一 IP からの大量アクセス | レートベースルール、集計キー |
| tutorial-6-ja4 | ブラウザを名乗るスクレイピングツール | JA4 フィンガープリントの仕組みと読み方 (a_b_c)、JA4 の完全一致、WAF ログの分析 |
| ID | 内容 | 学べること |
|---|---|---|
| game-1-fakebot | Googlebot を名乗るスクレイパー | AND / NOT の組み合わせ(UA が Googlebot かつ Google の IP ではない) |
| 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 editor にそのまま貼り付けられる形)と解説が見られます。Level 2・3 の多くの問題には「ありがちな失敗ルール」とその理由も付いています。
| レベル | 内容 | 問題 |
|---|---|---|
| Level 1: 勧告どおりに書く | 検査対象・照合方法・文字列まで書かれた防ぎ方の情報を、正確にルールにする | Log4Shell, Spring4Shell, Shellshock, Confluence OGNL, F5 BIG-IP iControl REST, Next.js middleware bypass, Apache HTTP Server traversal, Text4Shell, Metabase GeoJSON (CVE-2021-41277), ProxyLogon (CVE-2021-26855), Confluence Velocity (CVE-2023-22527) |
| Level 2: 勧告を WAF に翻訳する | 文章の条件から、検査対象・テキスト変換・照合方法を自分で選ぶ | PHP-CGI (CVE-2024-4577), Citrix ADC, FortiOS SSL-VPN, WebLogic console, Confluence setup, Spring Cloud Function, Struts 2 S2-045, vCenter vROps, XXE, GraphQL introspection, ProxyNotShell, CRLF injection, X-Original-URL, F5 BIG-IP TMUI (CVE-2020-5902), TeamCity (CVE-2024-27198) |
| Level 3: PoC から自分で導く | 防ぎ方の情報なし。攻撃の本質を見抜き、亜種と誤検知の両方に備える | 難読化 Log4Shell, SSRF (メタデータ), SSTI, OS コマンドインジェクション, Prototype pollution, オープンリダイレクト, ファイルアップロード, PAN-OS GlobalProtect (CVE-2024-3400), 勧告の原文を読む: Ivanti Connect Secure (CVE-2023-46805 / CVE-2024-21887), GitLab (CVE-2023-7028) |
| Level 4: マネージドルールと WAF の限界 | マネージドルールが正規の通信を止めたとき、保護を保ったまま直す (ルール単位の Count 上書き + ラベル一致)。Body の検査上限のような WAF そのものの限界に備える | Core rule set の SizeRestrictions_BODY (大きなアップロード), NoUserAgent_HEADER (IoT 機器), GenericRFI_QUERYARGUMENTS (社内の Webhook ツール), 8 KB の壁 (Body の検査上限と Oversize handling。ALB は 8 KB 固定)、CloudFront で 16 KB の壁を 64 KB まで広げる (プレイヤー専用の CloudFront で実際に体験) |
問題を通して身につくこと:
__typename、/mgmt-news、${name} のような「似ているが正規」の通信が各問題に入っています)攻撃リクエストは実際の攻撃の「形」だけを再現した無害なもので、外部の宛先にはすべて attacker.example などの予約ドメインを使っています。
go test ./... で、ラボ・実戦テスト・運用演習の全 46 問の模範解答が「攻撃をすべて止め、正常な通信を 1 件も止めない」ことを確かめています(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 rule set だけで 700 WCU を使います。ラボの模範解答の WCU を合計すると約 1,000 になり、チュートリアルやゲームのルールと合わせると Web ACL の上限 (既定 1,500 WCU) に近づきます。こなした問題のルールは削除しても記録は残ります。
Level 4 のマネージドルールは、AWS が公開しているルールの説明に沿って評価器で再現しています(中身は非公開なので完全な再現ではありません)。ルール名とラベル名は、AWS の DescribeManagedRuleGroup API で本物と一致することを確認しています。
本番の運用と同じように、まず Count のルールで「偵察」(採点なし) してから、WAF ログを調べて本番に臨む問題です。
| 問題 | 内容 |
|---|---|
| 誤検知の犯人探し | XSS 対策のルールに一致してしまう正規の通信 (取引先のメールテンプレート同期) を、ログから見つけて例外にする。正規の通信の例は画面に出しません |
| ログからボットを特定せよ | リスト型攻撃のボットの JA4 を、Logs Insights で /login へのリクエストを集計して見つける。JA4 は画面に出しません |
ラボで学んだ攻撃の「まだ見せていない亜種」が来るテストです。ラボの模範解答を写しただけでは通りません。
| 問題 | 内容 |
|---|---|
| Log4Shell の変異体 | ヘッダー・クエリ・Body のどこにでも、入れ子・二重エンコード・JSON のエスケープを使った Log4Shell が来る |
| パストラバーサル総まとめ | パス・クエリ・Cookie・JSON に、Linux / Windows 形式と様々なエンコードの遡りが来る |
| 開けてはいけない扉 | .git・.env・actuator などへのアクセスが、大文字・スラッシュの重複・../ の遠回り・; ・エンコードで来る |
チュートリアルをすべてクリアし、それ以外の全 52 問 (ゲーム 6・ラボ 41・実戦テスト 3・運用演習 2) をすべて 80 点以上にすると、ロビーとランキングに 🏅 WAF スペシャリストとして表示されます。