Monitor the public-facing assets that attackers, vendors, insurers, and customers see first.
The tool runs locally, stores history locally, and produces a lightweight website/report you can publish with GitHub Pages or serve from any static host.
- DNS records:
A,AAAA,MX,NS,TXT,CAA - Website status, redirects, TLS, headers, and third-party vendors
- Nikto web exposure findings when
niktois installed - Domain email exposure from public pages plus common mailbox aliases
- SPF, DKIM selector discovery, DMARC policy strength, MX provider, and spoofing risk
- Change history between scans
- Plain-English findings with impact, recommendation, confidence, owner, severity, and effort
- Customer scorecards using
Pass,Watch, andAction Needed - Remediation checklist tasks
git clone https://github.com/techmore/tm-external-baseline.git
cd tm-external-baseline
./install.sh
./run.shThen open index.html, or serve it locally:
python3 -m http.server 8080Open http://localhost:8080.
Edit domains.txt and put one domain per line:
example.com
school.edu
nonprofit.org
Run one-off domains without editing the file:
./run.sh --domain example.com --domain example.orgSkip Nikto for faster scans:
./run.sh --skip-niktoEach scan generates:
- Customer scorecard
- Plain-English findings
- Before/after change timeline
- Email authentication health for SPF, DKIM, and DMARC
- Vendor risk labels
- Remediation checklist
- HTML report suitable for browser print-to-PDF
Install a daily local cron job:
./scheduled.sh installShow or remove it:
./scheduled.sh show
./scheduled.sh removeThe scheduled job runs ./run.sh and appends logs to domain_reports/scheduled.log.
Optional alert environment variables:
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
export SMTP_HOST="smtp.example.com"
export SMTP_PORT="587"
export SMTP_USERNAME="user"
export SMTP_PASSWORD="password"
export SMTP_FROM="baseline@example.com"
export SMTP_TO="security@example.com"Alerts are sent only when high-priority findings or changes are present.
domain_reports/latest_summary.jsondomain_reports/public_summary.jsondomain_reports/external_domain_baseline_*.htmldomain_reports/external_domain_history.jsonindex.htmlanddashboard/index.html
The first scan establishes a baseline. Later scans highlight changes.
latest_summary.json and timestamped HTML reports contain raw technical evidence. Use public_summary.json for safer publishing when you do not want to expose DNS evidence, discovered public emails, Nikto output, or raw headers.
The scanner installs dnspython for DNS lookups. If dig is available, it will use dig; otherwise it falls back to Python DNS resolution. Fuller reports can also use:
digfor DNS recordsniktofor web exposure checksnmapfor future scan integrations
On macOS:
brew install bind nikto nmapOn Debian/Ubuntu:
sudo apt-get update
sudo apt-get install -y dnsutils nikto nmapThis repository includes a root index.html, so GitHub Pages can serve the dashboard directly.
Do not publish customer latest_summary.json or timestamped HTML reports unless the customer explicitly wants that evidence public. Those files can contain raw DNS data, public email discoveries, vendors, headers, and Nikto output. Prefer publishing domain_reports/public_summary.json or a purpose-built demo dataset.