Machine / Machines

Connected

The live respawn at <TARGET> still exposed FreePBX <TARGET> on connected.htb, so the previously validated endpoint branch remained the fastest initial access path. I revalidated the exact endpoint route family, reused the <secret redacted> chain to regain...

DocumentedPublished 2025-12-09Sanitized local writeup

Scenario

Connected attack path

The live respawn at still exposed FreePBX on connected.htb, so the previously validated endpoint branch remained the fastest initial access path. I revalidated the exact endpoint route family, reused the chain to regain...

Objective

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

Connected sanitized attack graph

Walkthrough flow

01

Revalidate FreePBX endpoint route anchors.

02

Reuse the endpoint CVE to regain transient asterisk...

03

Prove the root-side sysadmin_manager watched-filename...

04

Use the same root-side filename pipeline to create...

05

Read root/root.txt from that archive into...

Source coverage

High source coverage

Status: complete. This article is generated from 7 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>-Connected/walkthrough.md
  • HTB/<TARGET>-Connected/notes.md
  • HTB/<TARGET>-Connected/attack-map.md
  • HTB/<TARGET>-Connected/memory-summary.md
  • HTB/<TARGET>-Connected/session-resume.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/machine__<TARGET>-Connected__attack-map.md.fb3535ce8e.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/machine__<TARGET>-Connected__dead-ends.md.3bea054de5.md

Technical Walkthrough

Connected Walkthrough

Raw flags and reusable secrets are stored only under loot/.

Summary

The live respawn at <TARGET> still exposed FreePBX <TARGET> on connected.htb, so the previously validated endpoint branch remained the fastest initial access path. I revalidated the exact endpoint route family, reused the <secret redacted> chain to regain transient asterisk execution, and recaptured user.txt.

For privesc, the strongest live branch was not amportal or dnsmasq. The decisive source-backed primitive was root-owned incrond plus /usr/bin/sysadmin_manager. sysadmin_manager concatenates watched-filename params into system("$hookfile $params"), and its metacharacter filter misses pipe |. A harmless watched filename under /usr/local/asterisk/incron created a root-owned marker, then a watched filename sysadmin.dump-iptables.|tar cf ROOTTAR root created a readable root-owned tar archive. From the asterisk foothold I extracted root/root.txt from that archive into loot/root.txt.

After objective capture, I removed /ROOTTAR and the validation markers, verified asterisk.cron_jobs had no remaining watchTowr rows, deleted the active webshell file, and confirmed the old URL returned 404 Not Found.

Evidence

  • State: target-state.json
  • Notes: notes.md
  • Route + surface revalidation: enum/pwnbox-preflight-respawn.txt, enum/ping-common-respawn.txt, enum/admin-source-respawn.txt, enum/endpoint-watchtowr-shape-probe-respawn.txt
  • Root hook source and watcher proof: enum/incron-watcher-source.txt, enum/sysadmin-hook-sources-live.txt, enum/local-incron-filename-pipe-marker.txt
  • Root copy-out proof: enum/local-incron-tar-validation.txt, enum/root-tar-seed.txt, loot/root.txt
  • Cleanup proof: loot/privesc-cleanup.txt, enum/cron-jobs-cleanup-check.txt, loot/webshell-post-clean-status.txt, enum/webshell-body-after-cleanup.txt

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

FieldValue
PlatformHack The Box / simulated lab
TargetConnected
DifficultyEasy
OSLinux
Active target IP<TARGET>
Hostname/domainconnected.htb
Pwnbox<TARGET>
Attacker/VPN IP<TARGET>
Local workspace<local workspace><TARGET>-Connected
Pwnbox workspace~/htb/<TARGET>-Connected
Prior respawned IPs<TARGET>, <TARGET>
Started2026-06-09T02:06:18Z

Evidence Ledger

