Challenge / Web

NeoVault

Name: - Category: - Difficulty: Raw flag is stored in

DocumentedPublished 2025-09-21Sanitized local writeup

Scenario

NeoVault attack path

Name: - Category: - Difficulty: Raw proof is stored in

Objective

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

NeoVault sanitized attack graph

Walkthrough flow

01

Source and route audit

02

Trust boundary flaw

03

Exploit request chain

04

Admin or proof proof

Source coverage

High source coverage

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

100% coverage
Evidence verdict

High confidence: the page is reconstructed from a primary walkthrough plus multiple supporting notes or evidence sources. Treat the chain as source-backed, while still checking the listed source files for sensitive values.

  • Web/NeoVault/writeup.md
  • htb-challenge/Web/NeoVault/notes.md
  • htb-challenge/Web/NeoVault/memory-summary.md
  • htb-challenge/Web/NeoVault/hypothesis-board.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/challenge__Web__NeoVault__notes.md.83fc55df56.md

Technical Walkthrough

Writeup

Challenge

  • Name:
  • Category:
  • Difficulty:

Summary

Artifact Inventory

Analysis

Solve

Flag

Raw flag is stored in loot/flag.txt.

Lessons

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: NeoVault
  • Category: Web
  • Difficulty: Very Easy
  • Remote instance: <TARGET>:30566
  • Start time: 2026-05-21
  • Operator: jennofrie

Artifact Inventory

FileSizeSHA256TypeNotes
/tmp/neovault_statement.pdf1830-PDFMy initial 1-tx statement
/tmp/neovault_after_transfer.pdf1875-PDFAfter 2 transactions

Evidence Ledger

TimeActionOutput/FileFindingConfidenceNext
T+0GET /-Next.js app, nginx/1.22.1, login+register formsHIGHMap endpoints
T+5JS bundle analysisanalysis/routes.mdTwo API versions v1+v2; full endpoint list; endpointsV1/V2 in chunk 25739HIGHTest each
T+10Register + Login-Auth via HttpOnly cookie (JWT HS256 token); my id=6a0e99ac417f807b49e0c72fHIGHExplore auth
T+15GET /api/v2/auth/me-Returns {_id, username, balance, email}HIGHOther endpoints
T+20POST download-transactions/tmp/neovault_statement.pdfReturns PDF via PDFKit; 1830 bytes for 1 transactionHIGHCheck IDOR
T+25IDOR attempts on download-userId/username/id body params IGNORED — session onlyHIGHOther vectors
T+30Inquire NoSQLi-$ne/$regex/$gt/$lt ALL work — confirmed NoSQL injectionHIGHEnumerate users
T+35User enumeration via $gt-Found: neo_system, user_with_flag (ID: 6a0e982b417f807b49e0c726)HIGHAccess account
T+40Login NoSQLi-Server-side validation blocks objects in email/passwordHIGHOther auth bypass
T+45v1 change-email-500: req.user._id undefined — JWT stores id not _id in v1 middlewareHIGHDead end
T+50v2 change-email NoSQLi-400 — password field rejects objectsHIGHOther paths
T+55JWT crack (30 common secrets)-No match foundMEDIUMLarger wordlist
T+60SSTI in description-{{7*7}} stored literally in PDF — no executionHIGHDead end
T+65Mass assignment (isAdmin:true)-Accepted (201) but no extra privileges in /meMEDIUMDead end

Key Findings

  • NoSQL injection <secret redacted> in /api/v2/auth/inquire endpoint
  • user_with_flag (ID: 6a0e982b417f807b49e0c726) exists — likely holds the flag
  • neo_system is a bot account that sends welcome bonuses to new users
  • download-transactions endpoint uses session only (ignores body params)
  • v1 API has req.user._id bug (undefined) — v1 JWT middleware stores as req.user.id
  • v2 deposit endpoint returns "under maintenance"
  • JWT uses HS256 — weak secret attack possible

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 |

| 2026-05-28T03:11:04Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

FileSizeSHA256TypeNotes
0remote-only or no provided filesNo local artifacts found under files/
2026-05-28T03:11:04Zartifact inventoryanalysis/artifact-inventory.json0 artifact(s) inventoriedHigh

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting? And What is the Challenge Flag, The goal is to find the Flag

| 2026-05-28T03:11:04Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:11:04Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:11:04Z | research task | analysis/research/task-20260528T031104692733Z-ea6f2660.md | Research task created for advisory investigation | Medium | Record research output |

| 2026-05-28T03:17:49Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

| 2026-05-28T03:17:49Z | artifact inventory | analysis/artifact-inventory.json | 0 artifact(s) inventoried | High | Build or update hypotheses |

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting?

| 2026-05-28T03:17:49Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:17:49Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:17:49Z | research task | analysis/research/task-20260528T031749830452Z-99a55cc5.md | Research task created for advisory investigation | Medium | Record research output |

