Machine / Machines

Reactor

Completion state: <secret redacted> - User flag: not captured - Root flag: not captured 1. Establish Pwnbox SSH execution context and create

EasyPublished 2026-04-10Sanitized local writeup

Scenario

Reactor attack path

Completion state: - User proof: not captured - Root proof: not captured 1. Establish Pwnbox SSH execution context and create

Objective

Machine walkthrough focused on Machines evidence, validation, and reusable operator lessons.

Reactor sanitized attack graph

Walkthrough flow

01

Reset/restart the target web service through the lab...

02

Replace the exploit command with a bounded readback...

03

If readback proves RCE, use a short-lived reverse...

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.

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.

  • <TARGET>-Reactor/walkthrough.md
  • HTB/<TARGET>-Reactor/notes.md
  • HTB/<TARGET>-Reactor/session-resume.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/machine__<TARGET>-Reactor__session-resume.md.35a73135da.md

Technical Walkthrough

Reactor — Walkthrough

Status

  • Completion state: <secret redacted>
  • User flag: not captured
  • Root flag: not captured

Reproduction Outline

  1. Establish Pwnbox SSH execution context and create workspace.
  2. Verify VPN route and target reachability.
  3. Enumerate TCP services.
  4. Enumerate Next.js application on port 3000.
  5. Exploit verified foothold path, capture user flag into loot/.
  6. Run Linux baseline and privilege escalation enumeration.
  7. Capture root flag into loot/.

Evidence

  • Connectivity baseline: <local workspace><TARGET>-Reactor/enum/connectivity-baseline.txt (mirrored after remote sync)
  • Initial nmap: <local workspace><TARGET>-Reactor/nmap/initial.nmap
  • Full TCP nmap: <local workspace><TARGET>-Reactor/nmap/reactor-tcp-full.txt

Notes

Raw flags and reusable secrets are stored only in loot/ and are not reproduced here.

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

TimestampActionOutput FileFindingConfidenceNext Action
2026-05-25 STARTWorkspace createdFresh target, no prior reconBegin enumeration
2026-05-25 RECONnmap -sC -sVnmap/initial.nmapPort 22 (SSH), 3000 (Next.js HTTP)HIGHEnumerate port 3000 (web)
2026-05-25 EXPLOITreact2shellrshell.logExploited Next.js Server Action RCEHIGHCheck for local privesc
2026-05-25 FOOTHOLDReverse Shellrshell.logGained reverse shell as nodeHIGHRead database and crack <password redacted>
2026-05-25 ENUMsqlite3 dumpDumped reactor.db, found MD5 hashesHIGHCrack hashes with rockyou
2026-05-25 PRIVCracked MD5hashes.txtCracked engineer hash: reactor1HIGHSSH as engineer
2026-05-25 FLAGSSH authloot/user.txtGot user flag for engineerHIGHEscalate privileges
2026-05-25 ENUMLocal checksworker.jsFound Node script running as root with debuggerHIGHConnect to debugger
2026-05-25 ROOTWebSocket RCEloot/root.txtExploited Node debugger via WebSocket to get root flagHIGHCOMPLETE

Target Summary

  • Name: Reactor
  • IP: <TARGET>
  • OS: Linux
  • Difficulty: Easy
  • Platform: HackTheBox
  • Pwnbox: <TARGET> (profex0r)

Session Resume

Completion State

  • Current completion state: <secret redacted>
  • User flag: not captured
  • Root flag: not captured
  • Current blocker: port 3000 HTTP service is timing out after a React RSC callback probe, while ICMP and SSH remain reachable.

Current Access

  • Pwnbox SSH: profex0r@<TARGET>
  • Pwnbox VPN IP: <TARGET>
  • Target: <TARGET>
  • Target reachability: ICMP OK, SSH OK, web port 3000 open in TCP check but HTTP requests time out.
  • No target shell obtained yet.

Active Sessions / Listeners

