前段时间国外的开源信息工作者分享了一篇技术贴,通过邮箱反查手机号,我们也在知识星球(开源网络空间情报)上第一时间分享了这个技术。但原帖主要针对美国的邮箱和手机用户,那国内的用户用类似的思路可以做吗?怀着一点小好奇心,我尝试着使用平时积累的开源情报收集技巧来实验一把。
原贴的实现方法是根据国外的一些网站,如PayPal、eBay、Yahoo等网站来进行密码重置,使用邮箱账号获取电话号的多位数字。
PayPal使用邮箱进行密码重置得到的电话号
而如果同时拥有eBay和LastPass账户,则攻击者可以知道电话号码中十分之七的数字。而这只需要知道你的邮箱账号。
eBay使用邮箱进行密码重置得到的电话号
LastPass使用邮箱进行密码重置得到的电话号
接下来就只剩三位数字未知,也就是说只剩下一千种可能性,为了再次缩小范围,原著继续描述了美国电话号的组成,如下:
区号(或NPA),交换(或中心局代码)和订户号
而eBay和LastPass给了我们区号和订户号码。只缺少中间的交易所的三位数字。原著作者通过研究North AmericanNumbering Plan Administrator(NANPA,一个公开的数据集),通过前三位区号知道对应地区,再反过来结合所有1000种可能,查看哪些是分配在这个地区的,从而再排除一部分。
旧金山查询结果
从十亿种可能中筛选出几百种,接下来完全可以手动完成查询,也可以编写自动化代码,从而找到对应电话号。目前这篇帖子主要针对美国的用户,那国内的邮箱号,照这个思路可以反查吗?答案是当然可以。
国内的网站和国外的差不多,在密码重置的时候,让你先输入用户名、电话号或者邮箱号之一,然后不管你输入的是哪一个都会显示手机号和邮箱的部分数字或者字符。换句话说,如果攻击者知道了你的电话号或者邮箱号其中一个,就能通过密码重置功能,知道其中另外一个的几位数字或字符。
当然,如果你知道电话号和邮箱的结构,你就知道,这两者之间互推的难度是不一样的。通常国内的手机号是11位数字组成,第一位固定为1,也就是最多只有10亿种可能,而邮箱则不然,虽然国内的使用的大部分都是QQ邮箱,但是也有使用其他邮箱的,所以在邮箱号中就不止数字还存在字符,也就是说,每一位的可能性就多的太多了。所以在这里使用电话号倒推邮箱的难度是很大的,但如果是QQ邮箱,那还是有机会的,感兴趣的可以试试。本文接下来研究的是从已知邮箱账号来推导电话号码。
在前期我花费了很多时间去测试密码重置,以某电商网站为例,如果我重置密码输入邮箱,它会显示前面三位数字和最后的两位数字。
密码重置得到手机号结果
在我尝试了多个网站的密码重置后,发现每个网址给出的位数是不同的。有的给出前三位和后两位,有的是前三位后三位等等。所以这种遮蔽方法并不是固定的,而是由开发人员决定,所以我们就多试几个网站。
发掘更多网站
随后我又查看了其他一些国内热门电商网站,以下列出这些网站名字和“泄露”位数:
1、
密码重置结果得到手机号结果
2、
密码重置得到手机号结果
3、(反过来手机号获取邮箱号,有前两位和后两位,以及中间对应位数的“*”,感兴趣可以尝试)
密码重置得到手机号结果
4、
密码重置得到邮箱号结果
如果你查看上面这个列表,你就可以得到结论。例如,如果你有一个绑定邮箱的某电商网站账号,攻击者只需要知道你的邮箱号,就可以知道你电话号的十一分之七。换句话说,攻击者可以使用你的邮箱号,来把猜测你的电话号从10亿种可能减少到10000种可能。
虽然以上列举的第四种电商网站给出了7位数字,但是在国内使用率不高,大多数人会选择使用其他的电商网站,所以本文以下部分以xxx为例。
发现更多数字
由上可知,在得到邮箱账号后,通过xxx的密码重置后,可以得到电话号的前三位和后三位,也就是是说只剩下中间5位数字,换算也就是100000种可能,接下来就是逐步减少可能性。
首先我们通过百度百科搜索到手机号的组成结构,如下:
手机号组成结构
CC是国家码,都是中国人,固定86,不用管;
MAC前三位,是分配给国内三家虚拟运营商的号段,在密码重置的时候已经给出了,不用管;
H0H1H2H3中间四位,是HLR识别码,是虚拟运营商给全国每个省市分配的,简而言之就是地区码;
ABCD后四位,第一位未给出,因为是随机分配的,所以都有可能。
HLR识别码
也就是地区码,这是每个虚拟运营商给全国每个省市分配的,可以结合MAC进行查询该号码的所在地。
现在接打电话在通话号码下都会显示来电号码的地区,这就是一个公开的信息,所以我们可以通过查询网站进行查询,输入前三位MAC加后面从0000到9999,得到已分配的HLR识别码和对应所在地。那么假设,如果攻击者已经通过密码验证得到前三位和后三位,又知道你的所在地,就可以从这10000种可能减少到几百甚至几十种可能。
1771234所在地信息查询结果
总所在地信息查询结果
空号检测
在接下来手动测试的时候,发现大部分号码根本没有进行注册,也有可能它本就是个空号。在这里我就想到另一种再次缩小范围的方法——检测空号。搜索空号检测的原理,大致是通过语音识别来实现,或者通过运营商的数据。所以要自己实现的话还是不容易,而在网上有很多的空号检测的网站,在这里我就是使用的其中之一。
空号查询返回结果
活跃号:也就是实号,是我们需要的;
空号:未注册的账号;
沉默号:超过六个月未激活的空号和近三个月流量使用低于30m的账号;
风险号:长期关机或未开通语音服务的,以及易投诉的用户。
经过空号检测,我们从3100种可能,缩小到751种。
反向验证
在密码重置的时候可以通过邮箱号来得到电话号的部分数字,相反也可以使用电话号得到邮箱的部分数字或字符。所以我们通过遍历上面得到的可能,反过来对比显示的字符,我们就知道这个电话号是否正确。
总反向验证结果
在这里我们使用python+selenium来进行整个流程的自动化。因为python简单:)
首先你要确保你安装了python,以及selenium库和相关库,还有Chrome浏览器和对应版本的Chromedriver。
接下来假设我们已经有了目标的邮箱号和知道了他(她)的所在地,而且他(她)拥有xxx账户并同时绑定了手机号和邮箱。
使用邮箱号通过xxx的密码重置得到手机号的前三位和后三位,就还剩中间的四位地区码和一位随机码,合在一起就还有100000种可能。
通过前三位MAC结合中间三位地区码,查询对应地区后,进行筛选,将可能性降低到几千甚至几百,之后再通过空号查询筛出去一部分号码,得到最终的几百种可能性。
最后一步反向验证,在这里我们使用爬虫进行爬取验证结果。但是xxx存在一个滑块验证,而且并不是简单的滑动到位就可以通过的!网上搜索的时候有人说这是用机器学习写的反爬,我也在后续的破解过程中见识了它的厉害。
反爬解决方案
1.通过反复试验发现滑块验证的图片只有十张,于是下载下来,每张图片多下几张,最好缺口位置不一样,使用PS简单的去掉缺口部分;
滑块验证的十张完整图片
2.每次在爬虫打开的时候下载带缺口的图片,然后使用numpy分别读取图片像素值,用带缺口的图片对比完整图片,找到像素最相似的一张,在遍历像素对比这两张图片不同的区域最左侧的点,就知道滑动距离了;
3.接下来一步是整个自动化最麻烦的一步,虽然知道了滑动距离,但是不能简单的滑动通过,下面是我使用的方法:
直接使用selenium自带的拖动元素(可以滑动到缺口对应位置,但是被检测出来未能通过)。
使用百度出来最多的方法,设置总距离前4/5为加速段,后面为减速段,加速度随机,将整个滑动距离拆分,最后再遍历滑动(可以滑动到缺口对应位置,但是被检测出来未能通过)
先试用爬虫打开网页,用pyautogui(控制鼠标的模块)控制鼠标移动到滑块起始位置,按下鼠标左键并手动拖动滑块,每隔0.1s读取鼠标位置,并对比上次读取的值,将差值记录下来(横向差值为0的不记录),滑动到缺口手动松开鼠标左键,如果不通过,将记录的差值清空,鼠标重新移动到滑块起始位置重复以上步骤,反正则通过。可以多记录几条防止一条多次使用被检测到。
模拟出来的轨迹和总滑动距离
随机一个模拟的轨迹,通过对比实际滑动距离和模拟滑动距离,来缩放模拟的滑动轨迹,并同样使用pyautogui模块控制鼠标,先移动到滑块起始位置,并控制鼠标按下左键不放,按照缩放后的滑动轨迹进行遍历滑动(设置pyautogui.PAUSE = 0.1,让每个动作在0.1秒完成,防检测),最后松开左键,完成验证。同理,没有通过验证就再重复上面的操作。
自动化滑动GIF
后续可以将通过率高的轨迹提取出来,就能提高整体效率。
4.通过滑块验证后,后面就很轻松,只用根据网页反馈信息,判断并记录是否注册,是否绑定邮箱,邮箱号多少就行。
部分代码
获取手动成功滑动的轨迹代码
计算滑动距离
自动化滑动
通过以上不难看出,不仅仅是国外存在这种情况,国内也存在。
而在攻击者获得你的邮箱号,就有可能可以获得与其相关联的电话号码的所有数字。攻击者拥有了电话号码后,可能进行一系列的具有严重影响的攻击,可能你的账户被破坏,位置跟踪等等。以下是我在知乎上搜索了的结果:
知乎搜索“知道手机号”GIF
而在原著中讲述了一种解决方案,允许用户给电话号码和电子邮箱设置标签,如“工作电话”和“个人邮箱”等等。在密码重置的时候不再通过掩码的形式显示,而是显示这些标签。如果是本人就能很快想起,而攻击者就不可能知道了。
我这还有另一种方法,允许用户设置一些问题,如“我的母亲姓什么?”、“我老家在哪?”等等这些。在密码重置时需要先回答,才能继续进行。
最后在此提醒读者和各大公司,密码重置功能有可能泄露用户信息,需引起注意。
*本文原创作者:scu-igroup,本文属于FreeBuf原创奖励计划,未经许可禁止转载