type
Post
status
Published
date
Apr 6, 2022
slug
mailTool
summary
开发邮箱枚举工具踩坑
tags
工具
开发
Python
category
网络安全
icon
password
0x00 前言
打算开发一款根据人名枚举企业邮箱的工具,简单的记录下踩的坑。
0x01 生成字典
采集了几万个人名,又从网上找了 top500 的人名,经过分析,发现人名拼音大致符合二八原则。百分之二十的拼音就已经覆盖了百分之八十的人名。
常用的姓拼音有 111 个,其中有 55 个占据了绝大部分(20 个大概占据了 80%+)
拼音一共 400+,常用的名拼音有 186 个,其中 79 个占据了绝大部分。
都取绝大部分,考虑到 2 个字和 3 个字的情况,共 55*79*80 = 347 600
这个数量勉强还在接受范围内。
0x02 准确率
一般验证邮箱是否存在都是连接邮件服务器然后发送一个请求,根据返回值来确认邮箱是否存在。
返回 250 或者 451 则邮箱存在,返回 550 则邮箱不存在
发现腾讯企业邮箱对于不存在的邮箱有时会返回 250,验证影响准确率,网上所有的开源检测工具据测试准确率只有 50%-60%左右,这个准确率完全无法接受。
发现网上的部分付费邮箱验证服务可以高概率判断邮箱是否存在,而开源的判断成功率都只有 50%多一点,故想搭建邮箱服务器偷一手付费邮箱验证服务的包,然后就是一大堆坑😭。
- 一开始是用的 fapro 搭的 smtp 服务,发现并因为它啥都返回 250,部分付费的会认为它是 Catch-all 邮箱。
- 后来搭建了真正的 smtp 服务,但是因为不清楚企业邮箱的过滤规则,没法还原出一样的场景,导致抓到的包并不好用。
- 终极方案:用 Python 写了个 tcp 转发脚本。逻辑如下
邮箱验证服务 - 我的邮箱服务器 - 将邮箱替换 - 转发到企业邮箱服务器
代码
通过终极方案,偷学了国内外十多家卖邮箱识别业务的技术,发现了好几种可以增加识别率的办法,我这里使用了两种:
- 随机且不同的
HELO及MAIL FROM
- 250 后不断开立马再验证一个为不存在的邮箱,
- 多次验证
经过测试,对于准确率还可以,已经可用。
重复次数 3 次的时候准确率大概是97%
0x03 云函数
考虑到隐匿及封 ip 等问题,故考虑使用云函数进行发包。云函数正适合这种请求多,流量少的场景。因为
函数burst 的限制,一次调用云函数需要尽可能发送多个验证请求减少云函数并发。初步设想如下客户端异步请求云函数
云函数每分钟运行 300 - 400 次
在考虑到云函数内存有限的情况下每次尽可能多的验证邮箱,因为按次计费,不能一次只验证一个
注意:除了云函数执行时间拉满外别忘了 api 超时时间也拉满
云函数代码如下
传入邮箱服务器地址及需要验证的邮箱列表及需要调用的次数,进行验证后返回验证的结果。
0x04 客户端
我目前的策略是先统一验证 3 次再验证匹配到的 5 次,虽然按照我写的逻辑,这和直接验证 8 次请求量一样,但是发现有些时候短时间内对同一个邮箱验证太多次会触发风控,分成两批次验证,间隔时间比较长,经测试效果比直接 8 次好。
感觉算法还有非常多可以优化的地方,不过最近精力很差,就先这样吧,后续用到再改进。
使用时需要修改云函数 api 以及邮箱的格式,第三方库只有一个 httpx
