Created by: Sneakywarwolf 🐺
Discover subdomains, check which are live, capture screenshots, and export a precise CSV — from a single self-contained script.
- Subdomain discovery from keyless passive sources (crt.sh, HackerTarget,
AlienVault OTX, Anubis-DB), with optional DNS brute-force. If
subfinderis on yourPATHor the vendoredSublist3r/package is present, SFAC uses them too — but neither is required. - Accessibility check over HTTPS first, then HTTP. Any HTTP response
marks a host Live; only
2xxmarks it Accessible. The exact status code, final URL, redirect flag, page title,Serverheader, and resolved IPs are recorded. - DNS-aware: hosts are resolved first, so non-resolving names are labelled instead of burning a full HTTP timeout.
- Scope control: discovered names are restricted to the target domain by
default (
--no-scopeto disable). - Screenshots (optional) of live hosts using one reused headless-Chrome instance.
- CSV output, backward-compatible with the old columns
(
Subdomain, Status Code, Accessible) plus richer fields. Optional JSON Lines.
- Python 3.8+
pip install -r requirements.txt(installsrequests,dnspython,tqdm,colorama, andselenium).- Screenshots only: Google Chrome / Chromium. Selenium 4.6+ provisions a
matching driver automatically; otherwise point SFAC at one with
--chromedriver/CHROMEDRIVERand the browser with--chrome-binary/CHROME_BIN.
subfinder(Go) is optional. If present it is used automatically; API keys configured for subfinder expand its coverage but are not required.
git clone https://github.com/sneakywarwolf/SFAC.git
cd SFAC
pip install -r requirements.txt# Enumerate + check a domain
python sfac.py -D example.com
# Add DNS brute-force with the built-in wordlist
python sfac.py -D example.com --brute
# Check hosts from a file (skips discovery)
python sfac.py -t subdomains.txt
# Save to a specific CSV, and also JSON Lines
python sfac.py -D example.com -o results.csv --jsonl results.jsonl
# Capture screenshots of live hosts into ./shots
python sfac.py -D example.com -s shots
# More threads, HTTPS only, rate-limited
python sfac.py -D example.com -T 20 --https-only --delay 0.2| Flag | Purpose |
|---|---|
-D, --domain |
Target domain to enumerate |
-t, --textfile |
File of hosts to check (skips discovery) |
-o, --output |
Output CSV path |
--jsonl |
Also write JSON Lines |
-s, --snapshots [folder] |
Capture screenshots of live hosts |
-T, --concurrency |
Worker threads (default 10) |
--sources |
Comma-separated passive sources |
--no-passive / --no-tools |
Skip web sources / external tools |
--brute / --wordlist |
DNS brute-force (built-in or custom list) |
--no-scope |
Do not restrict names to the target domain |
--https-only / --http-only |
Restrict probe scheme |
--no-redirects |
Do not follow HTTP redirects |
--verify-tls |
Verify TLS certs (off by default) |
--delay / --user-agent |
Rate limit / custom UA |
Run python sfac.py -h for the full list.
CSV columns:
Subdomain, Status Code, Accessible, Live, Scheme, Final URL,
Title, Server, IP Addresses, Redirected, Error, Screenshot
- Accessible =
Yesonly for HTTP2xx(matches legacy behaviour). - Live =
Yesfor any HTTP response (2xx/3xx/4xx/5xx). - Error records why a host failed (e.g.
DNS resolution failed, a TLS or connection error), instead of silently dropping it.
- Passive-source coverage depends on those services being reachable and their free-tier limits; each source is best-effort and skipped on error.
- TLS verification is off by default because recon targets often use
self-signed or expired certificates; use
--verify-tlsto enforce it. - Following redirects can send traffic outside the target domain. Use
--no-redirectswhen your rules of engagement require it.
For authorized security testing and educational use only. Obtain explicit permission before testing any domain you do not own.
🔗 GitHub: Sneakywarwolf · 📧 sneakypentester@gmail.com