
सेल्फ-होस्टेड OWASP CTF किट: एक बॉक्स, एक मुफ़्त GitHub org, कोई क्लाउड निर्भरता नहीं
सुरक्षा-शिक्षण आयोजनों के लिए एक स्व-होस्टेड नियंत्रण तल — एक बॉक्स, एक मुफ़्त GitHub संगठन।
इसे किसी विश्वविद्यालय, हाई स्कूल, OWASP चैप्टर, या मीटअप के लिए चलाएँ।
कोड लिखने से पहले AGENTS.md पढ़ें। यह संचालन
पुस्तिका है: CI जो ठीक-ठीक कमांड चलाता है, इस रेपो में पहले ही आ चुकी
विफलता विधियाँ, और
docs/reviewing.md में दिए गए समीक्षा अपरिवर्तनीय नियम। CLAUDE.md उसी
फ़ाइल की ओर एक संकेत है।
एक परिवर्तन तब तैयार होता है जब CI हरा हो और नवीनतम कमिट पर हर कार्रवाई-योग्य CodeRabbit थ्रेड हल हो चुका हो (या रिकॉर्ड पर अस्वीकार किया गया हो)। कमिट Conventional Commits का पालन करते हैं और उनमें कोई AI एट्रिब्यूशन नहीं होता।
छोटे, सुस्पष्ट काम को
good first issue टैग किया जाता है।
नए मॉड्यूल एक इश्यू के रूप में शुरू होते हैं, PR के रूप में नहीं — देखें
CONTRIBUTING.md।
एक नियंत्रण तल, कोई एकल गेम नहीं। यह बॉक्स किसी आयोजन को उसकी साझा रीढ़ देता है — एक GitHub संगठन, टीम पंजीकरण, एक लाइव लीडरबोर्ड, एक आयोजक एडमिन पैनल, और उसे पोषित करने वाली स्कोरिंग पाइपलाइन। मॉड्यूल उस रीढ़ में चैलेंज सामग्री जोड़ते हैं, और कोई भी उपसमुच्चय अकेले या साथ में चल सकता है: पैच-टू-स्कोर Secure Development, एक Quiz बैंक, एक Jeopardy बोर्ड, और बाहरी रूप से होस्ट किए गए AI चैलेंज। मॉड्यूल अनुबंध रीढ़ और सामग्री के बीच की सीमा है, इसलिए यह बॉक्स आगे और मॉड्यूल — फ़ॉरेंसिक्स, API-सुरक्षा, क्लाउड — को उनके आने पर होस्ट करने के लिए बना है।
यह क्यों मौजूद है। Secure Development मॉड्यूल हमले के बजाय रक्षा सिखाता है, और यह सुरक्षित कोडिंग सिखाने का वास्तव में अच्छा तरीका है। अब तक, इसे चलाने का मतलब था Vercel, Upstash, Lambda और DynamoDB खड़ा करना, क्लाउड बिल उठाना, और एक निजी स्कोरिंग इमेज तक पहुँच रखना। बजट वाले किसी सम्मेलन के लिए यह एक उचित माँग है। किसी विश्वविद्यालय के सुरक्षा पाठ्यक्रम, हाई-स्कूल क्लब, OWASP चैप्टर नाइट, या सप्ताहांत कार्यशाला के लिए यह अनुचित माँग है।
यह किट उसे हटा देता है। सब कुछ Docker Compose से एक ऐसी मशीन पर चलता है जो आपके पास पहले से है — एक लैपटॉप, एक अतिरिक्त डेस्कटॉप, एक छोटा VPS — साथ ही फ़ॉर्क के लिए एक मुफ़्त GitHub संगठन। सभी छह लक्ष्यों के रूब्रिक बॉक्स के अंदर ही आते हैं, इसलिए न कोई निजी इमेज माँगनी है और न कोई स्कोरिंग कोड लिखना है। कुछ भी बिल नहीं होता, कुछ भी घर फ़ोन नहीं करता, और जब आयोजन समाप्त होता है तो आप रेपो संग्रहित कर देते हैं और स्टैक बंद कर देते हैं।
यह किसके लिए है: कोई भी जो इस आयोजन को चलाना चाहता है और ऐसा करने के लिए क्लाउड ऑपरेटर नहीं बनना चाहता — पाठ्यक्रम प्रशिक्षक, क्लब आयोजक, OWASP चैप्टर लीड, कार्यशाला सुविधाकर्ता, आंतरिक प्रशिक्षण दिवस चलाने वाली सुरक्षा टीमें।
तैनात और शुरू से अंत तक अभ्यासित; अभी तक किसी वास्तविक समूह के लिए नहीं चलाया गया। पूरा
स्कोरिंग पथ किट में ही आता है — स्कोरर का bearer-authed POST /score, फ़ॉर्क के लिए
स्व-निहित स्कोरिंग वर्कफ़्लो, पोल ट्रांसपोर्ट — और
scripts/smoke.sh उस पूरी पाइपलाइन को मॉक्स के विरुद्ध चलाता है। इसके अलावा,
यह किट उसी Compose फ़ाइल से एक होस्टेड बॉक्स पर लगातार चलता है जो यह
रेपो भेजता है, GET /health उसकी सेवा करने वाले सटीक रिवीज़न की रिपोर्ट करता है, और उस लाइव इंस्टेंस पर एक
शुरू-से-अंत पास वह जगह है जहाँ वास्तविक दोषों का एक समूह पाया और ठीक किया गया — वैसे दोष जो एक मॉक्ड सूट नहीं देख सकता।
जो नहीं हुआ है वह है एक वास्तविक आयोजन: वास्तविक फ़ॉर्क के विरुद्ध वास्तविक PR खोलने वाले प्रतियोगियों का एक समूह, एक साथ, घंटों तक। यही "पाइपलाइन काम करती है" और "पाइपलाइन 40 लोगों पर काम करती है" के बीच का अंतर है। दो चेतावनियाँ दबाई नहीं गई हैं बल्कि खुली हैं: Security Shepherd परिणाम मैचर की एक बताई गई अवशिष्ट सीमा है (असामान्य रूप से कहा गया इनकार अभी भी एक सॉल्व के रूप में पढ़ा जा सकता है — यह एक सही पैच को कम क्रेडिट दे सकता है, कभी मुफ़्त अंक नहीं दे सकता), और एक पूरे समूह का लोड प्रोफ़ाइल अपरीक्षित है। विवरण और वर्तमान स्थिति: Status and upstream dependencies।
यह जो करता है जो वे नहीं करते: GitHub पुल रिक्वेस्ट के माध्यम से ग्रेड किया गया पैच-टू-स्कोर रक्षा प्रशिक्षण, एक लीडरबोर्ड पर गेम प्रकारों को मिलाने के लिए एक मॉड्यूल अनुबंध, और एक नियंत्रण तल जो पूरी तरह आपका है — एक बॉक्स, एक मुफ़्त संगठन, कोई क्लाउड बिल नहीं, कोई टेलीमेट्री नहीं।
यह परियोजना OWASP Foundation से संबद्ध या समर्थित नहीं है। छह कमज़ोर लक्ष्यों में से चार OWASP परियोजनाएँ हैं (Juice Shop, WebGoat, Security Shepherd, VulnerableApp); DVWA और VAmPI समुदाय परियोजनाएँ हैं।
इसे दो मिनट में चलते हुए देखें — कोई GitHub संगठन नहीं, कोई OAuth ऐप नहीं, कॉन्फ़िगर करने के लिए कुछ भी नहीं। आपको Compose v2 वाला Docker और openssl चाहिए:```sh
git clone https://github.com/OWASP/owasp-ctf-in-a-box
cd owasp-ctf-in-a-box
./scripts/dev-stack up
यह थ्रोअवे लोकल सीक्रेट्स लिखता है, स्कोरर और ऐप इमेज बनाता है, स्टैक को अप करता है, स्कोरर के असली स्कोरिंग API के माध्यम से एक डेमो लीडरबोर्ड सीड करता है, और खोलने के लिए URL प्रिंट करता है। आपको सीडेड टीमों के साथ लीडरबोर्ड और एक स्कोर-ओवर-टाइम ग्राफ दिखना चाहिए; `./scripts/dev-stack score <login> juice-shop 3` लाइव तीन और सॉल्व लैंड करता है। `./scripts/dev-stack down` इसे टियर डाउन करता है।
**गाइडेड विज़ार्ड के साथ एक असली इवेंट चलाएं।** **[`gh`
CLI](https://cli.github.com)** (प्रमाणित) जोड़ें, साथ ही **एक मुफ्त GitHub org** यदि इवेंट Secure Development चलाता है; `./setup/ctf-setup.sh check` पहले टूलिंग को सत्यापित करता है:```sh
./setup/ctf-setup.sh # guided, prompts for values, resumable
यह हर मान को क्रम से पूछता है — आपका box URL, event org, admin
logins, क्या आप Secure Development चलाते हैं, GitHub credentials — .env लिखता है,
हर स्वचालित किए जा सकने वाला चरण करता है, GitHub-UI वाले चरणों में आपका मार्गदर्शन करता है, और यदि
आप रुकते हैं और वापस आते हैं तो फिर से शुरू करता है। बाकी सब कुछ (event का नाम, कौन से modules चलते हैं,
कौन से targets) एक runtime /admin सेटिंग है, इसलिए संपादित करने के लिए कोई config फ़ाइल नहीं है। यह केवल वही पूछता है जो आपको वास्तव में चाहिए: Secure
Development के बिना एक event को कोई org, कोई forks, और कोई scorer image की आवश्यकता नहीं होती, और उनके बारे में कभी नहीं पूछा जाता। किसी भी mutating चरण का --dry-run के साथ पूर्वावलोकन करें — यह एक पहले से पूर्ण .env से चरण
4–9 का वर्णन करता है, और (डिज़ाइन से) मना कर देता है जब कोई admin login न हो, या जब Secure Development चालू हो और कोई org न हो। यह
wizard ./setup/ctf-setup.sh doctor चलाकर समाप्त होता है — एक per-fork status
matrix जिसे आप कभी भी फिर से चला सकते हैं — और फिर एक वैकल्पिक fly.io
deploy प्रस्तुत करता है (डिफ़ॉल्ट नहीं), इसलिए उसी event को एक सार्वजनिक hostname पर रखना एक
निर्देशित प्रवाह है — hostname, एक पूर्वावलोकित deploy, फिर एक पुष्टि — न कि deploy docs से होकर गुज़रना।
विवरण चाहिए? हर अलग subcommand, प्रत्येक UI-only चरण, और दोनों GitHub apps कैसे भिन्न हैं:
docs/hosting.md।
इसके बजाय किसी cloud में? docs/aws.md (Terraform: ECS Fargate,
ElastiCache और एक ALB — apply up / destroy down) या
docs/fly.md (एक Fly machine)।
Secure Development — एक जानबूझकर असुरक्षित app को fork करें, उसमें flaw खोजें, उसे patch करें, एक PR खोलें। fork में एक GitHub Action patch के विरुद्ध target का rubric चलाता है और score leaderboard पर पहुँच जाता है (~30 s बाद poll mode में)। छह targets, 321 challenges; stock 0 स्कोर करता है, एक सही patch अपने points अर्जित करता है — दोनों दिशाओं में gated। इसके लिए GitHub org और scoring pipeline चाहिए।
Quiz — single- और multi-select security प्रश्न, जिन्हें उत्तर देते ही app में grade किया जाता है (multi-select पर all-or-nothing), एक attempt
cap और retry cooldown के साथ। /admin से एक-एक करके लिखे जाते हैं या एक JSON bundle के रूप में import और
export किए जाते हैं। इसके लिए कोई GitHub, कोई forks, कोई pipeline नहीं चाहिए।
Jeopardy — categories में organizer-authored flags का एक board। Submissions को trim और normalise किया जाता है, casing को क्षमा किया जाता है जब तक कि कोई
flag case-sensitive चिह्नित न हो (उसका card ऐसा कहता है), एक submission cooldown
और वैकल्पिक paid hints के साथ। quiz की तरह ही /admin + JSON-bundle authoring।
इसके लिए भी कोई GitHub नहीं चाहिए।
AI — prompt-injection और guardrail challenges जो box के बाहर host किए जाते हैं। प्रत्येक contestant का challenge page उन्हें external site के लिए एक व्यक्तिगत launch link प्रदान करता है; एक solve leaderboard पर वापस रिपोर्ट करता है, या तो उस site के अपने callback के माध्यम से या app में वापस टाइप किए गए flag के माध्यम से। इसके लिए कोई GitHub, कोई forks, कोई pipeline नहीं चाहिए।
आप जो भी modules enable करते हैं, उनके आसपास platform प्रदान करता है: captains, join codes और /join/<code> links के साथ team
self-registration (solo play एक व्यक्ति की team है; कई teammates द्वारा solved एक flag एक बार गिना जाता है); वास्तविक per-solve
timestamps से एक CTFd-style score-over-time graph के साथ live leaderboard; allowlisted /admin panel — freeze, scoring और registration
windows, hints और costs, team cap, cooldowns, module content, per-contestant
support actions, एक activity stream और engagement metrics — सब runtime, कोई
rebuild नहीं; और हर admin action पर एक capped audit log।
| Contestant breakdown | Challenge browser |
|---|---|
![]() | ![]() |
| Jeopardy flag board | Quiz |
|---|---|
![]() | ![]() |
Captured from the contestant app running locally via scripts/dev-stack up
with seeded demo players. Targets and fork links are event-config driven; the
event name and the rest of its branding are admin-panel settings.
एक Docker Compose stack: Caddy Next.js app के सामने TLS terminate करता है;
app Redis से केवल srh (एक Upstash-compatible REST proxy) के माध्यम से बात करता है —
network विभाजित है ताकि internet-facing किसी भी चीज़ का redis:6379 तक कोई route न हो।
Quiz, Jeopardy और AI app के अंदर grade करते हैं और points सीधे Redis में जमा करते हैं।
Secure Development को box के बाहर grade किया जाता है: contestant का fork एक
GitHub Action चलाता है जो target boot करता है, patch के विरुद्ध rubric चलाता है, और
PR पर एक machine-readable score comment पोस्ट करता है। sync poller उन
comments को खींचता है — शून्य inbound network surface, इसलिए box NAT के पीछे और
venue wifi पर काम करता है (यही एकमात्र transport है: push ingest को v0.6 में हटा दिया गया था,
देखें #377)। Score एक ही audited writer के माध्यम से प्रवेश करता है:
scorer का bearer-authed POST /score, जो validate करता है और
monotonically लिखता है — solves को बाद के किसी failing run द्वारा कभी un-solve नहीं किया जाता।
पूरी तस्वीर — components, नौ-चरणीय score data flow, security model — docs/architecture.md में है।
इस module की सामग्री असुरक्षित targets और उनके scoring
rubrics का एक समूह है। Contestants एक target चुनते हैं, org की copy fork करते हैं, उसे patch करते हैं, और
एक PR खोलते हैं। प्रत्येक target के challenges executable node:test suites हैं, जिनकी कीमत
difficulty से तय होती है।
Counts are maintained by hand and pinned to the vendored rubric by
apps/web/src/lib/tests/apps-catalogue.test.ts — re-check them
after a vendor-rubric.sh bump. Reference patches
that prove a correct fix scores (the positive-direction gate) live separately
under patches/.
Rubrics scorer/rubric.owasp/ में रहते हैं, जो
OWASP-CTF/dc34-owasp-secure-development-ctf
से vendored हैं
और scorer/rubric.owasp/PROVENANCE.md में दर्ज एकल upstream commit पर pinned हैं। किसी नए commit के विरुद्ध फिर से vendor करें:```sh
./scripts/vendor-rubric.sh --all --ref
एक साथ दो rubric आकार समर्थित हैं, और एक ही rubric निर्देशिका उन्हें मिला सकती है: `<target>.yaml` फ़ाइलें declarative HTTP request/expect probe व्याकरण का उपयोग करती हैं, और `<target>/tests/challenges/` निर्देशिकाएँ `catalogue.<target>.json` द्वारा मूल्यांकित executable tests का उपयोग करती हैं। लेखन मार्गदर्शिका:
[docs/scorer.md](https://github.com/owasp/owasp-ctf-in-a-box/blob/main/docs/scorer.md)।
**Rubric गोपनीयता पर।** ये rubrics सार्वजनिक हैं। लक्ष्य open source हैं और उनके समाधान पहले से ही प्रकाशित हैं, इसलिए kit rubric गोपनीयता को उत्तर जानने के विरुद्ध सुरक्षा के बजाय check-gaming के विरुद्ध सुरक्षा मानती है — एक self-hosted event के लिए एक स्वीकृत समझौता। किसी भी समय अपने स्वयं के निजी rubric से override करें:```sh
cp -r /path/to/private-rubric scorer/rubric
docker build -t ghcr.io/<org>/score:latest --build-arg RUBRIC_DIR=rubric scorer/
scorer/rubric/ gitignored है और ठीक इसी के लिए आरक्षित है।
एक बार स्टैक आपके EVENT_URL पर चालू हो जाने के बाद:
/admin को संचालित करते हैं: लीडरबोर्ड फ्रीज़ करें, पंजीकरण खोलें और बंद करें, शेड्यूल सेट करें, quiz प्रश्न, classic चुनौतियाँ और ai चुनौतियाँ लिखें — और जब कोई एक प्रतिभागी अटक जाए, तो पूरे इवेंट को रीसेट करने के बजाय उस एक प्रतिभागी को ठीक करें।docker compose logs -f sync के साथ (यह secure-development सक्षम के साथ चलता है)। सारी स्थिति named Docker volumes में रहती है, इसलिए बॉक्स रीबूट होने पर कुछ भी नहीं खोता।./setup/ctf-setup.sh teardown टारगेट रेपो को आर्काइव करता है — फिर आप स्वयं GitHub App अनइंस्टॉल करें और org के Actions secrets हटाएँ। secure-development के बिना एक इवेंट में आर्काइव करने के लिए कोई fork नहीं होता।टीमें, एडमिन पैनल, दिन से पहले किट का सत्यापन, और लोकल dev-stack सब docs/operations.md में शामिल हैं; पूर्वापेक्षाएँ, स्कोर ट्रांसपोर्ट, OAuth सेटअप और इवेंट कॉन्फ़िग docs/hosting.md में।
पूरा तर्क, विकल्प, और ट्रेड-ऑफ़ docs/decisions.md में क्रमांकित ADRs के रूप में दर्ज हैं।
owasp.github.io/owasp-ctf-in-a-box पर रेंडर किया गया।
योगदान का स्वागत है — CONTRIBUTING.md में dev वातावरण, CI गेट्स, और मॉड्यूल प्रस्तावित करने का तरीका शामिल है; CODE_OF_CONDUCT.md लागू होता है।
एजेंट्स को AGENTS.md का पालन करना चाहिए। नीचे दिए गए कमांड CI से मेल खाते हैं; make help वही टारगेट सूचीबद्ध करता है।
प्रत्येक सेवा स्वतंत्र रूप से टेस्ट करती है (सब जगह Node 22):```sh (cd sync && npm ci && npm test) (cd scorer && npm ci && npm test && node tools/vacuous-sweep.mjs) ./scripts/acceptance-scorer.sh # from the repo root — the script lives in scripts/ (cd apps/web && corepack pnpm install --frozen-lockfile && corepack pnpm lint && corepack pnpm test) ./scripts/smoke.sh # the full poll pipeline, end to end
किट में ही कोई भेद्यता मिली? **[SECURITY.md](https://github.com/owasp/owasp-ctf-in-a-box/blob/main/SECURITY.md)** — लक्ष्यों की भेद्यताएँ जानबूझकर हैं और दायरे से बाहर हैं।
## लाइसेंस और श्रेय
MIT — देखें [LICENSE](https://github.com/owasp/owasp-ctf-in-a-box/blob/main/LICENSE)। `scorer/rubric.owasp/` के अंतर्गत रूब्रिक सामग्री अपस्ट्रीम
[OWASP-CTF](https://github.com/OWASP-CTF/dc34-owasp-secure-development-ctf)
इवेंट से वेंडर की गई है, जो `scorer/rubric.owasp/PROVENANCE.md` में दिए गए कमिट पर पिन की गई है — यह किट इसलिए मौजूद है क्योंकि वह इवेंट एक से अधिक बार चलाने लायक था। भेद्य लक्ष्य वेंडर नहीं किए गए हैं: इवेंट उन्हें उनके अपने अपस्ट्रीम से फोर्क करते हैं
([Juice Shop](https://github.com/juice-shop/juice-shop),
[WebGoat](https://github.com/WebGoat/WebGoat),
[DVWA](https://github.com/digininja/DVWA),
[Security Shepherd](https://github.com/OWASP/SecurityShepherd),
[VulnerableApp](https://github.com/SasanLabs/VulnerableApp),
[VAmPI](https://github.com/erev0s/VAmPI)), और प्रत्येक अपना लाइसेंस रखता है।
OWASP® OWASP Foundation का पंजीकृत ट्रेडमार्क है; यह प्रोजेक्ट इससे संबद्ध नहीं है और न ही इसका समर्थन प्राप्त है।
| Target | Challenges | Points | Notes |
|---|
vulnerableapp | 110 | 187 | Largest target; scored 8-way parallel |
webgoat | 69 | 137 | Two-stage build: Maven, then the fork's runtime-only Dockerfile |
dvwa | 55 | 108 | Needs a MariaDB sibling and a schema init |
securityshepherd | 40 | 79 | HTTPS, three-container stack, strictly serial |
juice-shop | 38 | 141 | The only target whose difficulty runs to 6 stars |
vampi | 9 | 16 | Self-contained; the quickest end-to-end proof |
| Total | 321 | 668 | Every event provisions all six; pick a subset in /admin → Secure Development → Targets |
| इसे तब पढ़ें जब आप… | दस्तावेज़ |
|---|
| किट को खड़ा कर रहे हों | docs/hosting.md — पूर्वापेक्षाएँ, विज़ार्ड और हर अलग कदम, स्कोर बॉक्स तक कैसे पहुँचते हैं, GitHub OAuth ऐप, इवेंट कॉन्फ़िग |
| क्लाउड पर डिप्लॉय कर रहे हों | docs/aws.md (Terraform: ECS Fargate + ElastiCache + ALB) · docs/fly.md (एक Fly मशीन) |
| दरवाज़े खोलने वाले हों | docs/security-checklist.md — एक पेज का इवेंट-पूर्व वॉक |
| इवेंट चला रहे हों | docs/operations.md — टीमें, एडमिन पैनल, quiz/classic/ai आयोजक गाइड, सत्यापन, teardown |
| सिस्टम को समझ रहे हों | docs/architecture.md — डायग्राम, स्कोर डेटा फ़्लो, Redis keys, सुरक्षा मॉडल, टेस्टिंग रणनीति |
| रूब्रिक लिख रहे हों | docs/scorer.md — serve + judge मोड, दोनों रूब्रिक ग्रामर, लेखन और बिल्डिंग |
| नया मॉड्यूल बना रहे हों | docs/modules.md — प्लेटफ़ॉर्म/मॉड्यूल कॉन्ट्रैक्ट |
| "यह ऐसा क्यों है?" पूछ रहे हों | docs/decisions.md — क्रमांकित ADRs |