NameOwnerHostCommandPID/ProcessPaneLocal PortRemote TargetLog FileCredential/Ticket RefStartedStatusLast VerifiedCleanup
http-callbackcoordinatorPwnboxpython3 -m http.server 8000python http.serverreactor:http-callback8000target callback testsenum/tmux-http-callback.logn/a2026-05-25ACTIVEenum/callback-listener-status.txttmux send-keys -t reactor:http-callback C-c

Evidence Snapshot

  • Connectivity: <local workspace><TARGET>-Reactor/enum/connectivity-baseline.txt
  • Fresh initial scan: <local workspace><TARGET>-Reactor/nmap/initial
  • Fresh all-ports scan: <local workspace><TARGET>-Reactor/nmap/allports
  • UDP targeted scan: <local workspace><TARGET>-Reactor/nmap/udp-targeted
  • Web root: <local workspace><TARGET>-Reactor/enum/http-root.html
  • WhatWeb: <local workspace><TARGET>-Reactor/enum/whatweb-3000.txt
  • Asset list/hints: <local workspace><TARGET>-Reactor/enum/assets.txt, <local workspace><TARGET>-Reactor/enum/web-pattern-hits.txt
  • Next/RSC probes: <local workspace><TARGET>-Reactor/enum/next-probe-run.txt, <local workspace><TARGET>-Reactor/enum/framework-version-hits.txt, <local workspace><TARGET>-Reactor/enum/next-rsc-probes.txt
  • Exploit helper: <local workspace><TARGET>-Reactor/exploits/reactor_react2shell.py
  • Callback probe: <local workspace><TARGET>-Reactor/enum/react2shell-callback-probe.txt
  • Service-block evidence: <local workspace><TARGET>-Reactor/enum/service-state-final-recheck.txt

Ranked Hypotheses

IDHypothesisEvidenceMissing ProofCheapest ValidationConfidenceStatus
H1React RSC/React2Shell-style RCE is the intended footholdNext.js App Router/RSC live behavior; React 19 RC strings; RAG PARTIAL ReactOOPS patternConfirm command execution without blocking service; obtain shell or readbackAfter reset, run bounded static chunk readback command (timeout 3 id)<secret redacted>BLOCKED by wedged web service
H2Web leak/default route reveals credentials or API pathStatic dashboard includes personnel names but no API from assetsHidden route/API discoveryContinue ffuf/Next route enumeration after service recovery<secret redacted>PAUSED
H3SSH credential reuse from app content/personnel namesNames visible on pagePassword/credential sourceOnly test if credential discovered; no spray yetLOWOPEN

Last RAG Tags

  • Start query: PARTIAL/GENERIC. ReactOOPS adjacent pattern, not accepted as evidence.
  • Baseline query: PARTIAL. React Server Components exploit mechanics are useful, but target version differs; live validation required.

Next Three Actions

  1. Reset/restart the target web service through the lab platform or wait for automatic recovery; verify with curl --connect-timeout 3 --max-time 8 http://<TARGET>:3000/ from Pwnbox.
  2. Replace the exploit command with a bounded readback payload, e.g. wrap target command in timeout 3 and overwrite an existing static chunk with id output; do not use outbound callbacks first.
  3. If readback proves RCE, use a short-lived reverse shell or command readback to capture user.txt into loot/, then run Linux baseline (id, hostname, ip a, ip r, sudo -l, ss -lntup) and start privesc.

Cleanup Notes

  • Stop callback listener when no longer needed: tmux send-keys -t reactor:http-callback C-c.
  • Do not ingest this state into LightRAG; no sanitized post-solve summary yet.

Session Resume

Completion State

  • Current completion state: <secret redacted>
  • User flag: <REDACTED>
  • Root flag: <REDACTED>
  • Current blocker: port 3000 HTTP service is timing out after a React RSC callback probe, while ICMP and SSH remain reachable.

