Interactive web training labs for CTF workshop practice. Lightweight, modular, and Docker-based.
┌─────────────────────────────────────────────────────┐
│ docker compose │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ HOME │ │ LFI │ │ SQLi │ │
│ │ nginx │ │ PHP │ │ PHP+SQL │ │
│ │ :80 │ │ :6001 │ │ :6002 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ JWT │ │ CMDi │ │
│ │ Express │ │ Flask │ │
│ │ :6004 │ │ :6005 │ │
│ └──────────┘ └──────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ Path Traversal │ │
│ │ Express │ │
│ │ :6006 │ │
│ └─────────────────┘ │
│ │
│ ──────────── lab-network (bridge) ──────────── │
└─────────────────────────────────────────────────────┘
| Service | Stack | Port | Description |
|---|---|---|---|
| Home | nginx:alpine | 80 | Dashboard with links to all labs |
| LFI | PHP 8.2 Alpine | 6001 | File inclusion lab |
| SQLi | PHP 8.2 + SQLite | 6002 | SQL injection login bypass |
| JWT | Node.js Express | 6004 | Token authentication lab |
| CMDi | Flask + SQLite | 6005 | Command injection in network toolkit |
| Path Traversal | Node.js Express | 6006 | File path traversal in document viewer |
git clone https://github.com/poros-security/ignite.git
cd ignite
docker compose up -dOpen your browser:
- Dashboard: http://localhost
- LFI Lab: http://localhost:6001
- SQLi Lab: http://localhost:6002
- JWT Lab: http://localhost:6004
- CMDi Lab: http://localhost:6005
- Path Traversal Lab: http://localhost:6006
docker compose downFlags are set via environment variables in docker-compose.yml. To customize:
- Open
docker-compose.yml - Find the
environmentsection for each service - Change the
FLAGvalue:environment: - FLAG=ignite{your_custom_flag_here}
- Restart the containers:
docker compose down && docker compose up -d
- Create a new folder:
mkdir newlab - Inside, create:
Dockerfile— container build instructions- App source code (PHP, Node.js, Python, etc.)
.env.example— document required env varsREADME.md— lab description, hints, and learning outcomes
- Add the service to
docker-compose.yml:newlab: build: ./newlab container_name: lab-newlab ports: - "6005:80" environment: - FLAG=ignite{new_flag_here} restart: unless-stopped networks: - lab-network
- Add a card to
home/index.html - Run
docker compose up -d --build
| Problem | Solution |
|---|---|
| Port conflict on 80 | Change the host port in docker-compose.yml: "8080:80" |
| Container won't start | Check logs: docker compose logs <service> |
| Build fails | Ensure Docker is running and try docker compose build --no-cache |
| Old data persists | Run docker compose down -v to remove volumes |
| Permission issues | Ensure Docker has proper permissions on your OS |
Each lab has its own README.md with:
- Description of the challenge
- Step-by-step instructions
- Hints (without full solutions)
- Expected learning outcomes
See: lfi/README.md · sqli/README.md · jwt/README.md · cmdi-flask/README.md · traversal-express/README.md