th4r4s/vestige

GitHub: th4r4s/vestige

Vestige 是一款 OSINT 标识符查找工具,通过同时扫描域名的当前在线页面和 Wayback Machine 历史档案,提取并验证电子邮件、电话、社交档案、加密货币钱包及地理位置等关键信息。

Stars: 2 | Forks: 0

# Vestige **追踪人们留下的痕迹 —— 遍布当下的互联网及其档案。** Vestige 是一款 OSINT 工具,能够从域名的**当前在线网站**及其**历史 Wayback Machine 快照**中提取**标识符**,然后将它们分组呈现给分析师: - 📧 **电子邮件** - ☎️ **电话号码** —— 使用 libphonenumber 解析,具备区域感知能力,并在离线状态下通过**运营商 / 线路类型 / 地区**(例如 `Azercell · mobile · Azerbaijan`)进行丰富化 - 🔗 **社交档案** —— Twitter/X、Instagram、Facebook、LinkedIn、YouTube、TikTok、VK、OK、Telegram、WhatsApp、GitHub、Reddit……以完整的可点击链接形式展示 - ₿ **加密货币钱包** —— BTC、ETH/EVM、TRON、LTC、DOGE、XRP、xpub —— 每一次命中都会经过**校验和验证**,因此随机的十六进制字符绝不会蒙混过关 - 📍 **位置** —— 来自 geo ``、Google-Maps 嵌入和 schema.org `GeoCoordinates` 的地图坐标,渲染为 Maps 链接 它的存在是为了应对调查中经常出现的一种非对称情况:**当前的网站已被清理,但档案依然留存着记忆。** 被抹除的联系页面、被删除的加密货币捐赠页脚、被重命名的实体、过去的团队页面 —— Wayback 保留了那个依然包含数据的版本,而 Vestige 在一次运行中即可读取过去与现在。 ## 它的起源(归属说明) Vestige 最初是作为 **[`soxoj/kronikier`](https://github.com/soxoj/kronikier) 的一个分支**起步的 —— 这是一款小巧而专注的工具,用于从域名的 **web.archive.org** 历史记录中挖掘**电子邮件和电话号码**。那个档案引擎是一个很好的起点,我们保留了它。下面列表中的所有其他内容都是我们在此基础上构建的,随后将最终成果重新命名为 **Vestige**。 ## Vestige 在 kronikier 之上增加了什么 以下是从你实际运行它时能得到什么的角度,写下的诚实的前后对比: | | 原版 `kronikier` | **Vestige(本项目)** | |---|---|---| | **检索位置** | 仅限 Wayback 档案 | **当下的在线网站** *以及* 档案 —— 或两者并排对比 | | **检索内容** | 电子邮件 + 电话号码 | 电子邮件、电话、**社交档案、加密货币钱包和地图位置** | | **运行方式** | 仅限命令行 flags | **向导式引导**(无需记忆 flags)*或* 单命令模式 | | **语言** | 英语 | **English、Русский、Türkçe** —— 涵盖整个界面 *以及* 扫描进度 | | **现代 JS 站点** | 仅限纯 HTML | 无需浏览器即可读取 **JavaScript 渲染 (SPA) 内容**(Next.js / Nuxt / Redux / Apollo) | | **运行过程** | 滚动的日志行 | **实时仪表盘** —— 进度条、按类别统计的计数器以及实时出现的发现 | | **结果可信度** | 原始 regex 匹配 | **全方位验证** —— 加密货币校验和、电话线路类型检查、虚拟/占位符号码过滤、联系 URL 优先级排序 | | **记录留存** | — | 每次扫描的仅追加、**带有 SHA-256 戳记的审计日志** (`~/.vestige/audit.jsonl`) | 简而言之,如果 kronikier 回答的是“*这个域名过去显示过哪些电子邮件和电话?*”,那么 Vestige 回答的则是“*这个域名现在和过去暴露了哪些类型的标识符 —— 以你的语言呈现,并且结果已经过清理和交叉核对。*” ### 逐一介绍新增功能 - **在线网站扫描。** 将其指向一个域名,它就会像今天存在的那样抓取网站,而不仅仅是抓取档案。你可以选择深度 (`0–10`)。 - **优先扫描联系页面。** 实时爬虫是*最佳优先*的:它会**优先**访问 `/contact`、`/team`、`/about`、`/əlaqə`、`/haqqımızda` 风格的页面,无论它们隐藏得有多深,并将低价值页面(`/tag`、`/category`、`/search`、博客订阅源)留到最后。因此,高深度不会浪费你的预算去漫无目的地游荡 —— 它会优先降落在包含联系方式的页面上。 - **三种新的标识符类型** —— 社交档案、加密货币钱包和位置 —— 每一种在展示前都经过了验证/格式化。 - **三语向导。** 首先选择你的语言,然后是数据源,接着是你想要的类别(只需勾选你需要的),最后是域名和深度。 - **全面本地化。** 不仅是菜单 —— 档案扫描自身的进度消息("Querying CDX index…"、"Plan…")也被翻译了。 - **单命令模式。** 完全跳过向导,使用单个带 flag 的命令运行整个扫描(见下文)。 - **实时仪表盘。** 一个进度条、命中时变绿的各类别计数器、当前页面,以及最近发现的展示流 —— 而不是一面满屏的日志墙。 - **JavaScript 站点支持。** 许多现代站点在浏览器中渲染其内容,因此普通的 fetch 只能看到一个空壳。Vestige 在纯 Python 环境中挖掘 hydration payload,并无论如何都能恢复标识符。 - **感知国家的电话号码。** 模棱两可的号码会首先在*域名所在的国家/地区*进行读取,因此阿塞拜疆巴库的固定电话 `012 436 74 10` 会被正确报告为 `+994 12 436 74 10`,而不是被误读为法国的 `+33 1 24 36 74 10`。ccTLD(`.az → AZ`、`.tr → TR`、`.ru → RU`,……)在实时扫描和档案扫描中均设置了区域优先级。 - **更干净的结果。** 加密货币地址必须通过校验和;明显是模板占位符的电话号码(表单中的 `+994 50 123 45 67` 示例,或 `+1 310-XXXX` 零件号码)会被丢弃;社交“share/intent”噪声会被过滤。 - **保管链审计日志。** 每次运行都会追加一行防篡改、带 SHA-256 戳记的 JSON 数据 —— 这在调查结果日后需要经受审查时非常有用。 ## 安装 要求 **Python 3.10+**。 ``` pip install -e . ``` 或者使用 [pipx](https://pipx.pypa.io) 将其安装为独立的命令行工具: ``` pipx install . ``` 如果需要运行测试,请安装开发扩展包: ``` pip install -e ".[dev]" ``` ## 快速开始(交互式向导) 不带任何参数运行即可启动引导式向导 —— 无需记忆任何 flag: ``` python -m vestige # or just: vestige ``` 它会引导你完成四个选择: ``` Language / Язык / Dil: [1] English [2] Русский [3] Türkçe > 1 Choose a data source: [1] Current live site ← the site as it is now [2] Wayback Machine archive ← its archived history [3] Both (live site + archive) > 3 What should we look for? (pick one or more) [1] Emails [2] Phone numbers [3] Social profiles [4] Crypto wallets [5] Locations (map coordinates) Type numbers separated by commas (e.g. 1,3) — empty = all. > 1,3 Enter a domain (e.g. example.com): example.com Enter crawl depth [0-10] (2): 1 ``` 随后 Vestige 会扫描选定的数据源,打印一份分类报告(每种标识符类型各占一部分),并在当前目录下生成一个 CSV 文件。 ``` Results — example.com Found 2 result(s). [#] Social profiles (2) Value Source ────────────────────────────────────────────────── ────────────────────── https://www.facebook.com/example https://example.com/ https://www.youtube.com/@example https://example.com/ ``` ## 三大数据源 | 选项 | 作用 | | ------ | ------------ | | **当前在线网站** | 抓取当前存在的网站,**优先访问 contact / team / about 页面**,并保持在同一域名下。你可以选择 **抓取深度 (0–10)** —— `0` 仅抓取输入的页面,数值越高则会跟踪更多的链接。 | | **Wayback 档案** | 使用 Internet Archive CDX + availability API 获取历史快照,并根据 URL 包含标识符的可能性进行排序。这是该工具大放异彩的地方:它能恢复在线网站不再显示的内容。 | | **两者** | 同时运行两者并并排生成报告(一个**当前**区块和一个**档案**区块),以便你查看随时间发生的变化。 | ## 类别 准确选择你想要的内容 —— 其余的将被跳过: | # | 类别 | 备注 | |---|----------|-------| | 1 | **电子邮件** | 对 `name [at] domain [dot] com`、Cloudflare 保护的电子邮件、`mailto:` 链接、全角字符等进行反混淆处理。免费提供商地址(`name@mail.ru`、`name@gmail.com`)会被**保留** —— 因为它们通常是真实的业务联系方式。 | | 2 | **电话号码** | 使用 libphonenumber 提取,区域优先级由域名的 TLD 推导得出(`.az → AZ`、`.tr → TR`、`.ru → RU`,……),以国际格式显示,并通过运营商 / 线路类型进行丰富化。模板占位符和零件编号类似的数字将被丢弃。 | | 3 | **社交档案** | 格式化并以**完整的可点击 URL** 形式展示,保留真实路径。过滤掉 Share/intent/post 噪声。对于那些链接由 JavaScript 设置的按钮,仍会被标记为“存在”。 | | 4 | **加密货币钱包** | BTC (Base58Check + bech32/bech32m)、ETH/EVM (EIP-55 mixed-case)、TRON、LTC、DOGE、XRP、extended pubkeys。**强制进行验证** —— 校验和损坏或地址拼写错误都会被拒绝,这正是保持结果干净整洁的原因。 | | 5 | **位置** | 来自 geo `` 标签、Google-Maps 嵌入/URL 以及 schema.org `GeoCoordinates` 的坐标,渲染为可点击的 Maps 链接。为了保持较低的误报率,故意忽略了正文中纯粹的十进制小数坐标。 | ## 语言 整个界面 —— 提示、类别名称、报告标题,**以及档案扫描自身的进度消息** —— 均提供 **English、Русский 和 Türkçe** 版本,并在第一步即可选择。输出采用 UTF-8 编码,因此 Cyrillic 和 Turkish 字符可以在任何终端上正确显示。 ## 输出 每次运行都会生成: - 屏幕上的一个**分组表格**,按数据源(当前 / 档案)和类别划分,并为存档的命中内容提供首次出现 / 最后出现的时间线。 - 一个 **CSV** 文件(`_.csv`,采用带 BOM 的 UTF-8 编码,以便在 Excel 中完美打开),其中包含一个 `source` 列以及规范化的值、见过的所有不同原始格式,还有来源 URL。 - **审计日志**(`~/.vestige/audit.jsonl`)中的一条记录。 该工具仅向目标站点以及 `web.archive.org` / `archive.org` 发送请求。不会向任何地方上传数据。 ## 使用单命令代替向导 向导是默认选项,但你也可以使用数据源 flag,通过单条非交互式命令运行完全相同的扫描 —— 无需逐步提示: ``` vestige example.com --current-site # scan the live site now vestige example.com --current-site --depth 2 --lang tr # depth + Turkish output vestige example.com --archive-scan --categories email,phone vestige example.com --both --json > out.json # both sources, JSON to stdout ``` | Flag | 含义 | | ---- | ------- | | `--current-site` (`--live`) | 扫描当前的在线网站 | | `--archive-scan` (`--wayback`) | 扫描 Wayback 档案 | | `--both` | 扫描两者 | | `--depth N` | 实时抓取深度 0–10(默认 2) | | `--lang en\|ru\|tr` | 输出语言 | | `--categories email,phone,social,crypto,geo` | 指定要查找的内容(默认:所有) | | `--json` / `--csv PATH` / `--no-csv` | 输出 JSON 到 stdout / 自定义 CSV 路径 / 跳过 CSV | 输出结果 —— 分组报告、CSV、审计记录、完成摘要 —— 与手动操作向导的完全一致。运行 `vestige --help` 获取完整的、基于示例的指南。 ## 脚本(传统档案 CLI) 原版的 kronikier 档案扫描器仍然完全支持通过 flag 进行自动化驱动: ``` vestige example.com # archive scan, default 5-minute budget vestige example.com --deep # longer budget vestige example.com --exhaustive # scan everything, no time limit vestige --targets-file targets.txt # batch a list of domains ``` ## 工作原理 ``` ┌───────────────────────────┐ your domain → │ Current source (live.py) │──┐ │ best-first crawl, 0–10 │ │ │ contact/team pages first │ │ ┌──────────────────────┐ └───────────────────────────┘ ├──▶│ extract_all() │ │ │ email · phone · │──▶ grouped ┌───────────────────────────┐ │ │ social · crypto · │ report your domain → │ Archive source │──┘ │ geo (validated) │ + CSV │ Wayback CDX + fetch, │ └──────────────────────┘ + audit │ relevance-ranked │ └───────────────────────────┘ ``` 两个数据源都输入到**相同的提取器**中,因此该工具学会查找的任何内容,都能在过去和现在中被 alike 找到。加密货币、社交和地理位置检测各自运行在其独立的 HTML 解析上,并在报告之前对每次命中进行验证/格式化。 ## 开发 ``` pip install -e ".[dev]" pytest # unit tests (offline) pytest -m e2e # end-to-end tests that hit the live archive (slow) ``` ## 致谢与许可 - 原始档案扫描工具:**[soxoj/kronikier](https://github.com/soxoj/kronikier)** —— 感谢他们。 - 在此基础上构建的一切:**Vestige**。 基于 **MIT** 许可证发布。
标签:BSD, ESC4, OSINT, 数据挖掘, 网络情报分析, 逆向工具