Security Scan Report

Target: https://paragonroyale.com
Scan ID: 8c068fb6-1ca8-46de-84cb-87561bc6c60e
Date: 2026-03-21 06:53 UTC • Duration: 669s • Tools: 26

Overall Risk Rating
medium

paragonroyale.com presents a moderate attack surface with a Python/Uvicorn backend behind Caddy, exposed admin endpoints without apparent authentication enforcement, and missing security headers. No critical vulnerabilities like SQL injection or XSS were confirmed by automated tools, but the exposed administrative API surface and OpenAPI documentation represent significant risk if not properly secured server-side.

1
high
2
medium
3
low
1
info
7
Total

Findings

high

Exposed Admin Endpoints Discoverable via Client-Side JavaScript

Category: exposure

Multiple administrative endpoints were discovered through JavaScript bundle analysis and crawling. These include scraper controls, meta generation, maintenance mode toggles, and API testing endpoints. If these lack proper server-side authentication and authorization, they could allow unauthorized administrative actions.

Evidence:
/cr/admin/scraper/run, /cr/admin/meta/refresh, /cr/admin/meta/snapshot, /cr/admin/meta/generate, /cr/admin/meta/maintenance, /cr/admin/deck-status, /cr/admin/apitest — all found in index-DWDwtvw4.js by katana, gospider, and linkfinder

Attack Vector: An attacker enumerates admin routes from the JS bundle and attempts direct access. If authorization is missing or bypassable, they could trigger scraper runs, modify metadata, toggle maintenance mode, or abuse the API test endpoint.

