πŸ› οΈ Toolkit capabilities

← back to board flag format: NZCSC{...}

Pipeline β€” what happens when you press ⟳ Pull & Recon

1. PullDeterministic
CTFd JSON API (/api/v1/challenges) lists every challenge with id, name, category, description, connection info and attachments; all files are downloaded. Offline mode instead ingests a folder of per-challenge zips.
2. Quickscan (fast lane)Pure python Β· cannot hang
Runs over EVERY file first, before any external tool, so cheap wins always land: flag regex over raw bytes / utf-8 / utf-16 LE+BE, printable-strings extraction, the full recursive decoder sweep, and flag-shaped-token reporting. Every check is individually isolated β€” one failure never stops the others.
3. Text & description reconDeterministic
Challenge name, description, tags and connection info are scanned and run through the recursive decoder.
4. File reconTooled Β· each tool timeout-wrapped
The full forensics/stego bundle per attachment (see below). A hang or crash in one tool affects only that file.
5. Web reconDeterministic
A small core set of expected paths (homepage, robots.txt, sitemap.xml, security.txt, .htaccess), then discovered paths are FOLLOWED (robots.txt Disallow, sitemap <loc>, page links) plus .bak/.old variants. A larger guessy path list is opt-in (CTF_WEB_DEEP), never fired at every challenge on start.
6. BoardStreaming
Every flag and note is posted to the board the moment it is found β€” nothing waits for the run to finish. Challenges are processed 4-way in parallel.
7. SubmitRate-limit aware
Flags are queued, then submitted at most 1 per 7s PER CHALLENGE (plus a small global floor), with exponential backoff on 429, no repeat submissions, and malformed flags rejected before they ever reach the API.

Automated recon by file type

Any file

  • file type + MIME detection, size, tail hex dump
  • strings in ASCII, UTF-16LE, UTF-16BE and UTF-32 encodings
  • exiftool full metadata dump (scanned + decoded)
  • binwalk signature sweep across the WHOLE file, not just the header
  • Embedded/appended file detection + automatic carve (binwalk -e, foremost)
  • Magic-byte / header sanity check; corrupted PNGs are auto-repaired and flagged for viewing
  • OpenSSL Salted__ detection + decrypt attempts with common CTF passphrases

Images

  • zsteg -a (PNG/BMP LSB across all channels)
  • steghide extract with empty password (JPG/BMP/WAV)
  • Headless stegsolve β€” every channel Γ— bit-plane in both bit orders, extracted and grepped; plane PNGs saved for eyeballing
  • QR / barcode decoding (zbarimg) on the image and on each bit-plane
  • pngcheck chunk validation (finds tampered IHDR/CRC)

Audio

  • Spectrogram rendered (sox) + OCR'd (tesseract) β€” catches flags drawn in the spectrum
  • Morse decoded from the amplitude envelope (and from reversed audio)
  • PCM sample LSB extraction, both bit orders, per channel
  • DTMF tone decoding (Goertzel)
  • Reversed-audio spectrogram + re-analysis