Time UTCPhaseCommand/ActionOutput fileFindingConfidenceNext action
2026-06-09T02:06:18Zsetuphtbctl inittarget-state.jsonWorkspace initialized by deterministic harness.HighValidate route and start baseline recon.
2026-06-09T02:03:03Z<secret redacted>Direct Pwnbox SSH preflight against <TARGET> and route to <TARGET>enum/pwnbox-preflight-respawn.txtNew Pwnbox is reachable; tun0 is present; route to <TARGET> is via <TARGET> on tun0; hostname mappings for connected.htb and pbxconnect resolve to the new target.HighValidate the exposed surface on the respawn before reusing any old exploit chain.
2026-06-09T02:03:04Z<secret redacted>ping and common-port check from the new Pwnbox to <TARGET>enum/ping-common-respawn.txtThe respawn is live and exposes the same open TCP set as the prior instance: 22, 80, 443.HighRe-anchor the web product and exact exploit route.
2026-06-09T02:08:04Z<secret redacted>Base HTTP/HTTPS behavior from the new Pwnboxenum/web-base-curl-respawn.txtBoth HTTP and HTTPS on connected.htb still return 302 Location: /admin.HighPull the admin page and confirm product/version anchors.
2026-06-09T02:09:11Z<secret redacted>Pull /admin/ and grep high-value anchorsenum/admin-source-respawn.txtThe respawn still presents FreePBX <TARGET> with /ucp, cxpanel, and the userman asset reference.HighRevalidate the exact endpoint route family before reusing the old exploit chain.
2026-06-09T02:09:40Z<secret redacted>Harmless endpoint route revalidation with browser-shaped headersenum/endpoint-watchtowr-shape-probe-respawn.txtThe exact module=FreePBX\\modules\\endpoint\\ajax&command=model... route still reaches endpoint/views/model.php, while a bad module path still fails separately in Self_Helper.class.php. The old endpoint chain remains source-backed on the respawn.HighRecord a fresh exploit evaluator and re-establish the asterisk foothold on this instance.
2026-06-09T02:09:40Zstale-state-guardHistorical <secret redacted> result retained only in the prior workspace<local workspace><TARGET>-Connected/loot/user.txtThe previous instance reached <secret redacted>, but that flag does not count for the active target. The current respawn remains at BASELINE until foothold and flags are recaptured live.HighContinue on the current IP only.
2026-06-09T03:28:09ZFOOTHOLDRevalidate live sysadmin_manager, module hooks, and dnsmasq service paths from the asterisk webshell footholdenum/sysadmin-path-reality-check.txt, enum/sysadmin-selected-hooks.txt, enum/incron-watcher-source.txtThe live root-side watcher is incrond as root; /etc/incron.d/local watches /usr/local/asterisk/incron with <secret redacted>; /etc/incron.d/sysadmin watches /var/spool/asterisk/incron; /usr/bin/sysadmin_manager still passes $params directly into system("$hookfile $params") and blocks several shell metacharacters but not pipe ``.High
2026-06-09T03:29:56Z<secret redacted>Manual sysadmin_manager execution against sysadmin.dump-iptables.CONTENTS with a pipe payloadenum/sysadmin-contents-pipe-manual-asterisk.txtsysadmin_manager accepts `/usr/bin/touch ...` and executes the piped command under the caller identity. This proves the parser flaw, but not yet the root-side watcher behavior.High
2026-06-09T03:32:00Z<secret redacted>Drop watched filename `sysadmin.dump-iptables.touch <secret redacted> into /usr/local/asterisk/incron`enum/local-incron-filename-pipe-marker.txtThe root-side watcher consumed the request and created /<secret redacted> as root:root. This is live proof that an asterisk-writable watched filename can inject a root command via the unfiltered pipe character.High
2026-06-09T03:35:00Z<secret redacted>Drop watched filename `sysadmin.dump-iptables.tar cf ETCTAR etc into /usr/local/asterisk/incron`enum/local-incron-tar-validation.txtThe same root-side watcher created /ETCTAR as a world-readable root-owned tar archive, proving the pipeline can run a multi-argument command and persist a readable root-owned artifact at /.High
2026-06-09T03:36:00Z<secret redacted>Drop watched filename `sysadmin.dump-iptables.tar cf ROOTTAR root, extract root/root.txt from /ROOTTAR, then delete /ROOTTAR` and validation artifactsenum/evaluator-privesc-20260609T033050Z.txt, enum/root-tar-seed.txt, loot/root.txt, loot/privesc-cleanup.txtThe root-side watcher created /ROOTTAR as a readable root-owned archive; tar xf /ROOTTAR -O root/root.txt from the asterisk foothold recovered the live root flag into loot/root.txt; cleanup removed /ROOTTAR, /ETCTAR, /<secret redacted>, and temporary marker files.High
2026-06-09T05:46:00ZCLEANUPVerify asterisk.cron_jobs for watchTowr leftovers, delete the active webshell file, and confirm the HTTP path is no longer executableenum/cron-jobs-cleanup-check.txt, loot/webshell-post-clean-status.txt, enum/webshell-http-status-after-cleanup.txt, enum/webshell-body-after-cleanup.txtasterisk.cron_jobs has zero rows matching the watchTowr artifact patterns; the active webshell file is absent on disk; the old URL now returns a normal 404 Not Found body with no command execution.HighUpdate cleanup docs, mark the machine COMPLETE, and stop.