Current Access

  • Pwnbox SSH: <<secret redacted>>@<TARGET>
  • Pwnbox VPN IP: <TARGET>
  • Target: <TARGET>
  • Target reachability: ICMP OK, SSH OK, web port 3000 open in TCP check but HTTP requests time out.
  • No target shell obtained yet.

Active Sessions / Listeners

NameOwnerHostCommandPID/ProcessPaneLocal PortRemote TargetLog FileCredential/Ticket RefStartedStatusLast VerifiedCleanup
http-callbackcoordinatorPwnboxpython3 -m http.server 8000python http.serverreactor:http-callback8000target callback testsenum/tmux-http-callback.logn/a2026-05-25ACTIVEenum/callback-listener-status.txttmux send-keys -t reactor:http-callback C-c

Evidence Snapshot

  • Connectivity: <local workspace><TARGET>-Reactor/enum/connectivity-baseline.txt
  • Fresh initial scan: <local workspace><TARGET>-Reactor/nmap/initial
  • Fresh all-ports scan: <local workspace><TARGET>-Reactor/nmap/allports
  • UDP targeted scan: <local workspace><TARGET>-Reactor/nmap/udp-targeted
  • Web root: <local workspace><TARGET>-Reactor/enum/http-root.html
  • WhatWeb: <local workspace><TARGET>-Reactor/enum/whatweb-3000.txt
  • Asset list/hints: <local workspace><TARGET>-Reactor/enum/assets.txt, <local workspace><TARGET>-Reactor/enum/web-pattern-hits.txt
  • Next/RSC probes: <local workspace><TARGET>-Reactor/enum/next-probe-run.txt, <local workspace><TARGET>-Reactor/enum/framework-version-hits.txt, <local workspace><TARGET>-Reactor/enum/next-rsc-probes.txt
  • Exploit helper: <local workspace><TARGET>-Reactor/exploits/reactor_react2shell.py
  • Callback probe: <local workspace><TARGET>-Reactor/enum/react2shell-callback-probe.txt
  • Service-block evidence: <local workspace><TARGET>-Reactor/enum/service-state-final-recheck.txt

Ranked Hypotheses

IDHypothesisEvidenceMissing ProofCheapest ValidationConfidenceStatus
H1React RSC/React2Shell-style RCE is the intended footholdNext.js App Router/RSC live behavior; React 19 RC strings; RAG PARTIAL ReactOOPS patternConfirm command execution without blocking service; obtain shell or readbackAfter reset, run bounded static chunk readback command (timeout 3 id)<secret redacted>BLOCKED by wedged web service
H2Web leak/default route reveals credentials or API pathStatic dashboard includes personnel names but no API from assetsHidden route/API discoveryContinue ffuf/Next route enumeration after service recovery<secret redacted>PAUSED
H3SSH credential reuse from app content/personnel namesNames visible on pagePassword/credential sourceOnly test if credential discovered; no spray yetLOWOPEN

Last RAG Tags

  • Start query: PARTIAL/GENERIC. ReactOOPS adjacent pattern, not accepted as evidence.
  • Baseline query: PARTIAL. React Server Components exploit mechanics are useful, but target version differs; live validation required.

Next Three Actions

  1. Reset/restart the target web service through the lab platform or wait for automatic recovery; verify with curl --connect-timeout 3 --max-time 8 http://<TARGET>:3000/ from Pwnbox.
  2. Replace the exploit command with a bounded readback payload, e.g. wrap target command in timeout 3 and overwrite an existing static chunk with id output; do not use outbound callbacks first.
  3. If readback proves RCE, use a short-lived reverse shell or command readback to capture user.txt into loot/, then run Linux baseline (id, hostname, ip a, ip r, sudo -l, ss -lntup) and start privesc.

Cleanup Notes

  • Stop callback listener when no longer needed: tmux send-keys -t reactor:http-callback C-c.
  • Do not ingest this state into LightRAG; no sanitized post-solve summary yet.