$ / 2 min read/misc

Hollow Houses

A maze of interlinked rooms with no sitemap. The route is a Morse message hidden in the whitespace of a poem.

section
CSAW26
event
ctf.csaw.io ↗
category
misc
status
● solved
target
https://hollow-houses.ctf.csaw.io/

Summary

The site is a maze of interlinked rooms with no site map and nothing useful in the headers. The route through it is a Morse message hidden in the whitespace of a poem, which names the one room holding the flag.

1. The maze

Every room (/atrium/, /ossuary/, /wellspring/, /mirror/, and around fifty more) links to roughly 50 others, so blind crawling gives no gradient.

robots.txt is the entry point:

User-agent: *
Disallow: /internal-monitor/
Disallow: /relay-status/

# the obedient have been answered.

The comment is an invitation to visit what is disallowed.

2. The nudge

One room carries the HTML comment:

<!-- not every word is the colour it appears to be. select all, if you must. -->

Several rooms style text at near-background colours, so a select-all or a tag-stripping fetch is needed to read them. A small crawler that saved each room and printed its comments, stripped text, and any csaw{REDACTED} match did the walking:

curl -sS -o "$N.html" "https://hollow-houses.ctf.csaw.io/$P"
grep -o '<!--[^>]*-->' "$N.html"
grep -oiE 'csaw\{[^}]*\}' "$N.html"

3. The message

/wellspring/ holds a <pre class="elegy"> poem. The words are filler; the gaps are the payload. Per line, each inter-word gap is one Morse symbol — a single space is a dot, two or more spaces a dash — one line is one letter, and a blank line is a word break:

sym = "".join("-" if len(m.group(1)) > 1 else "."
              for m in re.finditer(r"(?<=\S)( +)(?=\S)", ln))

Decoded: THE FLAG LIES WAITING IN THE SANCTUM

4. The room

/sanctum/ carries the flag plainly in <span class="flag breathe"> — no further trick once you know which of the fifty-odd doors to open.

Scripts: ~/ctf/work/hollow/ (f.sh, morse.py, poem2.py)

## challenge files

12 files · 16 KB
  • atrium.html
  • f.sh
  • headers.txt
  • index.html
  • mirror.html
  • morse.py
  • ossuary.html
  • poem.py
  • poem2.py
  • robots.txt
  • sanctum.html
  • wellspring.html
download .zip

flags redacted; flag images and local flag.txt files removed