Synthesis

Current completion state: COMPLETE.

The active respawn matched the prior instance at the high-value anchors needed to reuse the old endpoint chain, and the root branch is now fully live-proven:

  • 22/tcp, 80/tcp, 443/tcp are open
  • connected.htb still redirects to /admin
  • /admin/ still identifies FreePBX <TARGET>
  • /ucp, cxpanel, and the userman asset references are still present
  • the exact endpoint exploit route still resolves and differentiates correctly
  • incrond runs as root and watches /usr/local/asterisk/incron with <secret redacted>
  • sysadmin_manager still concatenates the watched filename params into system("$hookfile $params")
  • the parameter filter blocks several metacharacters but not pipe |
  • a watched filename payload created /<secret redacted> as root
  • a watched filename payload created /ROOTTAR as a readable root-owned tar archive
  • root/root.txt was extracted from that archive into loot/root.txt
  • asterisk.cron_jobs has no remaining watchTowr rows on the active respawn
  • the active endpoint webshell file was removed and the old URL now returns 404 Not Found

Historical evidence from <local workspace><TARGET>-Connected remained advisory only until revalidated on <TARGET>. The final privesc chain on the active respawn is fully backed by live files under enum/ and loot/.

Raw flags and reusable secrets must be stored only under loot/.

Attack Map

Completion State

COMPLETE

Known Facts

FactEvidenceConfidence
Machine is Connected.Operator scope and official HTB metadata.High
Current active target IP is <TARGET>.Operator update plus enum/pwnbox-preflight-respawn.txt.High
Prior stale target IPs are <TARGET> and <TARGET>.Historical workspaces and operator update.High
Current Pwnbox is profex0r@<TARGET>.Operator update plus enum/pwnbox-preflight-respawn.txt.High
The new Pwnbox has tun0 and a valid route to <TARGET>.enum/pwnbox-preflight-respawn.txtHigh
The respawn exposes 22/tcp, 80/tcp, and 443/tcp.enum/ping-common-respawn.txtHigh
connected.htb still redirects to /admin.enum/web-base-curl-respawn.txtHigh
The web product on the respawn is still FreePBX <TARGET>.enum/admin-source-respawn.txtHigh
/ucp, cxpanel, and the userman asset reference are still present.enum/admin-source-respawn.txtHigh
The exact <secret redacted> endpoint route still resolves on the respawn.enum/endpoint-watchtowr-shape-probe-respawn.txtHigh
The respawned foothold again lands as asterisk.loot/webshell-baseline.txt, loot/post-foothold-baseline.txt, loot/user.txtHigh
incrond runs as root and watches /usr/local/asterisk/incron with <secret redacted>.enum/incron-watcher-source.txt, enum/local-incron-path-check.txtHigh
sysadmin_manager passes watched-filename params into system("$hookfile $params") and does not block pipe ``.enum/sysadmin-hook-sources-live.txt, enum/sysadmin-contents-pipe-manual-asterisk.txt
A watched filename `sysadmin.dump-iptables.touch <secret redacted> created /<secret redacted> as root`.enum/local-incron-filename-pipe-marker.txt
A watched filename `sysadmin.dump-iptables.tar cf ROOTTAR root created /ROOTTAR` as a readable root-owned tar archive.enum/root-tar-seed.txt
root/root.txt was extracted from /ROOTTAR into local loot/root.txt.loot/root.txtHigh
The final webshell file was removed and the old URL returns 404 Not Found.loot/webshell-post-clean-status.txt, enum/webshell-body-after-cleanup.txtHigh
asterisk.cron_jobs has zero remaining watchTowr rows.enum/cron-jobs-cleanup-check.txtHigh

