Challenge / OSINT

ThePuppetMaster

ThePuppetMaster is a sanitized challenge note from the local HTB archive, organized for quick review by category, difficulty, evidence flow, and reusable operator

DocumentedPublished 2025-02-21Sanitized local writeup

Scenario

ThePuppetMaster attack path

ThePuppetMaster is a sanitized challenge note from the local HTB archive, organized for quick review by category, difficulty, evidence flow, and reusable operator

Objective

Challenge walkthrough focused on OSINT evidence, validation, and reusable operator lessons.

ThePuppetMaster sanitized attack graph

Walkthrough flow

01

Inspect static frontend bundle for API endpoints and...

02

Start the API session and save question metadata.

03

Resolve scenario mismatch by prioritizing live API...

04

Identify NZDF evidence image as a Bushmaster...

05

Submit accepted answer components and request final...

Source coverage

High source coverage

Status: complete. This article is generated from 4 sanitized Markdown sources and keeps raw flags, credentials, keys, cookies, and reusable secrets out of the rendered blog.

88% coverage
Evidence verdict

Good confidence: the page has enough source material to read as a complete walkthrough, but the supporting evidence set is smaller than the highest-confidence cases.

  • OSINT/ThePuppetMaster/writeup.md
  • htb-challenge/OSINT/ThePuppetMaster/notes.md
  • htb-challenge/OSINT/ThePuppetMaster/memory-summary.md
  • htb-challenge/OSINT/ThePuppetMaster/hypothesis-board.md

Technical Walkthrough

Writeup

Challenge

  • Name: The Puppet Master
  • Category: OSINT
  • Difficulty: Unknown
  • Remote: <TARGET>:30796

Summary

The supplied chat scenario described a corporate BreachScope investigation, but the live target served a different OSINT challenge. The React bundle exposed an evidence image hosted by NZDF and the API returned five vehicle-identification questions.

The vehicle in the image is a Bushmaster protected mobility vehicle. The live API accepted the answer chain: Bushmaster, Thales Australia, 1997, Australia, and 9 passengers and 1 driver.

Artifact Inventory

  • analysis/http-index-response.txt: app shell.
  • analysis/index.js: frontend bundle with API routes and evidence image URL.
  • analysis/source-image.jpg: downloaded evidence image.
  • analysis/answer-format-attempts-2.txt: accepted answer-format validation.
  • solve/solve.py: reproducible API solve.

Analysis

The frontend bundle calls:

  • POST /api/start-challenge
  • POST /api/submit-answer
  • POST /api/get-flag

/api/start-challenge returns a session id and five questions. The image URL embedded in the bundle points to a NZDF asset. Visual inspection showed Bushmaster vehicles, not NZLAVs.

The first NZLAV/LAV III hypothesis was closed because all submitted variants were rejected by the API. Bushmaster was accepted for question 1, then the remaining accepted values matched Bushmaster OSINT facts and the API's expected answer format.

Solve

Run:

bash
python3 solve/solve.py <TARGET> 30796 --save loot/flag.txt

The script starts a session, submits the five accepted answers, requests the final flag, prints it, and optionally saves it to loot/flag.txt.

Flag

Raw flag is stored in loot/flag.txt.

Lessons

  • Treat live API output as source of truth when the provided scenario conflicts with the deployed target.
  • For OSINT challenge UIs, inspect the frontend bundle before manual browsing; static assets often reveal the primary evidence.

Source-Backed Dossier

The sections below are merged from companion Markdown notes for the same case. They are rendered after sanitization so the article stays precise without publishing raw flags, credentials, or target-specific secrets.

Notes

Scope

  • Challenge: The Puppet Master
  • Category: OSINT
  • Difficulty: Unknown
  • Remote instance: <TARGET>:30796
  • Start time: 2026-05-11T18:31:26Z
  • Operator: Codex

Scenario Mismatch

The prompt supplied in chat described a RivalTech/BreachScope fake-review campaign. The live target at <TARGET>:30796 served a React/Vite OSINT challenge about identifying a military vehicle from a NZDF evidence image. Live target responses were treated as source of truth.

Artifact Inventory

FileSizeSHA256TypeNotes
analysis/http-index-response.txt829<hash redacted>HTTP responseStatic app shell
analysis/index.js160894<hash redacted>JavaScriptFrontend bundle and API calls
analysis/source-image.jpg84699<hash redacted>JPEGNZDF evidence image