Documents

  • Office (docx/xlsx/pptx/odt): unzipped, all XML scanned incl. docProps/custom.xml
  • _rels/*.rels external Targets extracted (next-stage URLs)
  • Embedded media pulled out and recursed for stego
  • PDF: text extraction + metadata scan

Archives

  • zip/7z/tar/gz/bz2/zst extracted and scanned recursively
  • RAR5 via bsdtar (7z cannot read RAR5)
  • Encrypted archives detected and reported (never brute forced)

Network captures

  • tshark protocol hierarchy
  • HTTP requests: methods, hosts, URIs
  • Header mining: User-Agent, Cookie, Referer, Authorization, Server (2025's challenge 3 hid base64 in the User-Agent)
  • DNS queries (exfiltration channel)
  • Plaintext credentials (FTP/HTTP basic/telnet)
  • --export-objects for http/smb/tftp/imf, then recon on everything extracted
  • TCP stream following (first 20 streams)

Memory dumps

  • volatility3 triage: OS detection, then pslist, cmdline, filescan, envars, netscan, hashdump, consoles (Windows) or linux.bash history
  • Strings-first fast path β€” flags often sit in plaintext in RAM

Git repositories

  • Commit messages and author/committer fields (a classic hiding spot)
  • Full history diff (git log -p --all)
  • Stashes, reflog, all branches and packed-refs (finds unmerged/deleted branches)
  • Dangling and unreferenced objects (git fsck + cat-file over all blobs)

Disk / filesystem images

  • sleuthkit: partition table (mmls), recursive file list incl. DELETED files (fls -r), content recovery (icat), fsstat
  • RAID reconstruction: XOR-rebuild a missing RAID5 member across surviving disks, plus RAID0 concat (raid_rebuild.py)
  • foremost/photorec carving fallback; testdisk for partition repair

Hidden document content

  • White / near-white / background-coloured text, vanish runs, tiny font sizes
  • Cropped images: the full original is extracted (crop only hides it visually) β€” hit in both 2023 and 2025
  • PDF: text layer regardless of colour, embedded images pulled out

Web targets

  • Core: robots.txt, sitemap.xml, security.txt, .htaccess (opt-in deep list adds .env/.git/backups/swagger/admin… via CTF_WEB_DEEP)
  • Follows robots.txt Disallow entries, sitemap URLs and page links, then probes .bak/.old/~/.save variants of each
  • Scans headers, cookies (JWT/base64 decoded), and every HTML comment
  • Reports credentials left in page source or JS
  • Reports any 200/401/403/500 that differs from the homepage baseline, and all redirects

Decoders (applied recursively, automatically)

Bases

base64, base64url, base32, base45 (RFC 9285), base58, base62, base85, ascii85, base91

Numeric

hex, binary, octal (escapes + triplets), decimal char codes

Substitution

all 25 Caesar rotations, ROT47, Atbash, Affine (all 312 valid keys), reversed text, frequency-shift guess

Keyed

Vigenère — including a known-plaintext crib attack: because flags start with a fixed prefix, a flag-shaped token reveals the key (this is exactly NZCSC 2024's Substitute Teacher). Keys that the crib cannot verify are reported as notes, never auto-submitted.

Transposition

Rail fence (2–10 rails)

Classical

Bacon, tap code, T9 keypad, NATO phonetic, Morse

Esoteric

Brainfuck (interpreted), JSFuck / JJEncode / AAEncode detection with the decode command

Stego in text

Zero-width Unicode (ZWSP/ZWNJ), trailing-whitespace stego

Other

single-byte XOR (all 255 keys), URL-decode, HTML entities

Layering

All of the above are applied recursively until a flag appears or the decodings are exhausted β€” so hex β†’ base91 β†’ text or base64 β†’ Caesar chains resolve automatically. Successfully-reversed encodings are always explored another layer, even when the intermediate looks like noise.

Tools installed for agents

Stego / images

steghide, outguess, stegseek, zsteg, zbarimg (QR), ImageMagick, pngcheck, tesseract (OCR), Pillow (bit-planes)

Forensics

binwalk, foremost, exiftool, volatility3, tshark/Wireshark CLI, sleuthkit (mmls/fls/icat), testdisk/photorec, RAID rebuild, bsdtar, 7z, qpdf, poppler

Wireless / cracking

aircrack-ng (WPA handshakes + wordlist), john (zip2john/pdf2john), hash length-extension (hashext.py)

Reverse engineering

Ghidra 12 headless (auto-decompiles every function to C), radare2, objdump, gdb, strings/xxd; monodis for .NET IL (full ILSpy on-demand)

Crypto

pycryptodome, openssl, gpg, python (sympy-free RSA maths), the decoder library above

Pwn

pwntools (incl. cyclic), gdb, python

Web / network

curl, requests, sqlmap, nmap, node (JS evaluation), WebFetch

Cracking

john the ripper (with zip2john/pdf2john) β€” used only with wordlists found inside the challenge; blind brute force is prohibited

Audio

sox, ffmpeg, numpy (DSP: morse envelope, DTMF Goertzel, sample LSB)

What the AI agents can do

Operating rules

Everything above runs on the server inside the ctf-kit container. Recon is deliberately layered: the pure-python fast lane always runs first and cannot hang, and every external tool is timeout-wrapped and isolated, so a single broken tool can never take down the run.