Ranked Hypotheses

RankPathEvidenceMissing proofCheapest validationStatus
1Reuse the validated endpoint <secret redacted> chain to regain transient asterisk execution on <TARGET>.enum/endpoint-watchtowr-shape-probe-respawn.txt, enum/admin-source-respawn.txt, enum/ping-common-respawn.txtActual foothold and recaptured user.txt on the respawn.Run the same public CVE chain from the new Pwnbox and confirm id; hostname; pwd as asterisk.Closed - succeeded
2Abuse the root-side sysadmin_manager watcher through watched-filename params that include an unfiltered shell pipe.enum/incron-watcher-source.txt, enum/sysadmin-hook-sources-live.txt, enum/sysadmin-contents-pipe-manual-asterisk.txt, enum/local-incron-filename-pipe-marker.txtA safe copy-out form that creates a readable root-owned artifact from /root.Use a single-command payload `tar cf ROOTTAR root, then read root/root.txt from the archive through the asterisk` foothold.
3If the pipe injection failed, revisit the dnsmasq/sysadmin mutation branch for a copy-out primitive.enum/sysadmin-selected-hooks.txt, enum/dnsmasq-hook-rootwatch-current-post.txtProof that a root-side restart path can execute a readable copy-out rather than only mutate permissions.Only revisit on a fresh respawn if the stronger filename-pipe branch no longer works.Closed - superseded
4Revisit aiovega, amportal, or localhost services only if the root-side filename injection disappears on a later respawn.Historical workspace plus local source-backed root hook evidenceFresh live proof on the active respawn that the stronger branch is gone.Keep as fallback only on future respawns.Closed - unnecessary

Decision Rule

The current target is the respawned <TARGET> instance. Historical work from <TARGET> remained advisory only until revalidated. The final active chain on <TARGET> was:

  1. Revalidate FreePBX endpoint route anchors.
  2. Reuse the endpoint CVE to regain transient asterisk execution.
  3. Prove the root-side sysadmin_manager watched-filename pipe injection with a harmless marker.
  4. Use the same root-side filename pipeline to create /ROOTTAR from /root.
  5. Read root/root.txt from that archive into loot/root.txt.
  6. Remove /ROOTTAR and validation artifacts.
  7. Verify there are no remaining watchTowr cron rows and remove the active webshell.

Memory Summary

Connected (<TARGET> respawn) reached COMPLETE by revalidating the FreePBX <TARGET> endpoint CVE foothold and then pivoting to a stronger local privesc than the earlier amportal/dnsmasq ideas. The durable lesson is that /usr/bin/sysadmin_manager on this image concatenates watched-filename params into system("$hookfile $params") while missing pipe |, and root-owned incrond watches /usr/local/asterisk/incron with <secret redacted>. A harmless watched filename proved root-side command execution, and a watched filename |tar cf ROOTTAR root produced a readable root-owned tar archive that allowed root/root.txt recovery through the existing asterisk foothold. Cleanup mattered: remove /ROOTTAR and validation markers, confirm no leftover watchTowr cron rows, delete the active webshell, and verify the old URL returns 404.

Session Resume

Last updated: 2026-06-09T05:46:00Z

