EyeWitness Cheatsheet
Author: Netrunner | Last Updated: 2026-08-06 | Context: HTB Pro Labs, CTF, authorised pentesting | Tool: EyeWitness (CLI reference)
Web screenshot / recon CLI reference for authorised assessments. Flags below were checked against the RedSiege/EyeWitness README and Python/EyeWitness.py argument parser — nothing invented.
Related notes: Nuclei-Cheatsheet · Ffuf-Cheatsheet · webfuzz · NetExec-Cheatsheet
Table of Contents
- Summary
- Project Status & Alternatives
- Quick-Reference Flag Table
- Installation
- Basic Usage
- Input Formats
- Timing, Proxy & Browser Options
- Resume & Config
- Output Layout
- Practical Recipes
- Alternatives (gowitness / aquatone / httpx)
- Troubleshooting & Gotchas
- Lessons Learned
- References
Summary ris:Eye
EyeWitness takes screenshots of HTTP(S) targets, records response headers/source, and attempts to flag known default credentials. It is useful after host/URL discovery (nmap, httpx, masscan) when you need a visual triage of large web attack surfaces. Modern builds use Chromium/Chrome + Selenium, install into an isolated Python venv, and support text URL lists, Nmap/Nessus XML, single-URL mode, and resume via SQLite (ew.db).
Note — + Authorised-use framing
fas:TriangleExclamation
- Only run against systems you own or have written authorisation to assess.
- Screenshot tools generate significant browser/CPU load — tune
--threadsand timeouts on fragile lab targets.- Proxy through Burp/ZAP when you need request inspection (
--proxy-ip/--proxy-port).
Project Status & Alternatives ris:Radar
| Tool | Status (as of 2026) | Notes |
|---|---|---|
| EyeWitness (RedSiege) | Actively maintained | Formerly FortyNorthSecurity; Chromium-powered rewrite with venv install |
| gowitness | Actively maintained | Go, fast, good for large lists |
| aquatone | Archived / unmaintained | Still seen in older writeups; prefer gowitness or EyeWitness |
httpx -screenshot | Actively maintained | Lightweight screenshots in the ProjectDiscovery pipeline |
Note — + When to pick what
fas:Lightbulb
- EyeWitness: HTML report + default-cred hints + Nmap/Nessus XML ingest.
- gowitness: speed and Go single-binary ops on large host lists.
- httpx -screenshot: already in a
subfinder → httpx → nucleichain and only need quick PNGs.- aquatone: legacy labs only — project is archived.
Quick-Reference Flag Table fas:ClipboardList
| Flag | Purpose |
|---|---|
--web | HTTP screenshot via Selenium (default action) |
-f <file> | Line-separated URL/host file |
-x <file.xml> | Nmap XML or Nessus file |
--single <URL> | Single URL/host |
--no-dns | Skip DNS resolution |
-d <dir> | Output directory for screenshots/report |
--timeout <sec> | Page request timeout (default 7) |
--jitter <sec> | Randomise order + random delay |
--delay <sec> | Delay after navigator open before screenshot |
--threads <n> | Worker threads (default ≈ 2×CPU, max 20) |
--max-retries <n> | Retries on timeout (default 1) |
--results <n> | Results per report page (default 25) |
--no-prompt | Skip “open report?” prompt |
--user-agent <UA> | Custom User-Agent |
--proxy-ip / --proxy-port | HTTP/SOCKS proxy |
--proxy-type | http (default) or socks5 |
--show-selenium | Show browser UI (debug) |
--resolve | Resolve IP/hostname for targets |
--add-http-ports / --add-https-ports | Extra ports treated as http/https |
--only-ports | Exclusive port list |
--prepend-https | Prepend http:// and https:// when scheme missing |
--validate-urls | Validate only, no screenshots |
--skip-validation | Skip URL validation |
--cookies key=val,... | Extra cookies |
--width / --height | Screenshot size (width 600–7680, height 400–4320) |
--resume <ew.db> | Resume from DB |
--config <json> | Load config file |
--create-config | Write sample config |
Installation fas:Screwdriver
Note — + EyeWitness Overview
ris:GlobalLineChromium-based HTTP screenshot and reporting tool with default-credential categorisation.
- Accepts URL lists and Nmap/Nessus XML.
- Isolates Python deps in
eyewitness-venv/.- Writes searchable HTML report +
ew.dbfor resume.
# Clone
git clone https://github.com/RedSiege/EyeWitness.git
cd EyeWitness/setup
# Linux / Kali / macOS (needs sudo for system packages + venv)
sudo ./setup.sh
# Activate venv (required before every run)
cd ..
source eyewitness-venv/bin/activate
# Smoke test
python Python/EyeWitness.py --single https://example.com
Note — + Install Breakdown
ris:FileList
- setup.sh / setup.ps1: creates
eyewitness-venv/, installs Selenium stack, pulls Chromium/ChromeDriver.- Always activate the venv — running system Python will miss deps / hit PEP 668 errors.
- Docker: still marked “in development” upstream — prefer native install for labs.
- Cleanup: delete
eyewitness-venv/and re-run setup if the env breaks.
Basic Usage ris:Command
source eyewitness-venv/bin/activate
# Single target
python Python/EyeWitness.py --web --single https://app.target.lab
# URL list
python Python/EyeWitness.py --web -f urls.txt -d ./ew-out --no-prompt
# From Nmap XML
python Python/EyeWitness.py --web -x nmap_http.xml -d ./ew-nmap --threads 8 --timeout 15
Note — + Command Breakdown
ris:FileList
- —web: Selenium HTTP screenshot engine (required action).
- -f / -x / —single: mutually exclusive-style inputs — provide at least one.
- -d: fixed output path; omit to get a timestamped folder in CWD.
- —no-prompt: automation-friendly (CI / headless SSH).
Input Formats ris:FileList
# urls.txt — one URL or host per line
https://intranet.target.lab
http://10.10.10.50:8080
target.lab
# Nmap XML (open http/https services)
nmap -p 80,443,8080,8443 -sV -oX nmap_http.xml 10.10.10.0/24
python Python/EyeWitness.py --web -x nmap_http.xml -d ./ew-scan --prepend-https
# Validate URLs only
python Python/EyeWitness.py -f urls.txt --validate-urls -d ./ew-validate
Note — + Prepend schemes carefully
fas:Lightbulb
- Bare hostnames need
--prepend-https(or explicit schemes in the list).- Combine with
--only-ports 80,443,8080when XML contains noisy services.--add-http-ports 8000,8888for non-standard HTTP listeners.
Timing, Proxy & Browser Options ris:Global
python Python/EyeWitness.py --web -f urls.txt -d ./ew-slow \
--threads 5 --timeout 30 --delay 2 --jitter 5 \
--proxy-ip 127.0.0.1 --proxy-port 8080 --proxy-type http \
--user-agent "Mozilla/5.0 (authorised-assessment)" \
--width 1920 --height 1080 \
--cookies "SESSIONID=abc123"
Note — + Tuning Breakdown
ris:FileList
- —threads: lower on low-RAM boxes; EyeWitness may auto-reduce based on memory.
- —timeout / —max-retries: slow lab links and flaky VPN paths.
- —proxy-*: send browser traffic through Burp (
http) or SOCKS.- —width/—height: must stay inside documented ranges or the parser exits.
Resume & Config fas:ClipboardList
# Sample config
python Python/EyeWitness.py --create-config
# Use config
python Python/EyeWitness.py --web -f urls.txt --config ~/.eyewitness/config.json
# Resume interrupted run
python Python/EyeWitness.py --resume ./ew-out/ew.db
Example config keys (from upstream README):
{
"threads": 10,
"timeout": 30,
"delay": 0,
"jitter": 0,
"user_agent": "Custom User Agent",
"proxy_ip": "127.0.0.1",
"proxy_port": 8080,
"output_dir": "./sessions",
"prepend_https": false,
"show_selenium": false,
"resolve": false,
"skip_validation": false,
"results_per_page": 25,
"max_retries": 2
}
Output Layout ris:FileList
| Path | Contents |
|---|---|
report.html | Main categorised report |
screens/ | Screenshot images |
source/ | Saved page source |
ew.db | SQLite DB for resume |
logfile.log | Run log |
Categories commonly include High Value, CMS, network devices, etc., plus default-credential hints when signatures match.
Practical Recipes ris:Command
# 1) httpx live hosts → EyeWitness
httpx -l hosts.txt -ports 80,443,8080,8443 -o live.txt -silent
python Python/EyeWitness.py --web -f live.txt -d ./ew-live --threads 10 --no-prompt
# 2) Full TCP discover → XML → screenshots
nmap -p- --min-rate 2000 -oX full.xml 10.10.10.5
python Python/EyeWitness.py --web -x full.xml -d ./ew-full --prepend-https --timeout 20
# 3) Authenticated cookie session (lab app)
python Python/EyeWitness.py --web --single https://app.target.lab/admin \
--cookies "auth=TOKEN" -d ./ew-auth --no-prompt
Alternatives (gowitness / aquatone / httpx) fas:Screwdriver
gowitness
go install github.com/sensepost/gowitness@latest
# single
gowitness single https://example.com
# file
gowitness file -f urls.txt
# scan CIDR / ports (check gowitness -h for current subcommands)
gowitness scan --cidr 10.10.10.0/24 --ports 80,443,8080
aquatone (archived)
# Legacy pattern — prefer gowitness for new work
cat hosts.txt | aquatone -ports large -out ./aqua-out
cat nmap.xml | aquatone -nmap -out ./aqua-nmap
httpx screenshots
httpx -l hosts.txt -screenshot -screenshot-timeout 10 -o httpx-live.txt
# screenshots land under ./screenshot/ (path may vary by httpx version — confirm with httpx -h)
Note — + Aquatone maintenance
fas:TriangleExclamation
- michenriksen/aquatone is archived.
- Chrome/chromedp breakage is common on modern Kali.
- Keep it only for reproducing old lab steps.
Troubleshooting & Gotchas fas:CircleXmark
Note — + Common failures
fas:CircleXmark
- ChromeDriver missing → re-run
setup/setup.shinside the project.- PEP 668 / missing modules → you forgot
source eyewitness-venv/bin/activate.- Timeouts over VPN → raise
--timeout, lower--threads.- Low disk → EyeWitness warns when free space is low; prune
source/if needed.- Width/height rejected → stay within 600–7680 × 400–4320.
Lessons Learned fas:Lightbulb
- Treat EyeWitness as a triage step after httpx/nmap — not a replacement for content discovery (Ffuf-Cheatsheet, Nuclei-Cheatsheet).
- Prefer RedSiege EyeWitness or gowitness over aquatone for new engagements.
- Always activate the venv; most “broken install” tickets are path/Python confusion.
- Use
--resumeafter VPN drops —ew.dbsaves a lot of rework. - Screenshot noise is high; filter input with httpx status/title first.
References fas:BookOpen
- RedSiege/EyeWitness
- EyeWitness README
- sensepost/gowitness
- michenriksen/aquatone (archived)
- ProjectDiscovery httpx
- HackTricks — Web Discovery
#Tool #EyeWitness #gowitness #aquatone #httpx #WebTesting #Recon #Screenshots