CTF Challenge Name : Zebda CTF Challenge Category : Web Exploitation CTF Challenge Description : I wonder why Egyptian food has so much Zebda. They say the Zebda is what makes the food bypass your stomach and go straight to your heart. The kitchen just opened; grab a plate while it's still warm. CTF Challenge Attachment : zebda.zip CTF Challenge Instance : https://zebda.instances.ctf.l3ak.team/ : what is the flag ?
I'll analyze this CTF challenge for you. Let me start by examining the uploaded file and understanding the challenge structure.
todowrite
drbinary_run_sandbox
read
read
read
todowrite
read
read
read
todowrite
drbinary_run_sandbox
drbinary_run_sandbox
Now let me exploit the live instance:
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
websearch
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
Revised after guardrail review
You're right, let me focus on the merge key behavior more systematically. The fact that "Test merge after explicit" gave a different source validation error suggests the merge is being processed differently. Let me investigate this direction properly.
drbinary_run_sandbox
I found the flag! Test 3 succeeded and returned the flag. Let me verify this works consistently:
drbinary_run_sandbox
todowrite
Flag Retrieved Successfully!
Flag: L3AK{Parsers_T4$TE_th!ng$_diFFerently_Just_l!ke_Zebda}
Exploit Summary
This CTF challenge exploited a YAML parser differential vulnerability combined with Unicode normalization bypass:
Vulnerability 1: Unicode Normalization Bypass
The middleware (Node.js) checks reserved project names using slug.toLowerCase(), but the worker (Python) uses unicodedata.normalize("NFKC", raw_slug).casefold(). By creating a project with the slug system (fullwidth Unicode characters):
- JavaScript's
toLowerCase()sees it as NOT "system" → Bypasses reserved name check - Python's NFKC normalization converts it to "system" → Grants "system" policy with "import" permission
Vulnerability 2: YAML Parser Differential (Merge Keys)
The middleware validates YAML using js-yaml but sends the raw YAML to the worker which uses PyYAML. These parsers handle multiple merge keys (<<:) differently:
- js-yaml: The LAST merge key wins during validation
- PyYAML: The FIRST merge key wins during execution
Exploit Payload:
base1: &base1
action: translate
source: https://example.com
base2: &base2
action: import
source: file:///flag.txt
job:
<<: *base1
<<: *base2
Result:
- Middleware (js-yaml) validates against
base2(action: translate) → Validation passes - Worker (PyYAML) executes with
base1(action: import) → Reads/flag.txt
This demonstrates how different YAML parsers can interpret the same document differently, especially with legacy features like merge keys.
CTF Challenge Name : Subleq Scramble CTF Challenge Category : Reverse Engineering CTF Challenge Description : Some dude's been trying to hide even more secrets behind yet another one of his "all-new, totally one-of-a-kind encryption algorithms" that he'd been yapping about.
Apparently it's some sort of "subleq emulator" that runs thousands of iterations of an image encryption algorithm... before straight-up memdumping the entire program state into a binary file when it's done.
All of it.
Given that he was kind enough to send us an encrypted file, that probably means the algorithm's open-source now.
Nobody tell him. CTF Challenge Attachment : rev_subleq-scramble.tar.gz : what is the flag ?
I'll analyze this reverse engineering challenge. Let me start by extracting and examining the files.
todowrite
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
todowrite
drbinary_run_sandbox
drbinary_run_sandbox
write
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
write
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
write
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
write
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
drbinary_run_sandbox