Current Access

  • Completion state: COMPLETE.
  • Machine: Connected.
  • Category/status: seasonal active HTB machine.
  • Difficulty/OS: Easy / Linux.
  • Active target IP: <TARGET>.
  • Prior stale target IPs: <TARGET>, <TARGET>.
  • Current local workspace: <local workspace><TARGET>-Connected.
  • Superseded prior workspace: <local workspace><TARGET>-Connected.
  • Pwnbox: profex0r@<TARGET>.
  • Pwnbox password is intentionally not stored. Use <secret redacted> only at runtime.
  • Attacker/VPN IP: <TARGET>.
  • Hostname/domain: connected.htb.
  • Route to <TARGET> is validated via tun0.
  • Live service map on the respawn stayed consistent at 22/tcp, 80/tcp, 443/tcp.
  • /admin/ is again a validated FreePBX admin login page.
  • Product/version anchor on the respawn: FreePBX <TARGET>.
  • The transient endpoint webshell foothold was reused to reach asterisk, then removed after cleanup.
  • incrond runs as root and watches /usr/local/asterisk/incron with <secret redacted>.
  • sysadmin_manager concatenates watched-filename params into system("$hookfile $params").
  • The parameter filter blocks several shell metacharacters but misses pipe |.
  • A harmless watched filename created /<secret redacted> as root.
  • A watched filename |tar cf ROOTTAR root created /ROOTTAR as a readable root-owned tar archive.
  • tar xf /ROOTTAR -O root/root.txt recovered the live root flag into loot/root.txt.
  • Privesc cleanup removed /ROOTTAR, /ETCTAR, /<secret redacted>, and temporary marker files.
  • asterisk.cron_jobs has zero rows matching the watchTowr artifact patterns.
  • The old webshell URL now returns 404 Not Found.

Immediate Objective

Stop. The machine is complete on the active respawn; both user.txt and root.txt are captured locally and the live exploit artifacts were cleaned.

Next Three Actions

  1. Keep loot/root.txt, loot/user.txt, loot/privesc-cleanup.txt, and loot/webshell-post-clean-status.txt as the authoritative local evidence refs.
  2. Do not resume exploitation on this respawn unless the operator explicitly asks for replay or extra validation.
  3. On a future respawn, start with route/Pwnbox validation and re-check the watched-filename root hook before assuming the same branch still works.

Stop Conditions

Stop and report instead of continuing if:

  • The target respawns again and invalidates the current loot/ evidence.
  • Any later task would require replaying the root chain without a fresh route/Pwnbox validation.

Session Registry

NameOwnerHostCommandStatusEvidence
pwnbox-sshcoordinator<TARGET>direct ssh/scp for secret-safe exploit executionactiveenum/pwnbox-preflight-respawn.txt, enum/ping-common-respawn.txt, enum/web-base-curl-respawn.txt, enum/admin-source-respawn.txt, enum/endpoint-watchtowr-shape-probe-respawn.txt
endpoint-webshellcoordinatorconnected.htbtransient watchTowr endpoint webshell reused for asterisk command executionclosed after cleanuploot/webshell-base-url.txt, exploits/watchtowr-run.txt, loot/webshell-baseline.txt, loot/post-foothold-baseline.txt, loot/webshell-post-clean-status.txt, enum/webshell-body-after-cleanup.txt
incrond-root-hookcoordinatorconnected.htbwatched-filename pipeline via /usr/local/asterisk/incron into sysadmin_managerclosed after successenum/local-incron-filename-pipe-marker.txt, enum/local-incron-tar-validation.txt, enum/root-tar-seed.txt, loot/privesc-cleanup.txt

Attack Map

Completion State

<secret redacted>

Known Facts

FactEvidenceConfidence
Machine is Connected.Operator scope and official HTB metadata.High
Current target IP is <TARGET>.Operator scope for this run.High
Prior target IP <TARGET> is stale.Previous workspace stalled on unreachable surface.High
OS/difficulty are Linux / Easy.Operator scope and official metadata.High
Current Pwnbox is <<secret redacted>>@<TARGET>.Operator scope.High
The web product is FreePBX <TARGET>.enum/admin-source.txtHigh
The commercial endpoint module is present enough for the CVE route family to resolve.enum/freepbx-surface-validation.txt, enum/endpoint-watchtowr-shape-probe.txtHigh
The exact <secret redacted> module path reaches endpoint/views/model.php on the live target.enum/endpoint-watchtowr-shape-probe.txtHigh
The matched endpoint chain yielded transient command execution as asterisk.exploits/watchtowr-run.txt, loot/webshell-baseline.txtHigh
user.txt is readable from the asterisk foothold and has been captured.loot/user.txt, loot/webshell-baseline.txtHigh
amportal resolves freepbx_engine from /var/lib/asterisk/bin first, and that path is writable by asterisk.enum/privesc-cve-2025-67722-validation.txt, enum/privesc-amportal-paths-live.txtHigh
The prior amportal/incrond trigger attempt did not yield a root-readable copy before the engine was restored.enum/privesc-trigger-postfire.txt, enum/evaluator-privesc-20260608T142730Z.txt, telemetry.jsonlMedium
A root-owned localhost service exists on <TARGET>:4000: python3.6 -m aiohttp.web aiovega.web:app_factory.enum/privesc-amportal-deep-check.txtHigh
Coordinator-to-Pwnbox transport is currently down, and the local Mac still has no HTB route.enum/pwnbox-transport-recheck.txt, enum/local-route-recheck.txtHigh