Remediation: Ensure all /cr/admin/* endpoints enforce server-side authentication and role-based authorization. Remove admin route references from client-side JavaScript bundles served to unauthenticated users. Consider separating admin UI into a distinct build.

Detected by: katana, gospider, linkfinder, feroxbuster

medium

OpenAPI Documentation Publicly Accessible

Category: exposure

Feroxbuster discovered /docs, /docs/oauth2-redirect, and /openapi.json endpoints, which are default FastAPI/Uvicorn auto-generated documentation pages. These expose the full API schema including all endpoints, parameters, and data models to anyone.

Evidence:
feroxbuster found: https://paragonroyale.com/openapi.json, https://paragonroyale.com/docs, https://paragonroyale.com/docs/oauth2-redirect

Attack Vector: An attacker uses /openapi.json to map the complete API surface, identify parameter names, authentication flows (OAuth2), and hidden endpoints — dramatically reducing reconnaissance effort for targeted attacks.

Remediation: Disable /docs and /openapi.json in production by setting docs_url=None, redoc_url=None, and openapi_url=None in the FastAPI application constructor, or restrict access via Caddy to authenticated admin users only.

Detected by: feroxbuster

medium

Missing Anti-Clickjacking Header (X-Frame-Options)

Category: config

The X-Frame-Options header is not set, which could allow the site to be embedded in iframes on malicious domains, enabling clickjacking attacks against authenticated users.

Evidence:
Nikto: 'The anti-clickjacking X-Frame-Options header is not present.'

Attack Vector: An attacker embeds paragonroyale.com in a transparent iframe overlaid on a decoy page, tricking authenticated users into performing unintended actions (e.g., triggering admin functions, changing settings).

Remediation: Add X-Frame-Options: DENY or Content-Security-Policy: frame-ancestors 'none' header in the Caddy configuration. Example Caddyfile directive: header X-Frame-Options DENY

Detected by: nikto

low

SSH NIST Elliptic Curve Key Exchange Algorithms Enabled

Category: config

The SSH server accepts NIST P-256, P-384, and P-521 elliptic curve Diffie-Hellman key exchange algorithms, which are flagged by ssh-audit as potentially compromised curves. Additionally, diffie-hellman-group14-sha256 uses only a 2048-bit modulus providing 112-bit symmetric strength.

Evidence:
ssh-audit: '(kex) ecdh-sha2-nistp256 -- [fail] using elliptic curves that are suspected as being backdoored by the U.S. National Security Agency', same for nistp384 and nistp521. '(kex) diffie-hellman-group14-sha256 -- [warn] 2048-bit modulus only provides 112-bits of symmetric strength'

Attack Vector: A state-level adversary with access to potential curve backdoors could compromise SSH session key exchange. Practically low risk for most threat models.

Remediation: Restrict SSH key exchange algorithms in /etc/ssh/sshd_config to: KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512

Detected by: ssh-audit

low

TLS Certificate Approaching Expiry

Category: config

The TLS certificate for paragonroyale.com expires on 2026-05-12, approximately 52 days from now. While Caddy typically handles auto-renewal via ACME, this should be monitored.

Evidence:
nmap ssl-cert: 'Not valid before: 2026-02-11T21:17:53, Not valid after: 2026-05-12T21:17:52'

Attack Vector: If auto-renewal fails, an expired certificate will cause browser warnings, loss of user trust, and potential downgrade to HTTP if HSTS is not enforced.

Remediation: Verify Caddy's ACME auto-renewal is functioning correctly. Set up monitoring/alerting for certificate expiry (e.g., via uptime monitoring service). Caddy should auto-renew ~30 days before expiry.

Detected by: nmap, testssl

low

SPF Record Uses Soft Fail (~all)

Category: config

The domain's SPF record uses ~all (soft fail) rather than -all (hard fail), meaning spoofed emails from this domain may be delivered rather than rejected by recipient mail servers.

Evidence:
dnsx TXT record: 'v=spf1 include:spf.efwd.registrar-servers.com ~all'

Attack Vector: An attacker spoofs emails from @paragonroyale.com for phishing. With soft fail, many mail servers will deliver the spoofed email (possibly to spam) rather than rejecting it outright.

Remediation: Change ~all to -all in the SPF record once you've confirmed all legitimate sending sources are included. Also consider adding DMARC (p=reject) and DKIM records.

Detected by: dnsx

info

No WAF Detected

Category: network

No web application firewall was detected protecting the application. While not a vulnerability itself, it means the application relies entirely on its own code for input validation and attack prevention.

Evidence:
wafw00f: 'No WAF detected by the generic detection'

Attack Vector: Without a WAF, common attack payloads (SQLi, XSS, path traversal) reach the application directly without any external filtering layer.

Remediation: Consider deploying a WAF (e.g., Cloudflare, AWS WAF, or ModSecurity) as a defense-in-depth measure, especially given the exposed API surface.

Detected by: wafw00f

Attack Surface

Open Ports

Technologies

Subdomains

Exposed Endpoints

Recommendations

  1. PRIORITY 1: Audit all /cr/admin/* endpoints for proper authentication and authorization — verify they return 401/403 for unauthenticated and non-admin users
  2. PRIORITY 2: Disable /docs, /openapi.json, and /docs/oauth2-redirect in production (set docs_url=None, redoc_url=None, openapi_url=None in FastAPI constructor)
  3. PRIORITY 3: Remove admin route references from the client-side JavaScript bundle or split admin UI into a separate authenticated build
  4. PRIORITY 4: Add security headers via Caddy: X-Frame-Options: DENY, Content-Security-Policy, X-Content-Type-Options: nosniff, Strict-Transport-Security, Permissions-Policy
  5. PRIORITY 5: Harden SSH by disabling NIST curve key exchange algorithms and diffie-hellman-group14-sha256
  6. PRIORITY 6: Strengthen email security: change SPF to -all, add DMARC (p=reject) and DKIM records
  7. PRIORITY 7: Consider deploying a WAF or rate limiting at the Caddy layer to protect exposed API endpoints
  8. PRIORITY 8: Re-run nuclei scan (timed out) to check for known CVEs against the detected stack (Caddy, Uvicorn, OpenSSH 9.6p1)

Tool Execution Summary

ToolStatusDuration
✅ nmapsuccess45017ms
❌ nucleierror608296ms
✅ niktosuccess147726ms
✅ zap-baselinesuccess18920ms
✅ sqlmapsuccess58153ms
✅ subfindersuccess12231ms
✅ httpxsuccess37442ms
✅ testsslsuccess442567ms
✅ feroxbustersuccess330326ms
✅ katanasuccess61331ms
✅ dalfoxsuccess52108ms
✅ dnsxsuccess47139ms
✅ wpscansuccess91905ms
✅ trufflehogsuccess97541ms
✅ masscansuccess65327ms
✅ amasssuccess471957ms
✅ whatwebsuccess68111ms
✅ ffufsuccess38020ms
✅ gospidersuccess67538ms
✅ arjunsuccess67525ms
✅ gitleakssuccess52362ms
✅ wafw00fsuccess58259ms
✅ jwt_toolsuccess58018ms
✅ linkfindersuccess75518ms
✅ gowitnesssuccess37784ms
✅ ssh-auditsuccess24618ms