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 的公开数据。** [![在线访问 waytrace.org](https://img.shields.io/badge/live-waytrace.org-6f5bd6)](https://waytrace.org) ![MIT 许可证](https://img.shields.io/badge/license-MIT-blue) ![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue) ![FastAPI](https://img.shields.io/badge/FastAPI-0.115-green) ## 试用 - **托管版:** [**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, 反汇编, 安全工具库, 实时处理, 情报收集, 无后门, 漏洞研究, 被动侦察, 请求拦截, 逆向工具