返回更新列表
已更新Aug 20, 2026

ProtOSINT — 已更新!

ProtOSINT 是一个 Python 脚本,可帮助你调查 Proton Mail 账户。

分享

ProtOSINT

ProtOSINT 是一个 Python 脚本,帮助您调查 Proton Mail 账户。

protosint (1)

版本

这是 ProtOSINT v2。第一版已经存在好几年了,但 Proton 的 API 发生了变化,旧的检查方法不再有效,因此此次重写使该工具重获新生。衷心感谢 NeutrOSINT 在此期间持续进行此类研究。

描述

本工具专为 Proton Mail 的 OSINT 工作设计(仅限教育和授权用途)。您提供一个电子邮件地址、用户名或域名,它会告诉您能发现什么:该地址是否真实存在、账户的加密密钥创建时间、使用的算法,以及自定义域名是否托管在 Proton 上。

它包含四个模块:

  • [1] 检查一个 Proton 邮箱:是否存在,以及密钥创建日期和类型。
  • [2] 在所有 Proton 域名(protonmail.com、protonmail.ch、pm.me、proton.me)上枚举一个用户名。
  • [3] 检查一个域名是否使用 Proton Mail(通过其 MX 记录,并与密钥服务器交叉验证)。
  • [4] 通过真实的已登录 Proton 会话批量验证地址列表。

工作原理(以及原因)

Proton 故意让账户枚举变得困难,因此简单的检查会欺骗您。ProtOSINT 通过结合三个来源并针对不同任务信任正确的来源来绕开这一问题。

密钥服务器对不存在的地址撒谎。 Proton 的公共密钥服务器(pks/lookup)会为 Proton 域名上的任何地址返回一个伪造的“诱饵”密钥(带有虚构的创建日期),无论该地址是否存在。因此,“有效密钥 + 良好日期”并不能证明该地址存在。密钥服务器仍然有用,但仅用于读取您已确认存在的地址的真实密钥日期。

账户 API 更好,但不完美。 Proton 的账户 API(/users/available)会告诉您某个用户名是否可用。大部分时候是正确的,但它检查的是用户名,而非特定地址,因此在边缘情况下可能出错——[email protected] 可能显示为“已被占用”,即使该 .ch 地址从未创建。

唯一完全可靠的检查是 Proton 自己的撰写窗口。 当您在“收件人”字段中输入地址时,Proton 会进行验证,如果邮箱不存在则将其标记为红色。ProtOSINT 可以通过 Selenium 驱动该操作:它登录您的 Proton 账户,创建新邮件,输入地址,然后读取 Proton 是接受还是拒绝。这是权威答案,模块 1、2 和 4 在启用 Selenium 时(默认启用)均使用此方法。

自定义域名通过 DNS 检查。 对于诸如 example.com 的域名,真正的问题是邮件路由到何处。如果 MX 记录指向 Proton(mail.protonmail.ch / mailsec.protonmail.ch),则该域名托管在 Proton Mail 上。模块 3 读取 MX 记录并与密钥服务器交叉验证。

要求

  • Python 3(3.7 或更新版本)
  • requirements.txt 中的 Python 包(requestsselenium
  • 用于 Selenium 检查的浏览器(Chrome/Chromium 或 Firefox)

安装

克隆仓库并安装 Python 依赖:

git clone https://github.com/pixelbubble/ProtOSINT.git
cd ProtOSINT
python3 -m venv venv
source venv/bin/activate          # Windows: venv\Scripts\activate
pip install -r requirements.txt

您还需要安装一个用于 Selenium 检查的浏览器。Selenium 会自动下载匹配的驱动程序,因此无需单独安装 chromedriver/geckodriver。

Debian / Ubuntu / Kali:

wget -O /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt update
sudo apt install -y /tmp/chrome.deb
# 替代:sudo apt install -y chromium   (或:firefox-esr)

macOS(Homebrew):

brew install --cask google-chrome  # 或:brew install --cask firefox

Windows:从官方网站正常安装 Chrome 或 Firefox。

以 root 身份运行(常见于 Kali)?Chrome 需要 --no-sandbox 标志,否则启动时会崩溃。ProtOSINT 已为您设置好,因此无需额外操作。

配置

首次运行脚本时,会在其旁边创建一个 config.json 文件:

{
  "proton": {
    "username": "",
    "password": ""
  },
  "settings": {
    "use_selenium": true,
    "headless": true
  }
}
  • use_seleniumtrue/false)为模块 1、2 和 4 使用 Selenium 撰写检查(可靠方法)。设置为 false 将回退到更快的账户 API。
  • headlesstrue/false)在后台运行浏览器,这样不会弹出窗口。仅在没有启用 2FA 或 CAPTCHA 的账户上才设置为 true,因为窗口隐藏时您无法解决这些验证。如果需要看到浏览器,请设置为 false
  • username / password 是您的 Proton 登录信息。您可以填写,或者留空,脚本启动时会询问。留空密码更安全——它永远不会写入磁盘。如果确实在文件中填写了凭据,请不要提交该文件(它已在 .gitignore 中)。

如果您在会话中途关闭浏览器,下次需要浏览器时检查会自动重新打开并重新登录。

使用

python3 protosint.py

从菜单中选择一个模块并按照提示操作。按 q 退出(如果浏览器已打开则关闭它)。

Proton Mail 调查技巧

Proton Mail 不区分大小写

账户名不区分大小写,并且 Proton 将 ._- 视为透明。+ 之后的内容也会被忽略。因此,以下所有地址都与 [email protected] 属于同一个账户:

它们共享相同的密钥和时间戳。

时间戳是密钥日期,不总是账户日期

ProtOSINT 显示的日期是账户的主 PGP 密钥创建时间——这不总是与账户创建时间相同。

示例 1——目标从未动过密钥。 这里密钥日期就是真实的账户创建日期。

示例 2——目标重新生成了密钥。 现在日期反映的是新密钥,而非账户。

  • 2021-01-12:账户 [email protected] 创建
  • 2021-01-13:目标在“设置 → 加密密钥”中生成了新密钥
  • 2021-01-15:ProtOSINT 报告 2021-01-13,而非 2021-01-12

加密密钥

ProtOSINT 显示账户使用的密钥类型。密钥服务器报告的主密钥类型为以下几种之一:

  • Curve25519——现代 ECC(Ed25519 签名密钥);新账户的默认选项,最快且最安全
  • RSA 2048——2021 年之前创建的账户的旧默认选项
  • RSA 4096——更强但更慢,通常在有人为兼容旧版导入密钥时出现

您也可能在某些密钥上看到 X25519、Ed25519 或 RSA 3072——它们均直接从密钥的 OpenPGP 算法 ID 读取。

自定义域名

付费 Proton 套餐允许您绑定自己的域名。如果 [email protected] 解析到 Proton(模块 1 或 3),则目标正在使用付费 Proton 套餐。模块 3 通过域名的 MX 记录确认这一点,这是最可靠的信号。

速率限制

Proton 对密钥服务器(错误 2028)和账户 API(HTTP 429)都实施了速率限制。具体的限制未公开且似乎会变动,因此如果被限制,请等待一段时间或从不同 IP 重新运行。Selenium 方法使用您正常的已登录会话,因此不受这些限制影响。

贡献

欢迎克隆项目。对于重大变更,请先提交 issue 进行讨论。

Selenium 模块读取 Proton 的 Web 应用,因此如果 Proton 更改了其页面,selenium_login()selenium_check_emails() 中的选择器可能需要小幅更新。如果浏览器检查停止工作,请首先查看此处。

许可证

MIT

分类