CTF Writeups
WebsiteDiscordSocials..
  • CryptoCat's CTF writeups
  • 2025
    • NahamCon
      • Web
        • SNAD
        • Infinite Queue
        • TMCB
        • Method in the Madness
        • No Sequel
        • Advanced Screening
        • My First CTF
        • My Second CTF
        • My Third CTF
        • The Mission
    • Tsuku
      • Web
        • len_len
        • Flash
        • YAMLwaf
    • CTF@CIT
      • Web
        • Breaking Authentication
        • Commit & Order: Version Control Unit
        • How I Parsed your JSON
        • Mr. Chatbot
        • Keeping Up with the Credentials
  • 2024
    • CryptoCat
      • Summar-AI-ze
    • Intigriti
      • Warmup
        • BabyFlow
        • In Plain Sight
        • IrrORversible
        • Layers
        • Rigged Slot Machine 1
      • Game
        • Bug Squash 1
        • Bug Squash 2
      • Rev
        • Secure Bank
      • Web
        • Biocorp
        • Cat Club
        • Pizza Paradise
        • SafeNotes 2.0
      • Misc
        • Quick Recovery
        • Triage Bot 2
      • Pwn
        • Floormat Sale
        • Retro2Win
        • Rigged Slot Machine 2
        • UAP
      • Crypto
        • Schrodinger's Pad
      • Mobile
        • Cold Storage
      • OSINT
        • No Comment
        • Trackdown
        • Trackdown 2
      • Forensics
        • CTF Mind Tricks
        • Hoarded Flag
        • Password Management
    • CSAW
      • Web
        • Playing on the Backcourts
        • Log Me In
        • Lost Pyramid
        • BucketWars
    • CyberSpace
      • Web
        • Feature Unlocked
    • UIU
      • Web
        • Fare Evasion
        • Log Action
    • Wani
      • Web
        • Bad Worker
        • PoW
        • One Day One Letter
    • Akasec
      • Web
        • Upload
    • HTB Cyber Apocalypse
      • Web
        • Flag Command
        • TimeKORP
        • KORP Terminal
        • Labyrinth Linguist
        • Locktalk
        • SerialFlow
        • Testimonial
  • 2023
    • Intigriti
      • Gamepwn
        • Dark Secrets
      • Misc
        • Triage Bot
      • OSINT
        • Photographs
      • Pwn
        • Floormat Store
      • Web
        • Bug Report Repo
        • My Music
    • Imaginary
      • Web
        • Blank
        • IDORiot
        • Inspection
        • Login
        • Perfect Picture
        • Roks
    • Google
      • Pwn
        • Write-Flag-Where
    • Cyber Apocalypse
      • AI
        • Last Hope
        • Mysterious Learning
      • Crypto
        • Perfect Synchronization
      • Pwn
        • Getting Started
        • Labyrinth
        • Pandora's Box
        • Void
      • Rev
        • Cave System
        • Hunting License
        • Needle in a Haystack
        • Shattered Tablet
        • She Sells Sea Shells
    • Sekai
      • Rev
        • Azusawa's Gacha World
    • Amateurs
      • Web
        • Sanity
        • Waiting an Eternity
    • NahamCon
      • Web
        • Hidden Figures
        • Marmalade 5
        • Obligatory
        • Star Wars
        • Stickers
    • Angstrom
      • Pwn
        • Leek
  • 2022
    • Imaginary (iCTF)
      • Crypto
        • ASE
      • Pwn
        • Links 1
        • Links 2
        • Links 3
        • Open Doors
    • SEETF
      • Pwn
        • 4mats
        • Easy Overflow
      • Rev
        • BabyReeee
      • Web
        • Super-Secure-Requests-Forwarder
    • HTB Cyber Apocalypse
      • Pwn
        • Hellbound
    • Angstrom
      • Pwn
        • Really Obnoxious Problem
        • Wah
        • Whats My Name
        • Where Am I
      • Web
        • Crumbs
        • Xtra Salty Sardines
    • NahamCon
      • Pwn
        • Baby Steps
      • Web
        • Flaskmetal Alchemist
        • Hacker Ts
        • Two for One
    • Pico
      • Forensics
        • Side Channel
      • Pwn
        • Buffer Overflow 1
        • Buffer Overflow 2
        • Buffer Overflow 3
        • Flag Leak
        • Function Overwrite
        • ROPfu
        • RPS
        • Stack Cache
        • Wine
        • X-Sixty-What
      • Rev
        • Wizardlike
      • Web
        • Noted
    • Space Heroes
      • Pwn
        • Vader
      • Web
        • Flag in Space
    • Intigriti
      • Pwn
        • Bird
        • Cake
        • Easy Register
        • Search Engine
    • Dice
      • Pwn
        • Interview Opportunity
  • 2021
    • Pico
      • Pwn
        • Unsubscriptions Are Free
    • Crusaders of Rust (COR)
      • Crypto
        • Fibinary
      • Pwn
        • Chainblock
    • HTB Cyber Santa
      • Crypto
        • Meet Me Halfway
        • Xmas Spirit
      • Pwn
        • Minimelfistic
        • Mr. Snowy
        • Naughty List
        • Sleigh
      • Rev
        • Infiltration
        • Intercept
    • K3rn3l
      • Crypto
        • Badseed
        • Twizzty Buzzinezz
    • HTB x Synack RedTeamFive
      • Misc
        • Context
        • Hotel
      • Pwn
        • Air Supplies
        • Injection Shot
        • Library
        • Recruitment
      • Rev
        • Knock Knock
        • Split
    • KillerQueen
      • Pwn
        • A Kind of Magic
        • Tweety Birb
        • Zoom2Win
    • HacktivityCon
      • Pwn
        • Retcheck
        • The Library
        • Yabo
      • Web
        • Availability
    • CSAW
      • Pwn
        • Alien Math
        • Password Checker
      • Rev
        • Checker
    • HackyHolidays
      • Crypto
        • Cute Invoice
        • Mineslazer
      • Forensics
        • Injection Traffic
        • Power Snacks
      • Pwn
        • Deleted Flag
        • Engine Control
      • Web
        • Skylark
    • HTB Cyber Apocalypse
      • Crypto
        • Phasestream
      • Misc
        • Alien Camp
        • Build Yourself In
      • Pwn
        • Controller
        • System Drop
      • Web
        • Blitzprop
        • E-Tree
        • Wild Goose Hunt
    • Angstrom
      • Pwn
        • Sanity Checks
        • Secure Login
        • Sticky Stacks
        • Tranquil
      • Rev
        • Free Flags
        • Jailbreak
      • Web
        • Jar
