[关闭]
@liuhui0803 2016-07-19T03:28:17.000000Z 字数 5031 阅读 3300

我是怎么从Instagram、谷歌和微软那里偷钱的

安全


长话短说: Instagram(2000美元),谷歌(0美元),微软(500美元),他们的服务容易由于主叫付费声讯电话号码(Premium phone number)产生经济损失。这些公司都可以通过计算机语音电话通话为用户提供登录验证码,但疏忽而未能验证用户所提供的电话号码是否合法,是否属于主叫付费声讯号码,导致专门的攻击者有可能借机盗取数千欧元、美元、英镑… 由于可以向一个声讯号码同时拨打几乎无限数量的电话,微软最容易受到这种方式的大规模威胁。这一问题已提交至相关厂商的“悬赏捉虫”项目,目前相关问题已妥善解决。

Instagram:将帐户关联至声讯号码

Instagram支持给帐户关联手机号码,这样其他用户就可以在Instagram的全球通讯录中查询。输入手机号码后,Instagram会向该号码发送一个六位数的验证码短信:

此处输入图片的描述
此处输入图片的描述

然而如果用户没在三分钟内通过下图所示界面输入这个验证码,Instagram将使用美国加州的电话号码拨叫用户手机:

此处输入图片的描述
此处输入图片的描述

通话内容录音:https://www.arneswinnen.net/wp-content/uploads/2016/02/Instagram_Call.mp3

这个通话将持续约17秒。通过Burp Repeater可以看到触发这一行为的底层请求:

此处输入图片的描述

由于速率限制,发往https://i.instagram.com/api/v1/accounts/robocall_user/的请求只能每30秒重新播放一次。然而需要注意,Instagram会直接拨打用户所提供的任何号码,例如在英国通过eurocall24.com注册的,每分钟通话费0.06英镑的主叫付费声讯电话号码:

此处输入图片的描述
此处输入图片的描述

为了进行概念验证,继续使用Burp Intruder自动拨打另外60次通话,每次通话间隔30秒。这样就已象征性地赚到了1英镑,耗时17分钟:

此处输入图片的描述

一位攻击者每30分钟可以偷1英镑,也就是每天48英镑,每月1440英镑,每年17280英镑,而这一切只需要一个关联在一起的Instagram帐户和一个声讯电话号码。专职攻击者可以很轻松地创建并管理100组这样的帐户和号码,这等于将偷钱速度提高了100倍:每天4800英镑,每月144000英镑,每年1728000英镑。

其实攻击者只需要一个声讯电话号码和100个Instagram帐户就够了。每30秒一个请求的速率限制只适用于帐户,同一个声讯电话号码可以同时用于关联多个Instagram帐户。

Facebook的补救措施

提交之后Facebook的首次回应如下:

这是在我们产品中进行的故意行为(Intentional behavior)。虽然不认为这是安全漏洞,但我们已经开始通过控制措施监控和缓解这种滥用的情况。

这是否就等于他们给我颁发了一张直接从Instagram偷钱的许可证?

此处输入图片的描述

经过来回讨论并使用1-100个帐户进行阐释和计算,Facebook开始上心了:

感谢您的关注,由于这些请求会通过一个负责监控和拦截恶意行为的专用服务进行路由,本例中的“故意行为”实际上可以看作“可接受的风险”。一般来说,攻击者控制多个帐户进行的攻击行为会被白帽(Whitehat)程序在“不当行为”报告中归类为“垃圾信息或社会工程学技术”。

而最后通过我进一步的推敲(“手工创建100个帐户真的是轻松无压力”):

再次问好!针对您所报告的问题,我们会对我方的速率限制机制进行进一步的调整,并完善了对外拨打电话的服务,该问题有资格得到白帽奖励。当这些变动最终落实后您会收到我们的通知。谢谢!
(…)
我们已经调查了这一问题,并认为这个弱点已修复(调整速率限制机制并进行额外的监控)。

时间线

不过最开始赚来的1英镑我就留着了。

谷歌:通过声讯电话号码进行双因素身份验证

谷歌的情况略微有些复杂。在给帐户关联手机号的过程中谷歌并不会拨打电话,但他们确实提供了通过电话通话提供六位数双因素身份验证所需验证码的选项:

此处输入图片的描述

在这里输入声讯电话号码后可以接到谷歌打来的电话,但如果多次不输入有效验证码,尝试几次后该电话号码会被屏蔽。然而幸运的是eurocall24.com支持将来电呼转至SIP服务器(“呼叫中心”),并通过SIP客户端(本例使用了Blink)接听呼转来的电话,所以我能很清楚地听到电话内容:

此处输入图片的描述

在将声讯电话号码关联至这个呼叫中心并将其用作双因素身份验证的手机号码后,我们可以在客户端软件中接听电话,可以听到并输入正确的六位数验证码:

此处输入图片的描述
此处输入图片的描述

通话内容录音:https://www.arneswinnen.net/wp-content/uploads/2016/02/Google_Call.mp3

此处输入图片的描述