Evidence Ledger

TimeActionOutput/FileFindingConfidenceNext
2026-05-11T18:31:26ZFetched /analysis/http-index-response.txtnginx serves React/Vite app titled Puppet MasterHighInspect bundle
2026-05-11T18:31:40ZDownloaded frontend assetsanalysis/index.js, analysis/index.cssBundle exposes /api/start-challenge, /api/submit-answer, /api/get-flagHighQuery API
2026-05-11T18:32:11ZPOST /api/start-challengeanalysis/api-start-response.txtAPI returns five vehicle OSINT questions and session cookieHighIdentify image
2026-05-11T18:33:00ZDownloaded embedded NZDF imageanalysis/source-image.jpgImage shows Bushmaster protected mobility vehiclesHighTest answer formats
2026-05-11T18:34:00ZSubmitted candidate answersanalysis/answer-format-attempts-2.txtAccepted answer set found for all five questionsHighRequest final flag
2026-05-11T18:34:10ZRequested /api/get-flagloot/flag.txtFinal HTB-format flag captured and stored in loot onlyHighWrite solve script

Key Findings

  • Live task is a vehicle-identification OSINT flow, not the RivalTech/BreachScope scenario from the chat prompt.
  • The embedded evidence image is hosted under www.nzdf.mil.nz and shows Bushmaster protected mobility vehicles.
  • Accepted answer components:

- vehicle: Bushmaster

- manufacturer: Thales Australia

- first service year: 1997

- origin: Australia

- capacity: 9 passengers and 1 driver

Secrets/Flags

Raw flags and sensitive material stay in loot/ only. Do not paste them here.

| 2026-05-27T23:35:17Z | backfill | challenge-state.json | Legacy workspace backfilled with deterministic state | High | Validate before further work |

Memory Summary

Metadata

  • Platform: HackTheBox Challenges
  • Category: OSINT
  • Challenge: The Puppet Master
  • Difficulty: Unknown
  • Source workspace: <local workspace>

Validated Solve Chain

  1. Inspect static frontend bundle for API endpoints and embedded evidence URLs.
  2. Start the API session and save question metadata.
  3. Resolve scenario mismatch by prioritizing live API evidence over prompt text.
  4. Identify NZDF evidence image as a Bushmaster protected mobility vehicle.
  5. Submit accepted answer components and request final flag.

Reusable Lessons

  • In HTB web-backed OSINT challenges, frontend bundles may expose the authoritative evidence image and all API routes.
  • If the chat prompt and live API disagree, record the mismatch and proceed from live target evidence.

Dead Ends

  • NZLAV/LAV III identification was rejected by the live API.

Tool Quirks

  • /robots.txt and /sitemap.xml returned the SPA shell rather than useful discovery content.
  • The API required exact-ish accepted strings for some answers, especially capacity.

Evidence Paths

  • analysis/index.js
  • analysis/source-image.jpg
  • analysis/api-start-response.txt
  • analysis/answer-format-attempts-2.txt
  • solve/solve.py

Ingestion Decision

  • Proposed for LightRAG: yes
  • Requires user approval before ingestion: approved for sanitized learning auto-ingest by user instruction
  • Ingested into CTF LightRAG: 2026-05-11T19:22:13Z via track scan_20260511_192213_765c608c

Hypothesis Board

RankPathEvidenceMissing ProofCheapest ValidationConfidenceStatus
1Live API challenge is vehicle OSINT despite RivalTech prompt mismatchBundle embeds NZDF image and API questions ask vehicle identificationExact accepted stringsSubmit candidate answers to /api/submit-answerHighConfirmed

Closed Branches

BranchEvidence TestedFailure OutputReason ClosedRevisit Condition
RivalTech/BreachScope fake-review scenarioStatic bundle and /api/start-challenge responseNo BreachScope/RivalTech strings in live bundle or APILive instance serves different OSINT challengeRevisit if HTB respawns a different instance or user provides another port
NZLAV identificationSubmitted NZLAV/LAV III variantsAll rejected by APIEvidence image is Bushmaster, not NZLAVRevisit only if evidence image changes

Technical analogy

How to remember this solve

Think of OSINT like building a detective board. Each source is one pinned note; the solve comes from connecting the notes that agree with each other and rejecting the ones that only look plausible.

For ThePuppetMaster, keep the mental model simple: identify the trusted assumption, prove it with the smallest safe test, then automate or repeat only the part that directly leads to the flag.