Ranked Hypotheses

RankPathEvidenceMissing proofCheapest validationStatus
1Endpoint <secret redacted> to transient asterisk code execution.enum/endpoint-watchtowr-shape-probe.txt, exploits/watchtowr-run.txt, loot/webshell-baseline.txtNone for <secret redacted>; foothold is proven.Completed.Proven
2Read user.txt directly from the asterisk foothold./home/asterisk/user.txt is group-readable by asterisk.None; flag captured.Completed.Proven
3Exploit or abuse the root-owned localhost aiovega proxy service on <TARGET>:4000.enum/privesc-amportal-deep-check.txt proves the process is root-owned and bound to loopback.aiovega.web request shape and whether it exposes SSRF, file, or command side effects.Re-establish asterisk foothold and dump/import aiovega.web, then probe <TARGET>:4000 with the discovered parameters.Priority root branch
4Revisit <secret redacted> / amportal only if a stronger root-run trigger is proven.enum/privesc-cve-2025-67722-validation.txt, enum/privesc-amportal-paths-live.txt, enum/privesc-trigger-postfire.txt, telemetry.jsonlA reliable root-side trigger that actually executes the planted wrapper.Re-establish foothold, prove the root trigger path end to end without mutating the engine first, then reassess.Weakened after bounded failure
5Local privilege escalation from asterisk using other localhost-only services or configs.loot/post-foothold-baseline.txt shows local MongoDB, MySQL, Redis, and AMI listeners plus the asterisk shell.A concrete root transition.Re-establish foothold and validate service-specific abuse only if aiovega and amportal close.Active fallback
6UCP/userman fallback.userman is present and browser-shaped auth checks work.Source-backed valid account on this host.Only revisit if endpoint chain becomes unavailable or if user explicitly wants the alternate path documented further.Deprioritized

Decision Rule

The user objective is now <secret redacted>. Continue privesc only after re-establishing asterisk access and recording a privesc evaluator. Prefer the root-owned aiovega localhost service first; keep amportal as a secondary branch unless a stronger trigger is proven.

Dead Ends

Stale Prior IP Branch

BranchEvidenceReason closedRevisit condition
Treat <TARGET> findings as current Connected evidence.<local workspace><TARGET>-Connected shows unreachable target behavior and old Pwnbox details.Target IP has changed to <TARGET>; old reachability failures are not evidence for the new target.Only revisit if HTB UI reassigns <TARGET> again.

Active Dead Ends

BranchEvidenceReason closedRevisit condition
Pre-header userman AJAX controls as a meaningful auth oracle.enum/userman-ajax-controls.txtWithout browser-shaped headers, every harmless control collapsed to ajaxRequest declined - Referrer, so those early results were only front-gate behavior.Revisit only if a future branch needs the exact same-origin request shape again.
Source-backed generic template username as a ready-made foothold.loot/userman-auth-check.txt, /tmp/userman16-htb/Userman.class.php, /tmp/userman16-htb/install.php, /tmp/userman16-htb/Console/Userman.class.phpThe historic userman source identified the legacy generic-template account pattern, but the bounded live credential test did not resolve that username as a valid UCP account on this host.Revisit only if later authenticated access exposes an existing template-creator user in the database.
Generic module=endpoint probing as the exploit path.enum/endpoint-route-controls.txt, enum/endpoint-browser-auth-probe.txtmodule=endpoint reached only auth-gated module logic; the live exploit route was the fully qualified module=FreePBX\\modules\\endpoint\\ajax path instead.Revisit only to contrast pre-exploit controls with the proven CVE route.