ProtOSINT 是一个 Python 脚本,帮助您调查 Proton Mail 账户。
这是 ProtOSINT v2。第一版已经存在好几年了,但 Proton 的 API 发生了变化,旧的检查方法不再有效,因此此次重写使该工具重获新生。衷心感谢 NeutrOSINT 在此期间持续进行此类研究。
本工具专为 Proton Mail 的 OSINT 工作设计(仅限教育和授权用途)。您提供一个电子邮件地址、用户名或域名,它会告诉您能发现什么:该地址是否真实存在、账户的加密密钥创建时间、使用的算法,以及自定义域名是否托管在 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 记录并与密钥服务器交叉验证。
requirements.txt 中的 Python 包(requests、selenium)克隆仓库并安装 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_selenium(true/false)为模块 1、2 和 4 使用 Selenium 撰写检查(可靠方法)。设置为 false 将回退到更快的账户 API。headless(true/false)在后台运行浏览器,这样不会弹出窗口。仅在没有启用 2FA 或 CAPTCHA 的账户上才设置为 true,因为窗口隐藏时您无法解决这些验证。如果需要看到浏览器,请设置为 false。username / password 是您的 Proton 登录信息。您可以填写,或者留空,脚本启动时会询问。留空密码更安全——它永远不会写入磁盘。如果确实在文件中填写了凭据,请不要提交该文件(它已在 .gitignore 中)。如果您在会话中途关闭浏览器,下次需要浏览器时检查会自动重新打开并重新登录。
python3 protosint.py
从菜单中选择一个模块并按照提示操作。按 q 退出(如果浏览器已打开则关闭它)。
账户名不区分大小写,并且 Proton 将 .、_ 和 - 视为透明。+ 之后的内容也会被忽略。因此,以下所有地址都与 [email protected] 属于同一个账户:
它们共享相同的密钥和时间戳。
ProtOSINT 显示的日期是账户的主 PGP 密钥创建时间——这不总是与账户创建时间相同。
示例 1——目标从未动过密钥。 这里密钥日期就是真实的账户创建日期。
[email protected] 创建示例 2——目标重新生成了密钥。 现在日期反映的是新密钥,而非账户。
[email protected] 创建ProtOSINT 显示账户使用的密钥类型。密钥服务器报告的主密钥类型为以下几种之一:
您也可能在某些密钥上看到 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() 中的选择器可能需要小幅更新。如果浏览器检查停止工作,请首先查看此处。