| 2026-05-28T03:40:38Z | local memory record | analysis/local-memory-records.md | Prior local notes reviewed as fallback/advisory context | Medium | Validate against current evidence |

| 2026-05-28T03:40:56Z | checkpoint recorded | analysis/checkpoint-triage-20260528T034056305211Z-37565b3a.md | Checkpoint for TRIAGE | High | Use checkpoint to drive next decision |

| 2026-05-28T03:41:08Z | evaluator | analysis/evaluator-20260528T034108566296Z-cb193739.md | Proceed | High | Use the risky wrapper to revalidate the current live NeoVault surface and then continue the exploit path |

| 2026-05-28T03:54:32Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

| 2026-05-28T03:54:32Z | artifact inventory | analysis/artifact-inventory.json | 0 artifact(s) inventoried | High | Build or update hypotheses |

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting?

| 2026-05-28T03:54:32Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:54:32Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:54:32Z | research task | analysis/research/task-20260528T035432835680Z-66991b4a.md | Research task created for advisory investigation | Medium | Record research output |

Memory Summary

Metadata

  • Platform: HackTheBox Challenges
  • Category:
  • Challenge:
  • Difficulty:
  • Source workspace:

Validated Solve Chain

Concepts only. Do not include raw flags, reusable credentials, tokens, cookies, private keys, or live secrets.

1.

Reusable Lessons

-

Dead Ends

-

Tool Quirks

-

Evidence Paths

-

Ingestion Decision

  • Proposed for LightRAG: yes/no
  • Requires user approval before ingestion: yes

Hypothesis Board

RankPathEvidenceMissing ProofCheapest ValidationConfidenceStatus
1Transfer to user_with_flag triggers bot auto-response with flagneo_system is a bot; user_with_flag inserted right after neo_system (adjacent ObjectIDs)No incoming tx from user_with_flag yetTransfer to user_with_flag, check tx listHIGHOPEN
2Forgot/reset password flow allows account takeoverStandard banking feature; not yet foundNo reset endpoint found in JSProbe /forgot-password, /reset-password, grep JSMEDIUMOPEN
3user_with_flag email is predictableUsername pattern suggests automated accountUnknown emailTry register with common patterns (error = taken)MEDIUMOPEN
4JWT secret crackable with larger wordlistHS256; common secrets failedLarger wordlisthashcat with rockyou.txtMEDIUMOPEN
5download-transactions IDOR via URL query paramBody params ignored; URL params not testedNo evidence yetPOST with ?userId=<secret redacted> in URLLOWOPEN
6NoSQL injection in POST /transactions bodyInquire endpoint injectable; transfer body untestedNo evidenceSend objects in amount/descriptionLOWOPEN

Closed Branches

BranchEvidence TestedFailure OutputReason ClosedRevisit Condition
IDOR body params on download-transactionsuserId/username/id/_id/target/user/recipient/accountAll return session user PDF (1911 bytes)Server uses req.user.id onlyIf source code reveals different param name
NoSQL login bypass{"$ne":null} in email/password fields400 Validation failedServer-side express-validator rejects objectsIf alternate content-type bypasses validation
SSTI in transfer description{{77}}, <%= 77 %>Stored literally in PDFPDFKit not template-basedNever
v1 endpoint exploitationchange-email, deposit, transactions500/deprecated/deprecatedreq.user._id bug; deprecation wrapperNever
Mass assignment isAdminRegister with isAdmin:true201 accepted, /me shows no extra fieldsField stripped or ignoredNever
JWT common secret crack~30 common secretsNo matchSecret not in common listWith larger wordlist
v2 change-email NoSQLipassword: <redacted>"$ne":"x"}400 Bad RequestObject rejected by validatorNever
1initial triage from supplied challenge metadatachallenge name, category, difficulty, scenario, and remote target were provided by operatorinventory files / inspect app surface / map routes depending on category
1initial triage from supplied challenge metadatachallenge name, category, difficulty, scenario, and remote target were provided by operatorinventory files / inspect app surface / map routes depending on category
1initial triage from supplied challenge metadatachallenge name, category, difficulty, scenario, and remote target were provided by operatorinventory files / inspect app surface / map routes depending on category

Notes

Scope

  • Challenge: NeoVault
  • Category: Web
  • Difficulty: Very Easy
  • Remote instance: <TARGET>:30566
  • Start time: 2026-05-21
  • Operator: <<secret redacted>>

Artifact Inventory

FileSizeSHA256TypeNotes
/tmp/neovault_statement.pdf1830-PDFMy initial 1-tx statement
/tmp/neovault_after_transfer.pdf1875-PDFAfter 2 transactions

Evidence Ledger

