m1h/nymric

GitHub: m1h/nymric

nymric 通过追踪公开资料中的外部链接和头像感知哈希匹配,将跨平台的用户名或邮箱关联为带置信度评分的身份画像,解决了传统工具只返回扁平存在性列表而无法区分同名陌生人的痛点。

Stars: 1 | Forks: 0

# nymric ![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg) ![python](https://img.shields.io/badge/python-3.11%2B-blue) ![license](https://img.shields.io/badge/license-MIT-green) 在大量公开网站上检查用户名(或电子邮件),追踪出现的任何个人资料的链接,并将所有信息拼凑成关于同一个人的完整画像,同时为每条信息提供置信度。 ![demo](https://raw.githubusercontent.com/m1h/nymric/main/docs/demo.svg) ## 核心理念 这里的大多数工具(sherlock、whatsmyname、enola)都在回答一个问题:这个用户名是否存在于 N 个站点上。这很有用,但你得到的是一面扁平的命中列表墙,你仍需自己去分辨哪些是同一个人,哪些只是同名的陌生人。nymric 的精力正是花在第二部分上。 ## 功能 - 在经过精心筛选的站点集合中同时检查用户名 - 读取那些暴露了个人资料的页面上的外部链接,并从 bio 中提取该人的其他账号(他们的 twitter、twitch、关联的 github 等) - 将这一切串联起来。如果 dev.to 和 keybase 都指向我们找到的 github,那么该 github 就是 `confirmed`(已确认)。一个没有任何佐证的孤立命中只是 `possible`(可能的,可能是陌生人),不会被粉饰成确凿无疑的结果 - 还会匹配头像。具有相同照片的两个账号(通过在你的机器上运行的感知哈希来判断)就是一个 `confirmed` 的关联,即使没有任何 bio 将它们联系起来 - 也接受电子邮件。它会哈希该电子邮件,找到公开的 gravatar 资料,并根据返回的用户名进行追踪。不进行密码重置探测,只使用 gravatar 已经公开提供的信息 - 打印一个简短的拼图,如果需要输出到其他地方,可以使用 `--json` / `--md` / `--svg` ## 用途及其局限性 用于检查你自己的信息暴露、品牌和冒充监控,以及经过授权的研究。它不会进行登录、身份验证、任何越过封锁墙的操作、批量的“寻找所有人”,也不会去规避反机器人机制。仅限公开数据。[ethics](ETHICS.md) 文件很短,但这才是核心要点。 ## 安装 最简单的方法(一旦发布到 pypi): ``` pipx install nymric ``` 或者从源码安装: ``` git clone https://github.com/m1h/nymric cd nymric pip install . ``` 需要 python 3.11+,两个依赖项(httpx,rich)。还需要头像匹配功能吗?`pip install "nymric[avatars]"` 会拉取 pillow。其他所有功能在没有它的情况下也能运行。 ## 快速开始 指向一个用户名: ``` nymric torvalds ``` 你会得到该用户名出现的账号,按确认为同一个人的可能性分组,每个账号都有相应的理由。添加 `--json` 或 `--md report.md` 以保存结果。本 readme 顶部的图片就是一次真实的运行记录。 ## 用法 ``` nymric [options] -s, --sites NAME... only these sites (e.g. -s github lichess) -c, --concurrency N parallel requests (default 10) -t, --timeout SECS per-request timeout (default 10) --no-follow don't follow bio links, existence only --no-avatars don't hash profile pictures --ua STRING user-agent override --json json to stdout --md FILE also write a markdown report --svg FILE also save an svg screenshot -V, --version ``` 给它提供一个电子邮件地址,它会优先通过 gravatar 进行查询: ``` nymric someone@example.com ``` ## 对比 | tool | 返回的结果 | |---|---| | sherlock / enola | 该用户名是否存在于约 400 个站点上(扁平列表,需自行验证) | | whatsmyname | 一个精选的存在性数据集和一个浏览器应用 | | maigret | 存在性加上对同一用户名的递归搜索,产生大量数据 | | nymric | 追踪 bio 链接以找到该人的其他账号,并将它们拼凑成一个完整的画像,每个部分都包含置信度及其存在的理由 | ## 工作原理 每个站点在 [nymric/data/sites.json](nymric/data/sites.json) 中都是一行数据,而不是代码: ``` {"name": "github", "url": "https://github.com/{}", "method": "status", "links": true} ``` `status` 站点通过 200 还是 404 来判断。`text` 站点包含一个 `found` 标记(只有真实资料才包含的字符串)或一个 `absent` 标记(即“未找到”字符串,适用于像 steam 这样无论存在与否都返回 200 的站点)。标记中的 `{}` 会被替换为用户名。 最重要的规则:403 / 429 / 5xx 永远不算作“不存在”,它们被视为不确定。被机器人拦截机制挡住并不能证明该账号不存在。这是那些忽略此规则的工具中垃圾结果的最大来源,这也是为什么 reddit 不在列表中的原因(当你未登录时,它的边缘节点对真实用户和虚假用户提供完全相同的 403)。 添加一个站点只需编辑 json。其余部分是少数几个小文件:`probe`、`links`、`stitch`、`faces`、`mailto`。在 [DESIGN.md](DESIGN.md) 中有更详细的说明。 ## 坦诚面对局限性 - 用户名并不是唯一的。一个 `possible` 的命中确实可能是别人。这就是为什么它被标记出来而不是被隐藏的原因。 - 列表很小是故意的(21 个站点)。庞大的列表容易腐烂。这些站点在没有反机器人封锁墙的情况下也能正常运行。reddit、instagram、tiktok、x 需要身份验证或会阻止你,所以它们被排除了,而不是弄虚作假。 - 当站点重新设计时,标记可能会失效。因为它只是数据,所以修复只需一行。 ## 先前技术 站在 [sherlock](https://github.com/sherlock-project/sherlock)、 [maigret](https://github.com/soxoj/maigret) 和 [whatsmyname](https://github.com/WebBreacher/WhatsMyName) 数据集的肩膀上构建。这里的新角度是它们留给你去做的关联层。 ## 许可证 MIT。仅限合法研究,不提供任何担保。
标签:Blue Team, ESC4, OSINT, Python, 代码示例, 安全研究, 实时处理, 数据分析, 无后门, 身份关联, 运行时操纵, 逆向工具