Cloud Challenge CTF transforms abstract cloud security concepts into concrete, hands-on learning experiences through narrative-driven challenges and real AWS infrastructure. While presented as a cyberpunk-themed CTF platform, it's fundamentally about making AWS security principles tangible and memorable. The system uses storytelling and interactive scenarios to help users understand security threats (like data poisoning attacks on AI systems), learn defensive techniques, and develop practical skills through direct engagement with AWS services. Built with a static frontend + serverless backend architecture on AWS, the system demonstrates how modern web technologies can deliver complex interactive learning experiences with minimal infrastructure overhead while maintaining scalability, security, and cost efficiency.
Cloud Challenge CTF is built on a foundation of static frontend + serverless backend architecture using AWS-native services. This design addresses the core challenges of delivering effective security education: rapid iteration during challenge development, automatic scaling with learner traffic, flexible addition of new security scenarios, and secure handling of AWS credentials and challenge validation. The architecture supports both the learning experience through narrative-driven progression and hands-on AWS practice, while meeting educational goals by making security concepts concrete and teaching defensive techniques through real scenarios.
The platform uses a static Next.js frontend deployed to S3 and CloudFront, with serverless Lambda functions handling validation and state management. This approach provides several key benefits:
At its core, Cloud Challenge CTF follows a straightforward pattern: static frontend served via CDN, API calls to serverless backend, state persists in browser and DynamoDB, zero traditional server infrastructure required.
┌─────────────────────────────────────────────────────────────────┐ │ CLOUD CHALLENGE CTF SYSTEM │ │ │ │ ┌──────────────┐ │ │ │ Player │ │ │ │ Browser │ │ │ └──────┬───────┘ │ │ │ │ │ │ HTTPS Request (Game URL) │ │ ▼ │ │ ┌─────────────────┐ │ │ │ CloudFront CDN │ │ │ │ (Global Edge) │ │ │ └──────┬──────────┘ │ │ │ │ │ │ Cache Hit (Edge) or Origin Request │ │ ▼ │ │ ┌─────────────────┐ │ │ │ S3 Bucket │ │ │ │ (Static Files) │ │ │ └──────┬──────────┘ │ │ │ │ │ │ Static Assets (HTML, JS, CSS, Images, Fonts) │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Next.js App │ │ │ │ (React + TS) │ │ │ └──────┬──────────┘ │ │ │ │ │ │ API Calls (User Actions, Challenge Validation) │ │ ▼ │ │ ┌─────────────────┐ │ │ │ API Gateway │ │ │ │ (REST API) │ │ │ └──────┬──────────┘ │ │ │ │ │ │ Route to Lambda Function │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Lambda │ │ │ │ (Python 3.9) │ │ │ └──────┬──────────┘ │ │ │ │ │ ├─ Read/Write User Data ──────────────┐ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ DynamoDB │ │ AWS KMS/STS │ │ │ │ (User Profiles,│ │ (Challenge │ │ │ │ Challenge │ │ Credentials) │ │ │ │ Progress) │ └─────────────────┘ │ │ └──────┬──────────┘ │ │ │ │ │ │ Response (JSON) │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Frontend │ │ │ │ (Update UI) │ │ │ └─────────────────┘ │ │ │ │ ┌─────────────────┐ │ │ │ Browser Storage│ │ │ │ • localStorage │ (Authenticated users, persistent) │ │ │ • sessionStorage│ (Guest users, temporary) │ │ └─────────────────┘ │ └─────────────────────────────────────────────────────────────────┘
Frontend (Next.js Static Export)
output: 'export')@react-oauth/google v0.12.2 for client-side Google OAuth authenticationAuthContext for session management with dual storage strategyBackend (AWS Serverless)
awschallangeUsersTable) and challenge state (awsChallengeChallengesTable)Hosting (AWS S3 + CloudFront)
ccchallange-prod for static website hosting (HTML, JS, CSS, images, fonts)E3O8J8O00C9XL9 with global edge caching across 450+ points of presencecloudchallenge.cirrusly-clever.com via Route 53 integrationaws s3 sync out/ s3://ccchallange-prod --delete after buildAuthentication (Dual-Path System)
@react-oauth/google librarylocalStorage for authenticated users (persistent across browser sessions)sessionStorage for guest users (cleared when browser tab closes)useAuth() hook for global session stateChallenge System (Multi-Stage CTF)