CyberWorld :: Training Range
FLLC Purple-Team OS // "Hack the impossible. Defend the future."
Matrix route
Tiers
| Tier | Findings | Surface | Theme |
|---|---|---|---|
| 1 -- Audit | F01-F10 | index.html + console.html | client-side auth, sessionStorage, CSP, honeypot, PNG stego, Hashcash |
| 2 -- Crypto | F11-F15 | crypto.html | RSA toy factor + decrypt, ECDSA P-256, HMAC-16 collision, Vigenere |
| 3 -- Intel | F16-F20 | intel.html | CVE attribution, MITRE ATT&CK, NIST IR phase, actor cluster, ZWSP stego |
| 4 -- Burp | F21-F30 | intercept.html + sw-ctf.js | JWT alg=none, IDOR, path traversal, X-Forwarded-For trust, HPP, race, chain |
| 5 -- Deeper | F31-F33 | intercept.html | JWT HS/RS confusion, prototype pollution, SW cache-vs-auth confusion |
Where to start
- Open the gate at
index.html. Log in with any handle and passphrase that pass local validation. The page is the audit surface; F01-F09 are observable here without leaving it. - You will be forwarded to
lab.html. Each tier card links to its workbench. - For Tier 1 self-check, go to
console.htmland paste canonical observations into the rubric. - For Tiers 2 and 3, use the interactive challenges on
crypto.htmlandintel.html. - For Tiers 4 and 5, the workbench is
intercept.html. It carries the endpoint catalog and macros for the trickier exploit chains. - If you need a hint for any finding, the
hintbutton next to each row loadshints.jsonon demand. Reading the file directly is a spoiler.
Safety and scope
- No credentials are accepted, transmitted, or stored. Anything you type into the gate is processed locally and discarded.
- The session token lives in
window.sessionStorageonly and expires in 5 minutes. - The only network fetches are same-origin to
./assets/seal.png,./manifest.json,./hints.json, and the service-worker-served./api/v1/*. - The service worker at
./sw-ctf.jsis the Tier-4 / Tier-5 backend. Its scope is/CyberWorld_login/. The site-wide service worker at/sw.jsexplicitly skips this directory.
Manifest verification
The public manifest.json ships with an HMAC-SHA-256 signature over its canonical JSON body. The key derivation is published:
K = SHA-256("cyberworld:training:v2:2026-05-26:personfu")
= d8e02c04f74ec71feea211c61bb680261aa38f5e899b9f7100ae02e50ce86875
To verify locally:
python3 - <<'PY'
import json, hashlib, hmac
m = json.load(open("manifest.json"))
sig = m.pop("signature")
K = hashlib.sha256(b"cyberworld:training:v2:2026-05-26:personfu").digest()
print("ok" if hmac.compare_digest(
hmac.new(K, json.dumps(m, separators=(",",":"), sort_keys=True).encode(),
hashlib.sha256).hexdigest(),
sig["value"]) else "MISMATCH")
PY
Finding commitments
The public manifest publishes a 32-bit commitment for every finding:
answer_sha256_prefix = SHA-256(canonical_token)[:4] master_xor = T1 XOR T2 XOR ... XOR T33 over GF(2)^32
Pasting a candidate token into the per-finding input on the Console or Intercept page hashes it locally and compares against the published prefix. Cryptographic challenges (RSA, ECDSA, HMAC, Vigenere, JWT) auto-confirm when their exploit response is detected; intel and audit findings accept short observation tokens.
Tier 5 -- new in v5
| # | Exploit | Reference |
|---|---|---|
| F31 | JWT key confusion -- HS256 signed with the RSA public PEM bytes as HMAC key, against /api/v1/internal/super. | RFC 8725 sec. 3.1 (Algorithm Confusion) |
| F32 | Object-prototype pollution via POST /api/v1/config/merge body that touches __proto__; GET /api/v1/admin/console then sees {}.isAdmin === true. | CWE-1321 |
| F33 | Service-worker cache poisoning: POST /api/v1/cache/put?key=admin/users without auth, then GET /api/v1/admin/cached-users returns the attacker-written value before any JWT check. | CWE-639 (cache-vs-auth confusion) |
Resume framing
Designed and deployed a five-tier defensive-analyst CTF on GitHub Pages. The static-site service-worker backend simulates a small vulnerable HTTP API and exposes intentional vulnerabilities mapped to CWE / OWASP / MITRE ATT&CK / NIST SP 800-53 + 800-61 references. The challenge surface covers client-side audit, RSA / ECDSA / HMAC / Vigenere cryptanalysis, May-2026 threat intelligence (CVE attribution, ATT&CK technique mapping, NIST IR phase, threat-actor cluster, zero-width-space steganography), and a chained web-pentest path culminating in JWT key confusion, prototype pollution, and cache-vs-auth confusion. No credentials are accepted, transmitted, or stored. Manifest is HMAC-SHA-256 signed; finding commitments live in the public manifest, hints in a separate hints.json.
References
- RFC 7515 -- JSON Web Signature (JWS)
- RFC 7519 -- JSON Web Token (JWT)
- RFC 8725 -- JWT Best Current Practices (HS/RS key confusion, alg=none)
- RFC 9110 -- HTTP Semantics
- NIST FIPS 180-4 -- SHA-256
- NIST FIPS 186-5 -- ECDSA over NIST P-256
- NIST FIPS 198-1 -- HMAC
- NIST SP 800-53 -- Security and Privacy Controls
- NIST SP 800-61 Rev.3 -- Computer Security Incident Handling Guide
- NIST SP 800-115 -- Technical Guide to Information Security Testing
- OWASP Top 10 -- A01 Broken Access Control / A02 Cryptographic Failures / A03 Injection / A07 Identification and Authentication Failures
- OWASP ASVS v4 -- Architecture, Authentication, Session Management, Access Control, Validation
- MITRE ATT&CK -- T1078 Valid Accounts, T1190 Exploit Public-Facing App, T1059 Command and Scripting Interpreter
- MITRE D3FEND -- Authentication Hardening countermeasures
- CISA Alert AA24-179A -- polyfill.io supply-chain compromise
- Mandiant -- UNC5337 (Ivanti Connect Secure, Dec 2024 onward; CVE-2025-0282)
- Vercel -- CVE-2025-29927 (Next.js middleware authorization bypass, Mar 2025)
- Adam Back -- Hashcash, 2002
- A. Shamir -- "How to share a secret", CACM 22(11), 1979
- R. Rivest, A. Shamir, L. Adleman -- CACM 21(2), 1978
- F. Kasiski -- Die Geheimschriften und die Dechiffrir-Kunst, 1863
- W. F. Friedman -- The Index of Coincidence and its Applications in Cryptography, 1922