$ cat writeup.md…
$ cat writeup.md…
alfactf
Task: an intranet web service exposed a boss bot, a custom FastAPI dispatcher, and nginx caching in front of authenticated APIs. Solution: turn boss-only JSON endpoints into fake .png paths, let the authenticated bot prime nginx cache, then reuse the leaked vacation code to trigger the flag endpoint.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
Никто, конечно, не чиллил
Сервис: noonechilled
The target was a corporate intranet service at https://noonechilled-gvgof6lm.alfactf.ru. Source code was provided, and the goal was to recover a boss vacation code and use it as an employee to reach the flag.
This challenge was a four-bug chain:
Together, these issues turned a boss-only API response into a public cached .png URL.
The Docker topology in docker-compose.yml immediately exposed the interesting trust boundaries:
nginx,http://nginx / http://backend,API_BASE_URL=http://nginx,[email protected] / WhiteboxBossPassword123! in the local compose file.That suggested two useful directions: look for proxy/cache behavior in nginx, and inspect whether the bot can be induced to fetch attacker-controlled URLs from inside the Docker network.
The main routing bug is in backend/app/api/http_dispatch.py:
def match(self, method: str, segments: list[str]) -> dict[str, str] | None: if method != self.method or len(segments) < len(self.pattern): return None params: dict[str, str] = {} for part, segment in zip(self.pattern, segments): if isinstance(part, PathParam): params[part.name] = segment continue if part != segment: return None return params
...
$ grep --similar