LoginScout is a production-quality, async Python tool for discovering login and authentication pages across a target website — inspired by Nessus, built for the modern web.
| Feature | Details |
|---|---|
| BFS Crawler | Breadth-first, scope-aware, depth-configurable |
| Multi-technique Detection | Password fields, form analysis, URL/content keywords, confidence scoring |
| Admin Panel Detection | Separately flags admin panels |
| Subdomain Scanning | DNS brute force with customisable wordlist |
| Robots.txt Handling | Respect or probe disallowed paths |
| JS Rendering | Playwright-powered for SPA / React / Vue apps |
| Rate Limiting | Configurable delay + exponential backoff on 429/503 |
| Rich Reports | JSON, TXT, and styled interactive HTML |
| Async + Concurrent | asyncio + aiohttp, bounded concurrency |
| Security Auditing | Flags missing HTTPS, absent CSRF tokens |
loginscout/
├── main.py # CLI entry point
├── requirements.txt # Python dependencies
├── README.md # This file
│
├── loginscout/ # Core package
│ ├── __init__.py
│ ├── config.py # ScanConfig dataclass + all defaults
│ ├── crawler.py # Async BFS crawler (aiohttp)
│ ├── detector.py # Login page detection engine
│ ├── subdomain_scanner.py # DNS brute-force subdomain discovery
│ ├── reporter.py # JSON / TXT / HTML report generation
│ └── utils.py # URL normalisation, logging, robots.txt
│
├── wordlists/
│ └── subdomains.txt # Built-in subdomain wordlist
│
├── reports/ # Output reports (auto-created)
└── logs/ # Log files (auto-created)
git clone https://github.com/yourorg/loginscout.git
cd loginscoutpython3 -m venv .venv
source .venv/bin/activate # Linux / macOS
.venv\Scripts\activate # Windowspip install -r requirements.txtplaywright install chromiumpython main.py -t TARGET [options]
| Flag | Description |
|---|---|
-t, --target |
Target domain or IP (e.g. example.com, 192.168.1.10) |
| Flag | Default | Description |
|---|---|---|
--depth N |
3 | Maximum BFS crawl depth |
--threads N |
10 | Maximum concurrent requests |
--delay S |
0.2 | Seconds between requests |
--timeout S |
15 | Request timeout (seconds) |
--max-pages N |
500 | Hard page crawl cap |
--user-agent UA |
Chrome/122 | Custom User-Agent |
--no-respect-robots |
— | Ignore robots.txt |
--scan-disallowed |
— | Also probe disallowed paths |
| Flag | Description |
|---|---|
--enable-js |
Render pages with Playwright (slower, more thorough) |
--enable-subdomain-scan |
Discover subdomains via DNS brute force |
--subdomain-wordlist FILE |
Custom wordlist file path |
| Flag | Default | Description |
|---|---|---|
--output FORMAT |
all |
json, txt, html, or all |
--output-dir DIR |
./reports |
Directory for saved reports |
--log-file FILE |
auto | Custom log file path |
-v, --verbose |
— | Enable DEBUG logging |
-q, --quiet |
— | Suppress console output |
# Basic scan of a domain (depth 3, 10 threads)
python main.py -t example.com
# Deep scan with JS rendering
python main.py -t example.com --depth 5 --threads 20 --enable-js
# Scan an IP address
python main.py -t 192.168.1.1 --depth 3
# Full scan: subdomains + JS + all outputs
python main.py -t example.com \
--enable-subdomain-scan \
--enable-js \
--depth 4 \
--threads 15 \
--delay 0.3 \
--output all \
--verbose
# Probe robots.txt disallowed paths (often exposes admin/staging endpoints)
python main.py -t example.com --scan-disallowed --no-respect-robots
# Custom subdomain wordlist, JSON output only
python main.py -t example.com \
--enable-subdomain-scan \
--subdomain-wordlist ./wordlists/subdomains.txt \
--output json
# Quiet mode — only save reports, no console noise
python main.py -t example.com -q --output allFull machine-readable output including metadata, configuration, statistics, and detailed per-page results.
Human-readable summary with confidence labels, detection methods, and security issues.
Interactive dark-themed report with:
- Summary statistics dashboard
- Filterable results table (by confidence / admin / insecure)
- Full-text search
- Security issue highlights
Each page is scored across multiple techniques:
| Technique | Weight |
|---|---|
<input type="password"> found |
0.45 |
| Form with username + password fields | 0.35 |
| URL contains login keyword | 0.25 |
| Page body contains login phrases | 0.20 |
| Admin URL keyword detected | 0.20 |
<title> contains auth keyword |
0.15 |
| Form action URL matches login keyword | 0.10 |
The raw score is normalised to [0.0 – 1.0]:
- HIGH ≥ 0.75
- MEDIUM ≥ 0.40
- LOW > 0.0
LoginScout flags:
- No HTTPS — login page served over plain HTTP
- No CSRF token — form has no detectable CSRF protection
LoginScout is intended for authorised security assessments only.
Only scan systems you own or have explicit written permission to test.
Unauthorised scanning may be illegal in your jurisdiction.
Edit loginscout/config.py — modify LOGIN_URL_KEYWORDS, LOGIN_CONTENT_KEYWORDS, or ADMIN_URL_KEYWORDS.
Subclass or extend loginscout/reporter.py and add a save_<format>() method.
Set HTTP_PROXY / HTTPS_PROXY environment variables — aiohttp respects them automatically.
- Python 3.11+
- See
requirements.txtfor full package list