注册通过后发现,谷歌可以在用户尝试登录时每小时最多给同一个手机号拨打10次电话,无论电话有没有人接听,登录成功还是失败,都适用这样的限制,这一点让我有些诧异。我甚至已经在脑海中构思了从SIP服务器到语音识别系统,再到Selenium脚本的行动路线,但最后发现根本不用这么麻烦。

首先,eurocall24.com提供的声讯号码所支持的呼叫目的地可以修改为标准的“会议服务”,因此完全无需担心这个问题。随后,使用Selenium脚本提交受双因素身份验证机制保护帐户的用户名和密码,这一过程可以使用Firefox IDE插件进行录制,并导出为login.py Python脚本。最后但同样重要的是,可以设计另一个高效且卑鄙的Python脚本loop.py,每6分钟一次循环执行前一个脚本。经过两小时和17+1(注册过程所需)次通话,欧元也是我的了。

此处输入图片的描述
此处输入图片的描述

每次通话持续大约35秒,简单计算一下就能知道,攻击者以这样的速率使用一个声讯电话号码即可盗取12欧元/天 = 360欧元/月 = 4320欧元/年。而攻击者很容易就可以管理并维护大约100个声讯电话号码和相关联的谷歌帐户,这样可以盗取的金额又可以扩大100倍:1200欧元/天 = 36000欧元/月 = 432000欧元/年。谷歌这个例子中必须给每个谷歌帐户关联一个声讯电话号码。

谷歌的补救措施

我们已经进行了相关处理,取决于整个电信行业的工作方式,这种问题无法彻底根除。不过很快就无法继续通过这种方式“偷钱”了,我们已经部署了相关的缓解措施,以上。
有鉴于此,专家组决定不为这个报告提供经济奖励(毕竟我们认为谷歌因为自己流程的问题遭受经济损失,这一点不如用户的安全性重要)。不过您还是可以获得相应的荣誉,您将登上谷歌的荣誉墙。

时间线

微软:使用声讯电话号码注册Office 365试用版

在注册试用版Office 365过程中,用户可以提交供微软联系的电话号码。随后发现微软真的会拨打输入的声讯电话号码,但通过同一个号码注册失败的次数超过7次会屏蔽该号码:

此处输入图片的描述
此处输入图片的描述
此处输入图片的描述

通话内容录音:https://www.arneswinnen.net/wp-content/uploads/2016/07/Microsoft-call.mp3

然而这种保护机制可以通过两种不同方式绕过,借此可以让声讯电话号码接收很多很多通话。

用“零”做前缀

发现只要使用一个数字“0”作为电话号码的前缀,这个号码就再次可用了,借此可以通过一个声讯号码接听更多电话。更重要的是,这种方式可以重复18次,因为就算普通电话号码使用18个0作为前缀也是有效的。最终发现将一个随机的前缀0替换为声讯号码归属国的国家代码(本例中使用了代表波兰的“48”),依然可以继续接听电话:

此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述

下列公式可以算出屏蔽后通过第一种方法绕行可以获得的号码变体总数,其中变量n代表实际电话号码之前所增加内容的长度:

此处输入图片的描述

因此现在一个声讯电话号码可用的变体总数就达到了171+1=172个。

随机数字后缀

发现的另一种绕行方法是将最大4位随机数附加到号码后面(下列截图中使用的随机数是“1111”):

此处输入图片的描述
此处输入图片的描述

四位随机尾数可以获得的组合总数可通过下列公式计算,其中i代表尾数的数量:

此处输入图片的描述

由于尾数可以附加到任何可接受的数字之后,可以通过下列方式计算微软允许给一个声讯号码拨打的电话总数:

(172*11111) * 7 = 13377644 次通话/声讯电话号码

每次通话大约需要23秒,简单起见就算20秒,该声讯号码的收费费率是0.15欧元/分钟:

(13377644/3)*0.15 = 668882欧元/声讯号码

并发通话

除此之外,微软还可以对同一个声讯号码同时进行多个通话。Eurocall24.com限制一个声讯号码同一时间最多只能接听来自一个源地址的10个通话,因此在概念验证过程中,一分钟内进行了2*10次并发通话,赚来了1欧元多一点:

此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述

通过这种方式自动操作多个声讯电话号码,攻击者将能在极短时间内偷取很多钱。

微软的补救措施

为被屏蔽号码添加前缀和后缀的绕行方式是分两个阶段解决的(2016年3月和7月)。最终我得到了最小金额500美元的奖励。

有关最终奖励的决定由提供该奖励的项目裁判团队做出。提供这一奖励的原因在于该问题会影响到1)微软客户,以及2)微软自己。鉴于该服务是第三方提供的,这一问题对微软造成的影响微乎其微。尽管这一风险更多影响到的是与微软合作的公司而非微软自己,但我们依然决定向您颁发奖励。
这无疑是个很不错的弱点,因此我们决定提供五百美元作为奖励。从安全的角度来看,我们十分重视对客户提供的保护,这样的弱点值得进行奖励并尽快修复。我们并未发现客户数据因为这一问题面临风险,同时我们始终鼓励研究人员投入宝贵的时间帮助我们保护用户,但本例中我们同样希望表彰这种保护我们以及我们合作伙伴的行为。

时间线

作者:Arne Swinnen,阅读英文原文:How I Could Steal Money from Instagram, Google and Microsoft

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注