HXLLO/WayTrace
GitHub: HXLLO/WayTrace
WayTrace 是一款被动 OSINT 侦察工具,通过挖掘 Wayback Machine 的历史存档,在零目标流量的前提下重构域名的完整历史情报时间线。
Stars: 2 | Forks: 0
# WayTrace
被动的 OSINT 侦察工具,可从 Wayback Machine (archive.org) 重建任何域名的完整数字历史记录。输入一个域名,WayTrace 便会抓取跨越数十年的已存档 HTML,选择最具揭示性的快照,并提取 **43 个类别** 的情报。每项发现都带有 `first_seen` / `last_seen` 时间戳,让您获得一份关于什么出现、更改和消失的完整时间线。
**无主动扫描。无暴力破解。无目标流量。仅使用来自 archive.org 的公开数据。**
[](https://waytrace.org)



## 试用
- **托管版:** [**waytrace.org**](https://waytrace.org) - 在浏览器中运行扫描,无需安装任何内容。
- **自托管:** 克隆并运行 `docker compose up`(参见 [快速开始](#quick-start))。自行运行可移除托管版单次扫描的快照数量上限,因此您可以对域名进行全面扫描。
界面完全支持双语(英语 / 法语),可从导航栏进行切换。
## 目录
- [工作原理](#how-it-works)
- [引导式扫描](#the-guided-scan)
- [智能快照选择](#smart-snapshot-selection)
- [提取类别](#extraction-categories)
- [发现与严重程度](#findings--severity)
- [结果界面](#results-interface)
- [分享与公共动态](#sharing--the-public-feed)
- [快速开始](#quick-start)
- [API 参考](#api-reference)
- [配置](#configuration)
- [架构](#architecture)
- [测试](#tests)
- [法律与道德](#legal--ethics)
## 工作原理
```
domain input
|
v
+---------------------------------------------------------------------+
| Phase 1 - CDX query |
| -------------------------------------------------------------------+
| Hit the archive.org CDX API -> every archived HTML URL for domain |
| Filter: text/html, status 200, paginated (resumeKey) |
| Local gzip cache in data/cdx/ to avoid redundant network calls |
| Result: up to 50 000+ snapshot records with timestamps + digests |
+--------------------------------+------------------------------------+
|
v
+---------------------------------------------------------------------+
| Phase 2 - Smart snapshot selection |
| -------------------------------------------------------------------+
| Score every URL path by OSINT value (HIGH / MEDIUM / LOW) |
| Deduplicate by CDX digest (drop identical content, keep earliest) |
| Spread picks year-proportionally so no era dominates |
| Enforce an adaptive cap based on domain size |
+--------------------------------+------------------------------------+
|
v
+---------------------------------------------------------------------+
| Phase 3 - Scraping |
| -------------------------------------------------------------------+
| Fetch HTML from the Wayback Machine for each selected snapshot |
| Concurrent requests (semaphore) + adaptive delay, backoff on 429 |
| Wall-clock budget: keep what is downloaded, never hang on stragglers|
| Strip the Wayback toolbar/injected scripts before parsing |
+--------------------------------+------------------------------------+
|
v
+---------------------------------------------------------------------+
| Phase 4 - Extraction & aggregation |
| -------------------------------------------------------------------+
| Parse with selectolax (C-based, ~10x faster than BeautifulSoup) |
| Run 43 extraction categories (regex + DOM + JSON-LD) |
| Aggregate first_seen / last_seen / occurrences, stamp source page |
| Rank findings by severity (LEAK > PIVOT > CONTEXT > BACKGROUND) |
+--------------------------------+------------------------------------+
|
v
Structured OSINT results
with temporal metadata
```
## 引导式扫描
每次扫描在下载任何页面之前,都会经过一个简短的交互式范围界定步骤;没有盲目启动。
**预检(仅阶段 1)。** 轻量级的 CDX 查询,不进行抓取。它返回总快照数、唯一路径、存档日期范围以及按路径划分的快照浏览器。
**范围界定页面。** 根据预检结果调整运行方式:
- 随时间变化的**快照直方图**;点击两个年份以限定范围。
- 用于精确 `from -> to` 窗口的**月精度日历**(月精度与 Wayback 数据的粒度相匹配)。
- **密度** - Fast (3/yr)、Dense (12/yr,默认) 或 Max (最新,直至上限)。
- **子域名选择器** - 存档中发现的每个子域名,均可单独选择。
- **排除 URL** - 带有预设的词标签(blog、tag、category、author、feed 等)。
- 随着您的调整,页面数量和耗时的**实时预估**也会更新。
当您启动时,选定的快照会被直接发送,从而绕过第二次 CDX 往返。
## 智能快照选择
并非所有存档页面的价值都相同。WayTrace 会对每个 URL 路径进行评分:
| 分数 | 路径 | 原因 |
|-------|-------|-----|
| **HIGH (3)** | `/contact`、`/about`、`/team`、`/staff`、`/people`、`/careers`、`/login`、`/admin`、`/press`、`/investors`、`/security`、`/partners`、`/privacy`、`/terms`、`/legal`、`/imprint`、`/blog` | 电子邮件、姓名、电话和内部 endpoint 通常会出现的地方 |
| **MEDIUM (2)** | 主页 `/` | 追踪品牌、技术栈和所有权随时间的变化 |
| **LOW (1)** | 其他所有内容 | 常规内容 |
**内容去重。** CDX 为每个快照提供一个 SHA-1 摘要;具有相同 `path + digest` 的快照会合并为最早出现的那一个,因此相同的页面不会被抓取两次。
**按年份比例分布。** 所选内容分布在各个存档年份中,而不是聚集在捕获数量最多的时间段,从而完整呈现域名的整个历史。
**自适应上限。** 最大页面数量随域名规模而缩放。在托管服务中,单次扫描上限(`HOSTED_SNAPSHOT_CEILING`,默认为 5000)保持运行有界;在自托管安装中将其设置为 `0` 即可进行全面扫描。
## 提取类别
43 个类别,每项发现都通过 `first_seen`、`last_seen` 和 `occurrences` 进行追踪。
**人员与联系方式**
`emails` . `phones` . `persons` . `social_profiles` . `pgp_keys`
**机密与暴露**
`api_keys` . `connection_strings` . `cloud_buckets` . `jwt_tokens` . `internal_ips` . `hidden_fields` . `directory_listings`
**基础设施与托管**
`subdomains` . `hosting` . `http_headers` . `status_pages` . `favicons` . `sitemaps_and_robots`
**技术与追踪**
`technologies` . `analytics_trackers` . `analytics_ids` . `adsense_ids` . `verification_tags` . `captcha_providers` . `cookie_consent` . `auth_providers`
**标识符与关联**
`crypto_addresses` . `french_business_ids` . `github_repos` . `organizations` . `bug_bounty_programs` . `job_boards`
**结构与内容**
`endpoints` . `js_urls` . `iframe_sources` . `outgoing_links` . `linked_documents` . `rss_feeds` . `assets` . `html_comments` . `meta_info` . `html_titles` . `addresses`
几个值得注意的类别:
- **emails** - 原始和混淆的形式,`mailto:` 链接;过滤掉了诸如 `noreply`、`example`、资产文件名和 JS 模块说明符等噪声。
- **api_keys** - AWS、Google、Stripe、SendGrid、Slack webhooks、GitHub token,以及现代低误报模式(Supabase、DigitalOcean、Shopify、Linear、npm)。始终被视为泄露。
- **cloud_buckets** - S3、GCS、Azure Blob、DigitalOcean Spaces URL,通常是配置不当的公开存储。
- **connection_strings** - MySQL、Postgres、Mongo、Redis、AMQP、MSSQL 等;输出中的凭据会被掩码处理。
- **subdomains** - 在旧页面下线很久后,仍从旧页面中引用的 dev / staging / api / internal 主机。
- **favicons** - 每个快照的图标及其 MD5/SHA-256 哈希值,这是一种跨域关联向量。
- **analytics_trackers** - GA/GA4、GTM、Meta Pixel、Hotjar、Mixpanel 等;跨域共享的 ID 会将它们链接到同一所有者。
每项发现还会记录其来源的 **source page**,因此同时出现的实体(同一存档页面上的电子邮件和电话)可以一起进行枢纽分析。
## 发现与严重程度
WayTrace 将每个结果划分为四个级别,并自动突出显示重要的结果:
| 级别 | 含义 | 示例 |
|------|---------|----------|
| **LEAK** | 所有者无意发布的敏感暴露 | 有效 API keys、暴露的 cloud buckets、带凭据的 connection strings、JWT、内部 IP、目录列表 |
| **PIVOT** | 值得追查的线索 | 具名的邮箱、子域名、admin/auth endpoint、公开 API keys、人员、GitHub repos、企业 ID |
| **CONTEXT** | 有用的背景信息 | 技术栈、分析追踪器、托管/CDN、组织、HTTP headers |
| **BACKGROUND** | 为完整性而列出,从不突出显示 | meta tags、titles、assets、outgoing links、comments |
LEAK 和 PIVOT 会被提升到结果的顶部;CONTEXT 和 BACKGROUND 则保持只需点击一次即可查看的状态。
## 结果界面
结果以单页面打开,包含一个带选项卡的情报区块:
- **Activity** - 在共享的年份轴上,每个类别对应一条时间线通道;点击通道可展开每个值的甘特图,并查看每个实体处于活跃状态的时间。
- **Pivots** - 一个放射状图表,将域名链接到其电子邮件、子域名、人员、组织、社交媒体、GitHub、追踪器、favicons 和托管信息。
- **Subdomains** - 按出现次数及其活跃期进行排名。
- **Tech & infra** - 技术栈、托管/CDN,以及首次/最后一次出现的 HTTP headers。
跨越所有选项卡:**全局搜索**(一次性过滤所有选项卡)、**可排序的列**、**一键复制列**(例如所有电子邮件)以及**导出**为 JSON、CSV(当前选项卡)或一次性导出所有类别。整个 UI 是双语的(EN / FR)。
## 分享与公共动态
完成的扫描由一个 24 字符的 `url_id`(capability token)进行寻址。您可以将其保密,也可以将其发布到公共动态中。共享的扫描可被任何拥有链接的人查看,并可导出为 JSON、CSV 或独立的 HTML 报告。[waytrace.org](https://waytrace.org) 上的托管实例以账户限制模式运行以启动扫描;自托管安装则可以完全开放运行。
## 快速开始
### Docker(推荐)
```
git clone https://github.com/HXLLO/WayTrace.git
cd WayTrace
cp .env.example .env
docker compose up -d
```
打开 **http://localhost:8000**。
### Docker(开发环境,热重载)
```
cp .env.example .env
docker compose -f docker-compose.dev.yml up
```
### 手动
```
cd backend
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp ../.env.example ../.env
uvicorn main:app --reload
```
打开 **http://localhost:8000**。
## API 参考
交互式 Swagger 文档位于 **http://localhost:8000/docs**。
### POST /api/scan/preflight
轻量级 CDX 查询;返回域名统计信息而不进行抓取。
```
curl -X POST http://localhost:8000/api/scan/preflight \
-H "Content-Type: application/json" \
-d '{"domain": "example.com"}'
```
```
{
"domain": "example.com",
"total_snapshots": 47404,
"html_snapshots": 12861,
"unique_paths": 971,
"date_range": { "first": "2003-08", "last": "2026-01" },
"path_groups": [
{ "path": "/", "score": 2, "count": 412, "snapshots": [ ... ] },
{ "path": "/contact", "score": 3, "count": 89, "snapshots": [ ... ] }
]
}
```
### POST /api/scan
创建扫描。立即返回一个 `job_id`;通过轮询或流式传输获取结果。`config` 是可选的。
```
curl -X POST http://localhost:8000/api/scan \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com",
"config": {
"depth": "standard",
"date_from": "2018-01",
"date_to": null,
"categories": ["emails", "subdomains", "api_keys", "phones"],
"exclude_keywords": ["tag", "category"]
}
}'
```
传递 `selected_snapshots`(来自预检的 `path_groups`)以精确抓取您选择的页面:
```
{
"domain": "example.com",
"selected_snapshots": [
{ "timestamp": "20210615120000", "url": "https://example.com/contact" }
]
}
```
### GET /api/jobs/{job_id}
轮询状态并在完成后检索结果。
```
{
"id": "3f8a2c1d-...",
"status": "completed",
"progress": 100,
"meta": {
"domain": "example.com",
"total_snapshots_found": 12861,
"snapshots_analyzed": 312,
"pages_scraped": 298,
"date_first_seen": "2003-08",
"date_last_seen": "2026-01"
},
"results": {
"highlights": [ { "severity": "LEAK", "category": "api_keys", "...": "..." } ],
"emails": [ { "value": "ceo@example.com", "first_seen": "2009-03", "last_seen": "2021-11", "occurrences": 14 } ],
"subdomains": [ "..." ]
}
}
```
状态进度:`queued` -> `running` -> `completed` | `failed`。
### GET /api/jobs/{job_id}/stream
Server-Sent Events,用于实时进度(优于轮询)。事件:`progress`、`complete`、`error`、`expired`;每 15 秒发送一次心跳。
### 共享扫描
`GET /api/s/{url_id}`(查看)、`POST /api/s/{url_id}/publish`(切换公开状态)和 `GET /api/s/{url_id}/export.{json,csv,html}`(下载)。`GET /api/feed` 列出已发布的扫描。
### GET /api/health
```
{ "status": "ok", "uptime_seconds": 3842, "active_jobs": 1 }
```
## 配置
所有设置都位于 `.env` 中(从 `.env.example` 复制)。默认配置对 archive.org 很友好;提高并发或减少延迟会导致您被限流。
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `MAX_CONCURRENT_SCRAPES` | `8` | 并发 Wayback 请求 (1-50) |
| `ARCHIVE_REQUEST_TIMEOUT` | `60` | 每个请求的超时时间(秒) |
| `ARCHIVE_RETRY_COUNT` | `3` | CDX/Wayback 瞬时错误的重试次数 |
| `SCRAPE_DELAY_MIN` | `0.25` | 请求之间的最小延迟(秒) |
| `SCRAPE_DELAY_MAX` | `0.75` | 请求之间的最大延迟(秒) |
| `SCRAPE_MAX_RETRIES` | `3` | 每次页面抓取的重试次数 |
| `JOB_TTL_SECONDS` | `7200` | 任务过期时间(2 小时) |
| `MAX_ACTIVE_JOBS` | `10` | 最大并发扫描数 |
| `SCAN_TIMEOUT_SECONDS` | `3600` | 每次扫描的硬超时限制(60 分钟) |
| `HOSTED_SNAPSHOT_CEILING` | `5000` | 单次扫描的快照上限;`0` 表示禁用,用于自托管的全面扫描 |
| `CORS_ORIGINS` | `localhost:5173,3000` | 逗号分隔的允许来源 |
| `DATABASE_URL` | `/data/waytrace.db` | SQLite 路径(在 Docker 外部覆盖) |
| `LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` `WARNING` / `ERROR` |
自适应速率限制器(`RATE_LIMIT_*`)会在遇到 429 错误时自动增加延迟,并在连续成功后恢复;有关完整设置,请参见 `.env.example`。
## 架构
```
backend/
main.py FastAPI app, middleware, lifespan (TTL cleanup)
config.py Pydantic settings from .env
models.py Request/response schemas (Pydantic v2)
db.py SQLite (aiosqlite) - crawl state, jobs, findings
store.py In-memory job index + fair queue for live progress
routers/
scan.py POST /scan, POST /scan/preflight, GET /jobs/{id}, SSE
public.py Shared scans (/api/s/{url_id}), publish, exports, feed
health.py GET /health, GET /stats
services/
cdx.py CDX client, HTML-only, paginated, gzip cache
filters.py Snapshot selection, path scoring, dedup, density
scraper.py Concurrent Wayback downloader, semaphore, backoff, budget
extractor/ One module per category (43 total) + finalize/highlights
frontend/
index.html Single file, vanilla JS, dark theme, no build step,
bilingual EN/FR, tabbed results, search, export
tests/ ~1200 tests: extraction, selection, API, regressions
```
**技术栈:** Python 3.12+、FastAPI、aiohttp、selectolax、Pydantic v2、aiosqlite、loguru。
**设计说明:**
- **selectolax** 而非 BeautifulSoup - 基于 C 语言,对于海量解析的速度快约 10 倍。
- **全面异步** - 所有网络 I/O 均使用 aiohttp,无阻塞调用。
- **CDX 服务端过滤** - 仅请求 `text/html` + `status:200`,绝不含成千上万的资产条目。
- **自适应速率限制** - `asyncio.Semaphore` + 抖动延迟;遇 429 时退避,成功时恢复。
- **抓取时间预算** - 缓慢的 archive.org 永远不会挂起扫描;即使丢弃了慢速加载的页面,已下载的页面也会被保留并进行分析。
- **逐项发现的来源** - 每个实体都盖有源页面的时间戳,以便进行共现枢纽分析。
## 测试
```
cd backend
python -m pytest tests/ -q # full suite
python -m pytest tests/test_extractor.py -q # core extraction patterns
python -m pytest tests/test_filters.py -q # snapshot selection
python -m pytest tests/test_api.py -q # API endpoints
```
每个提取类别都附带专门的正向和误报测试(每种至少五个),以及 API 验证、任务生命周期、选择算法和端到端集成测试。
## 法律与道德
WayTrace **仅查询** Wayback Machine (archive.org) 的公开存档。它不会对目标系统执行任何主动扫描、端口扫描、暴力破解、DNS 枚举或任何侵入性操作。
- 旨在用于合法的安全研究、OSINT 调查、尽职调查和竞争情报。
- 请勿将其用于骚扰、跟踪或任何非法活动。
- 您需对如何使用提取的数据负全责。
- 尊重 [archive.org 的条款](https://archive.org/about/terms.php);请勿超量发送请求或试图绕过速率限制。
滥用报告和移除请求:[legal@waytrace.org](mailto:legal@waytrace.org)。
## 许可证
[MIT](LICENSE)
标签:AV绕过, ESC4, FastAPI, OSINT, Python, Wayback Machine, 反汇编, 安全工具库, 实时处理, 情报收集, 无后门, 漏洞研究, 被动侦察, 请求拦截, 逆向工具