$ cat writeup.md…
$ cat writeup.md…
avitoctf
Task: An exposed Aim 3.29.1 service runs inside Kubernetes with a constrained service account and a protected mounted Secret. Solution: Turn CVE-2025-5321 AimQL traversal into RCE, inject a targeted ephemeral container, and exfiltrate the file through its termination message.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
Зри в корень! … в каждый.
The organizer-provided manager provisioned the authorized laboratory at an ephemeral HTTP origin. The lab exposed Aim UI 3.29.1 through Uvicorn. The objective was to move beyond the first web-container secret and recover the protected value deeper in the deployment.
The wording was unusually precise: “look at the root” and “each one” suggested process-specific roots. This eventually mapped to /proc/1/root after entering another container's process namespace.
The manager exposed start, status, extend, and stop operations. Once the instance was ready, the generated lab served an anonymous Aim experiment-tracking interface. /api/projects disclosed /data/repo, and the run-search endpoint accepted AimQL expressions.
The CTFBase predecessor writeup 20260723_avitoctf_mozgopromyv_razvedka documented the key Aim primitive: an AimQL RunView exposes real SDK objects, including the underlying run and repository. Combining a writable metadata tree, log_artifact(), and an absolute artifact destination copied readable files into a temporary Aim repository, where a boolean response-size oracle could recover their contents.
This instance initially had no indexed runs, so there was no RunView from which to start the object-capability chain. A delayed run later appeared with hash 240cd2d31ecf4f30a26db021; its creation was not caused by creating a normal experiment, but its presence made the known chain usable.
Reading the web application's /flag.txt recovered the same value as the predecessor challenge. The platform rejected it, confirming that it was a stage-one marker or decoy rather than the answer for this task. A bounded scan of the Aim container's visible process roots also found only that same decoy, so the solution required leaving the immediate application filesystem.
...
$ grep --similar