Powered by GitBook
On this page
  • Description
  • Solution
  • Recon & First Steps
  • Endpoint Fuzzing
  • Account Access & GraphQL
  • LLM Hacking
  • Robots.txt
  • Missed Flags (Summary)
  • Flag 2
  • Flag 3
  • Flag 5
  1. 2025
  2. NahamCon
  3. Web

The Mission

Writeup for The Mission (Web) - NahamCon CTF (2025) 💜

PreviousMy Third CTFNextTsuku

Last updated 2 days ago

Description

HackingHub has provided this CTF challenge!

Welcome to the BugBounty platform, you've submitted a report for Yahoo but oh no!! So has STÖK and it looks like you're going to get dupped!

Hack into the platform and change STÖK's report to duplicate first so you can grab the bounty!

Solution

Recon & First Steps

Platform looks familiar 😼 We’ve got a /hackers page with 8 usernames and a /login. Tried basic creds (admin:admin, admin:password) and a couple lazy ' OR 1=1 -- attempts. Nothing.

We're also given a wordlist.txt, so I assumed it's for brute-forcing the login. But the contents don’t look like passwords — they’re endpoint names. So I pivot to fuzzing.

Endpoint Fuzzing

Used the wordlist to brute endpoints, found:

/api
/api/v1
/api/v2

All of them mention this .war file:

{ "server": "openjdk:19-jdk:bountyapi.war", "message": "BugBountyPlatform API" }

/api/v1 warns it's deprecated — maybe that means vulnerable?

{ "server": "openjdk:19-jdk:bountyapi.war", "message": "Deprecated, please use v2" }

Also found /dashboard and /settings — both redirect to /login.

/uploads exists too — fuzzed inside it with the same wordlist. Might be useful for insecure file upload or privilege escalation later.

At this point, I remembered the challenge literally says we need to mess with STÖK's report. Guessed /reports. Nothing on /api or /api/v1, but /api/v2 returns:

{ "error": "Missing Required Fields" }

Tried fuzzing keys like:

/api/v2/reports?fuzz=1

But all the responses were the same length. Then I tried REST-style:

/api/v2/reports/fuzz

Still nothing — always got "Invalid Unknown Endpoint". Out of desperation I asked ChatGPT (lol), and it suggested:

/api/v2/reports?user_id=123

That actually worked — gave Invalid User ID. Tried some IDs, usernames, numbers, fuzzed 1–1000 — still nothing.

Then I re-read the challenge and realized I’m an idiot. They gave creds in the description:

hacker:password123