TimeActionOutput/FileFindingConfidenceNext
T+0GET /-Next.js app, nginx/1.22.1, login+register formsHIGHMap endpoints
T+5JS bundle analysisanalysis/routes.mdTwo API versions v1+v2; full endpoint list; endpointsV1/V2 in chunk 25739HIGHTest each
T+10Register + Login-Auth via HttpOnly cookie (JWT HS256 token); my id= <REDACTED>
T+15GET /api/v2/auth/me-Returns {_id, username, balance, email}HIGHOther endpoints
T+20POST download-transactions/tmp/neovault_statement.pdfReturns PDF via PDFKit; 1830 bytes for 1 transactionHIGHCheck IDOR
T+25IDOR attempts on download-userId/username/id body params IGNORED — session onlyHIGHOther vectors
T+30Inquire NoSQLi-$ne/$regex/$gt/$lt ALL work — confirmed NoSQL injectionHIGHEnumerate users
T+35User enumeration via $gt-Found: neo_system, user_with_flag (ID: 6a0e982b417f807b49e0c726)HIGHAccess account
T+40Login NoSQLi-Server-side validation blocks objects in email/passwordHIGHOther auth bypass
T+45v1 change-email-500: <REDACTED>
T+50v2 change-email NoSQLi-400 — password field rejects objectsHIGHOther paths
T+55JWT crack (30 common secrets)-No match foundMEDIUMLarger wordlist
T+60SSTI in description-{{7*7}} stored literally in PDF — no executionHIGHDead end
T+65Mass assignment (isAdmin:true)-Accepted (201) but no extra privileges in /meMEDIUMDead end

Key Findings

  • NoSQL injection <secret redacted> in /api/v2/auth/inquire endpoint
  • user_with_flag (ID: <REDACTED>
  • neo_system is a bot account that sends welcome bonuses to new users
  • download-transactions endpoint uses session only (ignores body params)
  • v1 API has req.user._id bug (undefined) — v1 JWT middleware stores as req.user.id
  • v2 deposit endpoint returns "under maintenance"
  • JWT uses HS256 — weak secret attack possible

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 |

| 2026-05-28T03:11:04Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

FileSizeSHA256TypeNotes
0remote-only or no provided filesNo local artifacts found under files/
2026-05-28T03:11:04Zartifact inventoryanalysis/artifact-inventory.json0 artifact(s) inventoriedHigh

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting? And What is the Challenge Flag, The goal is to find the Flag

| 2026-05-28T03:11:04Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:11:04Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:11:04Z | research task | analysis/research/task-20260528T031104692733Z-ea6f2660.md | Research task created for advisory investigation | Medium | Record research output |

| 2026-05-28T03:17:49Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

| 2026-05-28T03:17:49Z | artifact inventory | analysis/artifact-inventory.json | 0 artifact(s) inventoried | High | Build or update hypotheses |

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting?

| 2026-05-28T03:17:49Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:17:49Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:17:49Z | research task | analysis/research/task-20260528T031749830452Z-99a55cc5.md | Research task created for advisory investigation | Medium | Record research output |

| 2026-05-28T03:40:38Z | local memory record | analysis/local-memory-records.md | Prior local notes reviewed as fallback/advisory context | Medium | Validate against current evidence |

| 2026-05-28T03:40:56Z | checkpoint recorded | analysis/checkpoint-triage-20260528T034056305211Z-37565b3a.md | Checkpoint for TRIAGE | High | Use checkpoint to drive next decision |

| 2026-05-28T03:41:08Z | evaluator | analysis/evaluator-20260528T034108566296Z-cb193739.md | Proceed | High | Use the risky wrapper to revalidate the current live NeoVault surface and then continue the exploit path |

| 2026-05-28T03:54:32Z | harness init | challenge-state.json | Workspace initialized with deterministic state file | High | Inventory artifacts |

| 2026-05-28T03:54:32Z | artifact inventory | analysis/artifact-inventory.json | 0 artifact(s) inventoried | High | Build or update hypotheses |

Scenario

Neovault is a trusted banking app for fund transfers and downloading transaction history. You're invited to explore the app, find potential vulnerabilities, and uncover the hidden flag within.

Operator Question

What prior HTB web patterns and local challenge notes are most relevant to NeoVault before starting?

| 2026-05-28T03:54:32Z | session bootstrap | notes.md | Challenge metadata, scenario, and prior context seeded into workspace | High | Record initial hypothesis and research |

| 2026-05-28T03:54:32Z | hypothesis recorded | hypothesis-board.md | initial triage from supplied challenge metadata | Medium | inventory files / inspect app surface / map routes depending on category |

| 2026-05-28T03:54:32Z | research task | analysis/research/task-20260528T035432835680Z-66991b4a.md | Research task created for advisory investigation | Medium | Record research output |

Technical analogy

How to remember this solve

Think of the web app like a building with signs on every door. The solve usually comes from reading the map carefully, finding the door the app forgot to hide, then sending the exact request that proves you understand the route.

For NeoVault, 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.