YoshiBigSmoke/webexplorer
GitHub: YoshiBigSmoke/webexplorer
一款基于公开数据源的被动域名发现与侦察工具,通过 TLD 或区域维度汇聚域名并验证存活状态,适用于安全评估中的资产测绘场景。
Stars: 0 | Forks: 0
# WebExplorer
一款被动域名发现和侦察工具,可通过 TLD 或地理区域查找真实网站。它使用公共证书透明度日志、互联网档案馆和 urlscan.io——在发现过程中不进行侵入式扫描,也不与目标进行任何交互。
## 功能介绍
给定一个类似 `.co` 的 TLD 或类似 `latam` 的区域,WebExplorer 会:
1. 并行从三个公共来源**发现**域名
2. 通过 DNS 查找和 HTTP/HTTPS 探测来**验证**每个域名
3. **报告**哪些网站处于活跃状态——包括 IP 地址、TLS 状态、HTTP 状态码、页面标题和服务器标头
4. 将所有数据在本地 SQLite 中**缓存**,以便数据随着时间的推移不断积累,并且即使远程源出现故障,工具也能继续工作
## 内部工作原理
### 阶段 1 — 发现
三个来源通过 `ThreadPoolExecutor` 并行运行:
| 来源 | 方法 | 发现内容 |
|--------|--------|---------------|
| **crt.sh** | `GET /?q=%.{tld}&output=json` | 拥有该 TLD 公共 SSL 证书的所有域名 |
| **Wayback Machine CDX API** | `GET /cdx/search/cdx?url=*.{tld}` | 互联网档案馆抓取到的域名(包括纯 HTTP 和历史网站) |
| **urlscan.io** | `GET /api/v1/search/?q=domain:*.{tld}` | 基于浏览器扫描的额外覆盖范围(可选 API 密钥) |
如果全局 crt.sh 查询未达到域名限制,将触发**前缀回退**机制:它会以 5 个为一批并行查询 `a%.{tld}`、`b%.{tld}`、...、`z%.{tld}`,以提取更多结果。
crt.sh 存在一个已知的不稳定性问题——其 PostgreSQL 后端会在负载过大时宕机。WebExplorer 通过**耐心的重试逻辑**来处理此问题:最多尝试 4 次,每次尝试超时 60 秒,两次重试之间等待 30 秒。在等待期间,它会向用户实时显示重试状态。
### 阶段 2 — 验证
每个发现的域名都会经历以下过程:
1. **DNS 解析** — 解析 `A` 记录以获取 IP。DNS 解析失败的域名会被标记并在 HTTP 阶段跳过。
2. **HTTP 探测** — 优先尝试 HTTPS,失败后回退到 HTTP。遵循重定向,读取最多 50KB 的响应体,提取页面的 `` 标签。
3. **并行化** — 所有域名均通过可配置的线程池(默认:15 个工作线程)并发验证。
### 阶段 3 — 缓存
每次成功扫描后,结果会自动保存到 `webexplorer/cache.db` (SQLite) 中:
- **域名发现**结果在阶段 1 后保存
- **验证结果**(IP、状态、标题、服务器)在阶段 2 后保存
- `INSERT OR IGNORE` 可防止重复——如果数据库中已存在某个域名,则会跳过而不会覆盖
- 缓存**严格按 TLD 隔离**——查询 `.co` 只会读取和写入 `.co` 的记录,绝不会涉及 `.com` 或其他任何记录
- 如果 crt.sh 不可用且没有任何来源返回结果,该工具将**回退到该确切 TLD 的本地缓存**,并显示以前发现的域名
```
Phase 1: crt.sh + Wayback + urlscan ──► merge ──► save to cache
│
if all sources fail ◄─────┘
│
load from cache (same TLD only)
```
## 系统要求
- Python **3.10 或更高版本**
- 网络连接(用于发现阶段)
- 无需 API 密钥(urlscan.io 可在免费套餐下运行,但结果数量会减少)
### Python 依赖项
```
requests>=2.33.0
dnspython>=2.8.0
urllib3>=2.6.0
beautifulsoup4>=4.14.0
rich>=15.0.0
```
安装命令:
```
pip install -r requirements.txt
```
## 安装说明
```
git clone https://github.com/YoshiBigSmoke/webexplorer.git
cd webexplorer
pip install -r requirements.txt
python3 webexplorer.py --help
```
适用于任何安装了 Python 3.10+ 的系统。已在运行 Python 3.13 的 **Arch Linux** 上经过测试。
## 使用方法
```
# Single TLD
python3 webexplorer.py -t .co
python3 webexplorer.py -t .jp
# 单次运行多个 TLD
python3 webexplorer.py -t .ke .ng .za
# 完整地理区域
python3 webexplorer.py -r latam
python3 webexplorer.py -r africa
python3 webexplorer.py -r europe
# 通用与现代 gTLD
python3 webexplorer.py -r generic # .com .net .org .io .co .app .dev .ai
python3 webexplorer.py -r new-gtld # .xyz .online .site .tech .store ...
# 调整扫描
python3 webexplorer.py -t .au -l 50 # 50 domains per TLD (default: 30)
python3 webexplorer.py -t .au -w 20 # 20 parallel threads (default: 15)
python3 webexplorer.py -t .au -o out.txt # save live domains to a text file
# Cache
python3 webexplorer.py --cache-info # show what's stored locally
python3 webexplorer.py -t .co --no-cache # skip cache fallback (still saves new data)
```
### 标志参数
| 标志 | 描述 | 默认值 |
|------|-------------|---------|
| `-t` | 一个或多个要扫描的 TLD | — |
| `-r` | 预定义区域 | — |
| `-l` | 每个 TLD 最多发现的域名数量 | `30` |
| `-w` | 并行验证线程数 | `15` |
| `-o` | 将存活站点的结果保存到文本文件 | — |
| `--cache-info` | 显示本地缓存摘要 | — |
| `--no-cache` | 不使用缓存作为回退方案 | — |
| `--list-regions` | 列出所有可用的区域 | — |
## 可用区域
| 区域 | TLDs |
|--------|------|
| `africa` | .za .ng .ke .gh .tz .ug .et .sn .cm .ci .ma .dz .tn .eg |
| `asia` | .jp .kr .th .vn .id .ph .my .sg .bd .lk .np .mm |
| `latam` | .mx .br .ar .co .cl .pe .ve .ec .bo .py .uy .gt .hn .sv .ni .cr .pa .do .cu |
| `europe` | .de .fr .es .it .pt .nl .be .pl .ro .cz .sk .hu .hr .rs .bg .ua .gr |
| `middleeast` | .sa .ae .ir .iq .sy .jo .lb .il .tr .pk |
| `oceania` | .au .nz .fj .pg .sb .vu .ws .to |
| `generic` | .com .net .org .io .co .app .dev .ai |
| `new-gtld` | .xyz .online .site .tech .store .shop .cloud .digital .world .space .life .live .media .news |
| `usa` | .us .gov .edu .mil |
| `canada` | .ca |
| `uk` | .uk .co.uk .org.uk .me.uk |
## 缓存数据库
缓存是位于 `webexplorer/cache.db` 的 SQLite 文件,在首次运行时自动创建。Schema:
```
CREATE TABLE domains (
tld TEXT NOT NULL,
domain TEXT NOT NULL,
ts INTEGER NOT NULL, -- first discovery timestamp
ip TEXT, -- resolved IP address
alive INTEGER, -- 1 = responded, 0 = did not respond
https INTEGER, -- 1 = HTTPS, 0 = HTTP only
status INTEGER, -- HTTP status code
title TEXT, -- page
server TEXT, -- Server response header
verified_at INTEGER, -- last verification timestamp
PRIMARY KEY (tld, domain)
)
```
查询示例:
```
# 所有存活的 .co 域名及其 IP 和标题
sqlite3 webexplorer/cache.db \
"SELECT domain, ip, status, title FROM domains WHERE tld='co' AND alive=1;"
# 每个 TLD 的域名数量
sqlite3 webexplorer/cache.db \
"SELECT tld, COUNT(*) FROM domains GROUP BY tld ORDER BY COUNT(*) DESC;"
```
## 数据来源
所有来源均公开且免费:
| 来源 | API | 备注 |
|--------|-----|-------|
| [crt.sh](https://crt.sh) | `https://crt.sh/?q=%.{tld}&output=json` | Sectigo 提供的证书透明度聚合器 |
| [Wayback Machine](https://web.archive.org) | CDX API | 互联网档案馆抓取索引 |
| [urlscan.io](https://urlscan.io) | REST API | 免费套餐可用,在脚本中设置 `URLSCAN_API_KEY` 可获得更好结果 |
## 测试环境
- **操作系统:** Arch Linux (内核 6.x)
- **Python:** 3.13
- **已测试的 TLD:** .co, .mx, .jp, .au, .ke, .de, .io, .com
## 免责声明
WebExplorer 仅查询公共 API 和开放数据集。在发现阶段,它不会向目标域名发送任何请求。阶段 2 中的 HTTP 验证是与浏览器访问完全相同的标准 Web 请求。此工具仅用于教育和研究目的。
标签:C2日志可视化, CDX API, DNS枚举, DNS解析, ESC4, GitHub, HTTP探测, OSINT, Python, SQLite, TLD扫描, TLS状态检测, urlscan.io, Wayback Machine, WebExplorer, 互联网档案, 区域扫描, 反汇编, 域名发现, 多线程扫描, 子域名枚举, 安全工具库, 开源情报收集, 开源项目, 指纹识别, 无后门, 目标发现, 系统安全, 网站存档, 网站探测, 网络安全, 网络安全工具, 被动侦察, 证书透明度日志, 资产测绘, 逆向工具, 通用签名格式, 隐私保护