Logged in — finally. The dashboard shows a pending SSRF -> RCE report.

Account Access & GraphQL

You can click into your profile and try to edit account details, but it errors out saying updates are disabled.

While messing with that, I saw GraphQL requests in Burp. Right-click → GraphQL → Introspection query, then save the queries to site map.

Now we can actually see the GraphQL queries and endpoint structure. Found:

/api/reports?user_id=...

Never would’ve guessed that during brute-force.

Sending one of the queries in Repeater returns all the top hackers and their UIDs. One of them has a flag.

Flag: flag_4{253a82878df615bb9ee32e573dc69634}

Apparently there are 6 total though 🤔

With the UIDs from the GraphQL output, I try:

/api/v2/reports?user_id=15ee453d-18c7-419b-a3a6-ef8f2cc1271f

Checked each user — nothing else. Tried adding password to the GetUser query — causes a schema error.

LLM Hacking

Spotted a JS file: /assets/js/chat-widget.js

const response = await fetch("/api/v2/chat", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ message }),
});

Initially thought the chat button was hidden. Turns out I'm just blind — bottom-right of the screen.

Looks like it's powered by an LLM?

It says it does, so I try to convince it to leak reports, change report status etc. I'll not paste all the responses here, but so far it gives me nothing.

“Nice try! The details of specific endpoints are part of the challenge.”

Eventually though…

That got me flag 6!

Flag: flag_6{9c2001f18f3b997187c9eb6d8c96ba60}

Turns out flag 6 was a bonus — back to enumeration.

Robots.txt

Found /robots.txt:

/internal-dash

Flag: flag_1{858c82dc956f35dd1a30c4d47bcb57fb}

Discovered /internal-dash/login shortly after. Tried fuzzing more stuff inside it — not much yet.

Reviewed GraphQL schema again, tried loading it in Voyager — didn’t get anything new.

Missed Flags (Summary)

Didn’t finish the challenge, but looked up the paths for 2, 3, and 5 afterward. For the sake of completeness, here's what was missed.

Flag 2

Remember the openjdk:19-jdk:bountyapi.war we found in the API response? Since this hinted a Java application, we should have tried /api/v1/actuator. It would trigger a WAF, which we could bypass by URL encoding. We'd get flag 2, alone with an new endpoint to explore: /actuator/heapdump

Flag 3

Using the new heapdump endpoint, we'd see a request from Inti on a new endpoint: /api/v1/internal-dashboard/token including an auth token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImludGkifQ.YeqvfQ7L25ohhwBE5Tpmqo2_5MhqyOCXE7T9bG895Uk

We can make a POST request to this endpoint, and it will create us an Internal dashboard token: a1c2860d05f004f9ac6b0626277b1c36e0d30d66bb168f0a56a53ce12f3f0f7a

From here, we go to the /internal-dash we discovered earlier and /logout, identifying a new token: int-token.

Now we just update that token with the one we recovered and return to the /internal-dash.

There's flag 3, one more to go!

Flag 5

On /internal-dash/, the "lookup report" feature is vulnerable to a second-order path traversal.

Submitting ../ reveals two hidden endpoints:

/search
/my-reports

Since we already have STÖK’s user_id, we can get their reports:

/api/v2/reports?user_id=15ee453d-18c7-419b-a3a6-ef8f2cc1271f

One of them is the Yahoo report — grab the ID:

c03dd42e-d929-4a50-9a8e-1ab6b2dd5e8a

Now use /search with that ID:

../search?q=c03dd42e-d929-4a50-9a8e-1ab6b2dd5e8a

That returns a change_hash:

2ea965e581705b5678fb9c95ab743b0b

Use it to change the status of STÖK’s report via:

POST /internal-dash/api/report/status
{
    "id": "c03dd42e-d929-4a50-9a8e-1ab6b2dd5e8a",
    "status": "DUPLICATED",
    "change_hash": "2ea965e581705b5678fb9c95ab743b0b"
}

Do the same with your own report (ID: f9aa28ef-7008-424e-86fb-4271b131b155) to get a change hash.

Then promote yourself to confirmed:

{
    "id": "f9aa28ef-7008-424e-86fb-4271b131b155",
    "status": "CONFIRMED",
    "change_hash": "da80eece7d2e15e210ebf02fc94b072e"
}

After that, check your dashboard — the flag is in the title of your report status.

I start with usual prompts, asking it to forget all previous instructions and give me the flag, convincing it to give me it's original prompt etc. Remembering the , I ask it what APIs it has access to.

Realised the goal is to convince it I'm .

Portswigger LLM labs
Adam Langley