| name | eyewitness |
| description | Operate and interpret EyeWitness — a web, RDP, and VNC screenshot tool for rapid visual triage of large attack surfaces. Use when conducting external or internal network assessments, processing nmap or Nessus output to quickly identify high-value web services, or building target triage workflows for large scope engagements. Covers installation (Docker, pip, source), input modes (file, nmap XML, Nessus XML), protocol support (HTTP/HTTPS, RDP, VNC), report generation, active scanning, and integration with recon pipelines.
|
| metadata | {"author":"redhoundinfosec","version":"1.0","repo":"https://github.com/RedSiege/EyeWitness","stars":"5.3k","language":"Python"} |
eyewitness Agent Skill
When to Use This Skill
Use this skill when:
- You have a list of URLs or IPs from recon and need rapid visual triage
- Processing nmap XML or Nessus .nessus output to screenshot all discovered web services
- Identifying login panels, admin interfaces, or custom web apps on a large target range
- Taking RDP or VNC screenshots of discovered remote-access services
- Generating an HTML report of all services for client deliverables or internal triage
- The user asks about web service enumeration or visual reconnaissance
What EyeWitness Does
EyeWitness takes screenshots of web applications (HTTP/HTTPS), RDP services, and VNC servers, then
generates a categorized HTML report with headers, server banners, and page titles. It is the primary
tool for visual triage of large scopes — after running nmap against a /16 or pulling services from
a Nessus scan, EyeWitness lets an assessor visually scan hundreds of services in minutes rather than
manually browsing each one.
Installation
Method 1 — Docker (recommended, avoids dependency hell)
docker pull ghcr.io/redsiege/eyewitness:latest
alias eyewitness='docker run --rm -it \
-v $(pwd):/tmp/EyeWitness \
ghcr.io/redsiege/eyewitness:latest'
eyewitness --web -f /tmp/EyeWitness/urls.txt -d /tmp/EyeWitness/output
Method 2 — Python setup (Kali / Debian)
sudo apt update && sudo apt install eyewitness -y
git clone https://github.com/RedSiege/EyeWitness.git
cd EyeWitness/Python
sudo ./setup/setup.sh
pip3 install -r requirements.txt
Method 3 — pip only (if Chromium already present)
pip3 install eyewitness
Verify Installation
python3 EyeWitness.py --help
eyewitness --help
Core Concepts
How EyeWitness Takes Screenshots
EyeWitness drives a headless Chromium instance via Selenium or directly via the Chrome DevTools
Protocol to render each web page and save a PNG screenshot. For RDP it uses rdesktop or xfreerdp,
and for VNC it uses vncdotool. Each target is processed with a configurable timeout, and failures
are captured in the report as error entries rather than silently dropped.
Output Structure
output/
├── report.html — Main HTML report with all screenshots, sorted by category
├── open_ports.csv — CSV of all targets and response data
├── screens/ — Individual PNG screenshots
│ ├── http_10_0_0_1_80.png
│ └── https_app_example_com_443.png
├── source/ — Saved page source (HTML) for each target
└── headers/ — Raw HTTP response headers for each target
The HTML report auto-categorizes targets into groups: default credentials found, clusters of similar
pages, error pages, and unique-looking apps — making it easy to prioritize.
CLI Reference
Protocol Modes
eyewitness --web -f urls.txt -d ./output
eyewitness --rdp -f hosts.txt -d ./output
eyewitness --vnc -f hosts.txt -d ./output
eyewitness --web --rdp --vnc -f targets.txt -d ./output
Input Sources
eyewitness --web -f urls.txt -d ./output
eyewitness --web --nmap-xml nmap_scan.xml -d ./output
eyewitness --web --nessus-xml nessus_export.nessus -d ./output
eyewitness --web --single https://10.10.10.1 -d ./output
cat urls.txt
Output and Reporting
eyewitness --web -f urls.txt -d /tmp/ew_$(date +%Y%m%d)
eyewitness --web -f urls.txt -d ./output --title "Engagement - Acme Corp"
eyewitness --web -f urls.txt -d ./output --no-prompt
eyewitness --web -f urls.txt -d ./output --no-prompt
Timing and Performance
eyewitness --web -f urls.txt -d ./output --timeout 15
eyewitness --web -f urls.txt -d ./output --threads 20
eyewitness --web -f urls.txt -d ./output --delay 2
eyewitness --web -f urls.txt -d ./output --max-retries 3
HTTP Options
eyewitness --web -f urls.txt -d ./output \
--user-agent "Mozilla/5.0 (compatible; Googlebot/2.1)"
eyewitness --web -f urls.txt -d ./output \
--proxy-ip 127.0.0.1 --proxy-port 8080
eyewitness --web -f urls.txt -d ./output \
--proxy-ip 127.0.0.1 --proxy-port 1080 --proxy-type socks5
eyewitness --web -f urls.txt -d ./output --no-dns
eyewitness --web -f urls.txt -d ./output \
--add-http-headers "Authorization: Bearer TOKEN"
Resolution and Rendering
eyewitness --web -f urls.txt -d ./output --resolution 1280x720
eyewitness --web -f urls.txt -d ./output --jitter 3
eyewitness --web -f urls.txt -d ./output --active-scan
Active Scanning
eyewitness --web -f urls.txt -d ./output --active-scan
eyewitness --web -f urls.txt -d ./output --active-scan \
--user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
Common Workflows
Workflow 1 — nmap to EyeWitness Pipeline
nmap -sV -p 80,443,8000,8080,8443,8888,9000,9090,9443 \
--open -oX nmap_web.xml 192.168.1.0/24
eyewitness --web --nmap-xml nmap_web.xml -d ./ew_output --timeout 10 --threads 20
firefox ./ew_output/report.html
Workflow 2 — Nessus Integration
eyewitness --web --nessus-xml acme_scan.nessus -d ./ew_nessus_output
eyewitness --rdp --nessus-xml acme_scan.nessus -d ./ew_rdp_output
Workflow 3 — Large External Scope Triage
cat subdomains.txt | httpx -ports 80,443,8080,8443 -o live_urls.txt
eyewitness --web -f live_urls.txt -d ./external_ew \
--timeout 15 --threads 25 --no-prompt
Workflow 4 — Internal Network RDP + Web
eyewitness --web --rdp -f internal_hosts.txt -d ./internal_ew \
--timeout 20 --threads 10 --delay 1
cat internal_hosts.txt
Advanced Techniques
Combining with httpx for Pre-filtering
cat all_targets.txt | httpx -silent -o live.txt
eyewitness --web -f live.txt -d ./output --timeout 8
Splitting Large URL Lists
split -l 500 urls.txt chunk_
for chunk in chunk_*; do
eyewitness --web -f "$chunk" -d "./output_${chunk}" \
--no-prompt --timeout 10 --threads 15 &
done
wait
Post-processing Report Data
grep -oP '(?<=<title>).*?(?=</title>)' ./output/source/*.html | sort -u
grep "200 OK" ./output/open_ports.csv | cut -d',' -f1
Screenshot via Proxy for WAF Bypass Testing
eyewitness --web -f urls.txt -d ./burp_routed \
--proxy-ip 127.0.0.1 --proxy-port 8080 \
--no-prompt --timeout 20
Integration with Other Tools
With Amass / subfinder
amass enum -passive -d example.com -o subs.txt
cat subs.txt | httpx -o live_subs.txt
eyewitness --web -f live_subs.txt -d ./subdomain_screenshots
With Nmap Service Scripts
nmap -p 80,443 --script http-title,http-headers -oX nmap_http.xml 10.0.0.0/24
eyewitness --web --nmap-xml nmap_http.xml -d ./output
With Metasploit
After EyeWitness identifies interesting login panels, pivot to Metasploit auxiliary scanners:
use auxiliary/scanner/http/tomcat_mgr_login
use auxiliary/scanner/http/jboss_vulnscan
Troubleshooting
| Issue | Cause | Fix |
|---|
Chromium not found | Chromium not installed | apt install chromium-browser or setup.sh |
| All screenshots blank | Headless rendering issue | --resolution 1280x720, check Xvfb |
| SSL errors | Self-signed certs rejected | Chromium ignores SSL by default; check proxy settings |
| Slow performance | Too many threads, slow hosts | Reduce --threads, increase --timeout |
| Docker volume issues | Wrong mount path | Use absolute path in -v $(pwd):/tmp/EyeWitness |
| nmap XML not parsed | nmap run without -oX | Re-run nmap with -oX output.xml flag |
| RDP screenshots grey | Target requires NLA | EyeWitness cannot bypass NLA; note target for manual testing |
Built by Red Hound InfoSec — On-demand offensive security expertise for SMBs.
20+ years of Fortune 500 experience. Penetration testing, attack surface analysis, and security consulting.
redhound.us | GitHub | Book a consultation