Skip to main content
Admin Modules

Pentest Suite

Tri-node penetration testing toolkit with Sentinel VPS (default), Tarn-Host, and Izar-Host nodes — recon, exploitation, web application scanning, report generation, target management, and automatic failover

February 25, 2026

Pentest Suite

The pentest suite lives under /admin/pentest/* and provides a full penetration testing workflow from the browser. It spans eight pages: Dashboard, Assessment, Console, Recon, Exploit, WebApp, Reports, and Targets. Scans run on one of three nodes — Sentinel VPS (default, external perspective), Tarn-Host (Kali VM on Proxmox Tarn-Host), or Izar-Host (Kali VM on Proxmox Izar-Host) — with automatic failover if the selected node is offline. Node selection is handled via the ?node= query parameter and persisted in localStorage.

Dashboard (/admin/pentest)

The pentest dashboard is the landing page for the suite. It aggregates tri-node health, active scan status, and quick-launch shortcuts into a single view.

Node Health

The dashboard polls two endpoints on a 5-second interval:

  • /api/admin/pentest/nodes — returns the status of all three pentest nodes: Sentinel VPS (external, 178.156.247.186), Tarn-Host (Kali VM at 192.168.20.229), and Izar-Host (Kali VM at 10.42.0.203). Each node reports uptime, version, active scan count, and connectivity latency.
  • /api/admin/pentest/scans — returns all active and recently completed scans for the selected node(s). Each scan entry includes the tool name, target, node, start time, current status (running, completed, failed), and a truncated output preview.

Mode Selector

Four buttons control which node receives scan requests:

  • Sentinel (default) — External VPS, clean public IP, recon-focused toolset
  • Tarn-Host — Kali VM on Proxmox Tarn-Host (Andromeda network), full toolset
  • Izar-Host — Kali VM on Proxmox Izar-Host (Milky Way network), full toolset
  • All — Fan out to all three nodes in parallel

Selection persists in localStorage('pentest-mode'). Legacy both values auto-migrate to all.

Automatic Failover

If the selected node is offline, requests automatically route to the next healthy node in the failover chain: sentinel → Tarn-Host → Izar-Host. A warning banner appears: “Sentinel is offline — routing to Tarn-Host”. Failover is both server-side (API proxy) and client-side (dashboard health check).

Statistics Panel

The stats bar shows aggregate numbers: total scans run (lifetime), scans today, active scans, findings count by severity (critical, high, medium, low, info). These numbers pull from the scan history stored server-side.

Scan History (Live/History Toggle)

The “Recent Scans” table has a Live | History toggle:

  • Live (default) — polls the daemon nodes for currently running and recently completed scans. Updates in real-time.
  • History — fetches persisted scan records from Cloudflare D1 via GET /api/admin/pentest/scans?source=saved&limit=50. Shows all historically saved scans with tool, target, node, status, findings count, and date.

When the History tab loads and D1 returns zero results, an auto-sync triggers: the API fetches scan data from all three daemon nodes, persists completed scans to D1, then re-queries. This bootstraps the history on first use without manual intervention.

Quick Launch

Six quick-launch buttons provide one-click access to common scan types: Nmap Quick Scan, Full Recon, Nikto Scan, SSL Check, DNS Enumeration, and Directory Brute Force. Each button pre-populates the relevant tool page with a default preset and the last-used target.

Sentinel Terminal Card

A “Sentinel Terminal” card on the dashboard links directly to /admin/pentest/console?node=sentinel, providing one-click access to the VPS web shell without navigating through the console page’s node selector.

Assessment (/admin/pentest/assessment)

The vulnerability assessment page provides one-click, multi-phase security assessments that chain together multiple scanning tools into a single workflow. Assessments run entirely on the daemon — the browser can be closed and results persist.

Assessment Profiles

Three pre-built profiles cover different depth levels:

ProfileDurationToolsScope
Quick~5 minnmap, whatweb, testssl, wafw00fPort scan, tech fingerprint, SSL audit, WAF detection
Standard (recommended)~15 minnmap, whatweb, wafw00f, subfinder, testssl + sslscan, nuclei, niktoRecon + subdomain enum + SSL audit + vulnerability scanning
Comprehensive~45+ min14 phases: nmap, whatweb, wafw00f, subfinder, dnsrecon, testssl, sslscan, nuclei, nikto, ffuf, gobuster, XSS, SSRF, LFI, CSRFFull commercial-grade assessment covering recon, SSL, vuln scanning, content discovery, and injection testing

How Assessments Work

  • Daemon-side execution — assessments run on the selected pentest node’s daemon process. Closing the browser does not stop the scan.
  • SQLite persistence — scan data is stored in SQLite on the daemon host. Results survive frontend outages and sync when the page is revisited.
  • Sequential phases — tools execute one after another in order. Each phase shows status (waiting → scanning → done/failed) with finding counts.
  • Live output — clicking a phase expands the ScanOutput component showing real-time terminal output for the currently running tool.
  • Node perspective — Sentinel runs from a public VPS (external attacker view), Tarn-Host and Izar-Host from internal Kali VMs (LAN perspective).

Target Bar

Same sticky target bar as the Recon page: target input, internal toggle, and preset selector (Arcturus-Prime External, Arcturus-Prime Internal, Custom).

Progress Tracker

During execution, a progress section replaces the profile selector showing:

  • Assessment title with profile and target
  • Overall progress bar (percentage of phases completed)
  • Phase list with per-tool status: icon, tool name, status badge (waiting/scanning/done/failed), finding count
  • Live scan output panel for the currently active phase
  • Cancel button to abort the assessment
  • Recent assessments list below showing previous runs with status

Findings Display

When an assessment completes, the detail view shows structured findings from all phases. Each phase’s scan is fetched from the daemon, parsed via tool-specific parsers (nmap XML, nuclei JSON, testssl JSON, nikto XML, sslscan XML, etc.), and findings are aggregated.

Summary Stats

The detail overlay header initially shows generic stat cards (total findings, completed phases, failed phases, total phases). Once findings load and severity counts are computed, the summary row replaces itself with severity-colored stat cards — each card has a colored top border accent matching its severity (red for critical, amber for high, yellow for medium, cyan for low, slate for info) and shows the count for that severity level.

Severity Breakdown Bar

A proportional stacked bar (10px tall) below the summary shows the severity distribution at a glance. A legend row below the bar labels each severity with a colored dot and count. A bottom border separates the bar section from findings.

SeverityColor
Critical#ef4444 (red)
High#f59e0b (amber)
Medium#eab308 (yellow)
Low#22d3ee (cyan)
Info#64748b (slate)

Finding Cards

Findings are grouped by severity (critical → high → medium → low → info). Each group is collapsible — critical through low are expanded by default, info is collapsed to reduce noise. Each finding card has a 2px left border colored by its severity for instant visual scanning. Cards show:

  • Title (0.75rem, bold) + tool badge (which scanner found it) + CVSS score badge (color-coded)
  • Description text (truncated at 300 chars)
  • Affected component with monospace code tag
  • Evidence block (monospace, collapsible toggle with icon)
  • Remediation text (green accent with left border)
  • CVE pills (purple badges, e.g., CVE-2024-xxxx)

Scan Phases List

Below the findings section, a “Scan Phases” header introduces the per-tool phase rows. Each row shows:

  • Status icon (green check, red X, orange spinner, gray circle) in a circular badge
  • Tool name (bold, 0.8rem)
  • Status text (completed/failed/pending)
  • Findings count as a pill badge (orange background for >0, muted for 0)
  • “View Output” button (opens terminal-style scan output viewer)
  • Duration in a subtle badge (e.g., “2m 12s”)

Rows are separated by subtle bottom borders. Section borders separate summary, severity bar, findings, and phases for clear visual hierarchy.

Data Flow

  • Live assessments: Frontend fetches from daemon via SSR proxy → daemon parses structured file on demand → returns findings in response → proxy persists to D1
  • Historical assessments: scans.ts reads findings from D1 directly (no daemon needed)

Node Diagnostics Panel

A collapsible “Node Diagnostics” panel sits between the info panel and the start button. It provides real-time health checks and troubleshooting guidance for all three pentest nodes.

Running Diagnostics

Click “Run Diagnostics” to check all nodes in parallel. The panel shows:

  • Context banner — Detects whether the site is running on Cloudflare Pages or a local dev server. On CF Pages, a warning explains that internal nodes (Tarn-Host, Izar-Host) are unreachable by design.
  • Per-node results — Each node gets a section showing reachable/unreachable status, followed by individual check rows:
    • Proxy-side checks (run by Arcturus-Prime): environment config, network reachability, JSON response validity, Cloudflare context
    • Daemon-side checks (run by the daemon itself): daemon health, database access, tool availability, disk space, zombie scans, scan capacity
  • Issue badge — After running, the panel summary shows a badge with the total issue count (e.g., “3 issues”) or “all pass”.

Each check shows a pass/warn/fail icon, one-line detail, and (where applicable) a fix command in monospace with a copy-to-clipboard button.

Quick Reference Guide

A nested collapsible “Quick Reference” section contains six cards:

CardContent
SentinelExternal VPS on public internet. Only node reachable from production.
Tarn-HostKali VM on Andromeda (192.168.20.x). Full toolkit. Internal only.
Izar-HostKali LXC on Milky Way (10.42.0.x). Full toolkit. Internal only.
Why Tarn-Host/Izar-Host Don’t Work from ProductionCF Pages runs on Cloudflare edge — can’t reach private IPs. Use local dev server or Sentinel.
Assessment ProfilesQuick (~5 min, 4 tools), Standard (~15 min, 8 tools), Comprehensive (~45+ min, 15 tools).
Common Errors”Invalid JSON from daemon” (nginx HTML error page), “All nodes unreachable” (daemons down), “Assessment stuck” (scan tool hung).

Console (/admin/pentest/console)

The console page provides direct access to pentest nodes via embedded terminal and VNC interfaces. A node selector pill bar at the top switches between Tarn (Kali VM on Proxmox Tarn-Host) and Sentinel VPS, with the available tabs changing based on the selected node.

Node Selector

Two pills at the top of the page control which node is active:

  • Tarn (Kali) — connects to the Kali Linux VM (VMID 150) on Proxmox Tarn-Host. Shows three tabs: Desktop (VNC), Terminal, and Web Shell.
  • Sentinel VPS — connects to the Hetzner VPS. Shows only the Web Shell tab (ttyd at sentinel.Arcturus-Prime.com/terminal/). VNC and Terminal tabs are hidden since Sentinel has no Proxmox VM.

The ?node=sentinel or ?node=Tarn-Host query parameter selects the initial node. The default is Tarn (Kali) when no parameter is provided.

VNC Embed (Tarn only)

The VNCEmbed component connects to the Kali VM’s graphical desktop via noVNC. The VNC connection routes through the Proxmox VNC websocket proxy at Tarn-Host (wss://192.168.20.100:8006). Full keyboard, mouse, and clipboard passthrough are supported. Fullscreen mode is available via button, double-click, or F11. The VNC tab loads immediately when the console page mounts with Tarn selected.

Terminal Embed (Tarn only)

The TerminalEmbed component provides an xterm.js terminal connected to the Kali VM’s shell via WebSocket. This tab is lazy-loaded — the terminal connection does not initialize until the user switches to the Terminal tab. The terminal supports ANSI colors, resize events, fullscreen mode (button, double-click), and a 5,000-line scrollback buffer.

Web Shell (Both nodes)

The Web Shell tab embeds a ttyd instance via iframe. For Tarn, it loads http://192.168.20.229:7681/terminal/. For Sentinel, it loads https://sentinel.Arcturus-Prime.com/terminal/. The ttyd instances provide full SSH shell access in the browser.

Recon (/admin/pentest/recon)

The recon page is the primary reconnaissance interface. It provides access to seven scanning tools, all called through /api/admin/pentest/scan/{tool}:

ToolPurposeDefault Options
nmapPort scanning and service detection-sV -sC, top 1000 ports
whatwebWeb technology fingerprintingAggression level 3
subfinderSubdomain enumerationPassive sources only
amassAdvanced subdomain discoveryPassive enum mode
testsslSSL/TLS configuration testingFull checks, JSON output
whoisDomain registration lookupStandard query
dnsDNS record enumerationA, AAAA, MX, TXT, NS, CNAME

Sticky Target Bar

A sticky bar at the top of the recon page persists across tool switches. It contains three controls:

  • Target input — the hostname, IP, or URL to scan. Supports single targets and CIDR ranges for nmap.
  • Node selector — toggle between Izar-Host and Tarn-Host. The selector shows a green/red dot for each node based on the last health check.
  • Preset selector — dropdown with saved target presets (Arcturus-Prime External, Arcturus-Prime Internal, Custom). Selecting a preset populates the target field.

Switching between tools preserves the current target and node selection. Each tool section renders tool-specific options below the sticky bar (port range for nmap, aggression level for whatweb, source selection for subfinder, etc.).

Exploit (/admin/pentest/exploit)

The exploit page provides active exploitation tools. A permanent disclaimer banner at the top warns that these tools perform active exploitation and should only be used against authorized targets.

Available Tools

  • XSS Scanner — tests for reflected, stored, and DOM-based cross-site scripting vulnerabilities. Supports custom payloads and encoding options.
  • CSRF Tester — generates CSRF proof-of-concept forms and tests for token validation weaknesses.
  • SSRF Scanner — probes for server-side request forgery by testing internal URL access from the target’s perspective.
  • LFI/RFI Scanner — tests for local and remote file inclusion vulnerabilities with path traversal payloads.
  • Prompt Injection — tests AI-powered endpoints for prompt injection vulnerabilities using a library of injection payloads.

Each tool accepts a target URL, optional authentication credentials, and tool-specific parameters. Results are streamed through the ScanOutput component and can be exported to the Reports page.

WebApp (/admin/pentest/webapp)

The web application scanning page provides access to eight web-focused scanning tools:

ToolFocusKey Options
niktoWeb server misconfigurationTuning options, plugin selection
nucleiTemplate-based vulnerability scanningTemplate tags, severity filter
ZAPOWASP ZAP active/passive scanningScan policy, spider depth
sqlmapSQL injection detection and exploitationInjection technique, risk/level
ffufWeb fuzzing (directories, parameters)Wordlist selection, match/filter codes
gobusterDirectory and DNS brute forcingMode (dir/dns/vhost), wordlist
wfuzzAdvanced web fuzzingPayload position, encoders
wpscanWordPress vulnerability scanningEnumerate plugins/themes/users

Each tool renders a dedicated options panel with controls specific to that tool’s capabilities. For example, sqlmap shows injection technique checkboxes (boolean, time, union, error, stacked), risk level slider (1-3), and level slider (1-5). Nuclei shows template tag filters and severity checkboxes. All tools share the target input from the sticky bar and route to the selected pentest node.

Reports (/admin/pentest/reports)

The reports page manages scan reports generated from completed scans. Reports are fetched from /api/admin/pentest/reports.

Report Format

Reports support two format modes, toggled with a button in the report viewer:

  • Markdown — rendered Markdown with syntax highlighting for code blocks and findings tables. Suitable for copying into documentation or Gitea issues.
  • HTML — fully styled HTML report with severity-colored finding cards, expandable evidence sections, and a table of contents. Suitable for sharing with stakeholders.

Frontmatter Generation

Each report includes generated frontmatter with metadata: scan date, target, tools used, finding counts by severity, node used, and scan duration. This frontmatter follows the Arcturus-Prime docs collection schema so reports can optionally be saved as documentation entries.

Report Management

The reports list shows all generated reports sorted by date. Each entry displays the target, scan type, finding count, and severity breakdown. Reports can be downloaded, deleted, or opened in the viewer. Completed scans from the Recon, Exploit, and WebApp pages have a “Generate Report” button that creates a report from the scan results.

Targets (/admin/pentest/targets)

The targets page manages scan target presets and custom target definitions.

Preset Targets

Two built-in presets ship by default:

  • Arcturus-Prime External — targets the public-facing Arcturus-Prime infrastructure: Arcturus-Prime.com, gitea.Arcturus-Prime.com, and all Cloudflare-fronted subdomains. This preset includes a Cloudflare bypass toggle that routes scans through the origin IP on Altair-Link (10.42.0.199) instead of through Cloudflare’s CDN.
  • Arcturus-Prime Internal — targets the internal homelab network: Altair-Link (10.42.0.199), Proxmox Izar-Host (10.42.0.2), Proxmox Tarn-Host (192.168.20.100), Meridian-Host (192.168.20.50), and all known internal services.

Custom Targets

Users can create custom target definitions with:

  • Name — descriptive identifier
  • Scope — list of hostnames, IPs, and/or CIDR ranges
  • Notes — freeform notes about the target (authorization scope, known services, etc.)
  • Cloudflare bypass — toggle to route through origin IP for Cloudflare-protected targets

Custom targets are stored server-side and appear in the preset selector dropdown on all scan pages.

ScanOutput Component

The ScanOutput component is shared across the Recon, Exploit, and WebApp pages. It renders a terminal-style output viewer for scan results with the following features:

Streaming Output

ScanOutput uses a dual transport strategy for real-time output:

  1. WebSocket streaming (primary) — connects to a WebSocket endpoint that streams scan output as it is generated. Provides true real-time output with minimal latency.
  2. Polling fallback — if the WebSocket connection fails or is unavailable, the component falls back to polling the scan status endpoint at 2-second intervals. This handles cases where WebSocket connections are blocked by proxies or firewalls.

Viewer Features

  • Auto-scroll — output automatically scrolls to the bottom as new lines arrive. A manual scroll override pauses auto-scroll (detected by scrolling up), and a “Jump to bottom” button re-enables it.
  • Copy — copies the full scan output to the clipboard.
  • Clear — clears the output viewer (does not stop the scan).
  • ANSI color rendering — scan output preserves terminal colors from tools like nmap and nuclei that use colored output for severity and categorization.

Multi-Node Architecture

All scan pages support routing to Sentinel VPS, Tarn-Host, or Izar-Host via the ?node= query parameter. The parameter accepts sentinel, Tarn-Host, Izar-Host, or all and defaults to sentinel when omitted.

Three Nodes, Three Perspectives

NodeLocationNetworkPerspectiveToolset
Sentinel (default)Hetzner VPS, Ashburn VAPublic internetExternal — same view as an attackerRecon-focused (nmap, nikto, nuclei, testssl, subfinder)
Tarn-HostProxmox Tarn-Host, Andromeda192.168.20.0/24Internal — remote site LANFull Kali (20+ tools including sqlmap, hydra, ffuf)
Izar-HostProxmox Izar-Host, Milky Way10.42.0.0/24Internal — local site LANFull Kali (20+ tools)

Node selection affects:

  • Which daemon executes the scan
  • Which Proxmox host the Console page connects to (Tarn-Host/Izar-Host only — VPS has no VNC)
  • Which network perspective the scan runs from

Failover Chain

sentinel → Tarn-Host → Izar-Host

If the selected node is unreachable (5xx or timeout), the API proxy (/api/admin/pentest/[...path]) automatically tries the next node. Response headers indicate when failover occurred:

  • X-Pentest-Node: Tarn-Host — which node actually handled the request
  • X-Pentest-Failover: true — failover was used

Environment Variables (CF Pages)

VariableNodeValue
PENTEST_VPS_DAEMON_URLSentinelhttps://sentinel.Arcturus-Prime.com/pentest-api
PENTEST_VPS_API_KEYSentinel(secret)
PENTEST_DAEMON_URLTarn-Hosthttp://100.70.89.105:8095
PENTEST_API_KEYTarn-Host(secret)
PENTEST_IO_DAEMON_URLIzar-Hosthttp://10.42.0.203:8095
PENTEST_IO_API_KEYIzar-Host(secret)

Running scans from all three nodes provides coverage from three different network vantage points — useful for testing firewall rules, Cloudflare protection, Tailscale ACLs, and routing behavior from external and internal perspectives.

pentestsecuritynmapkaliexploitreconwebappscanningmulti-nodesentinelfailover