# 我是如何绕过Google和Facebook等大站的两步验证的

- URL: https://wuming.si/blog/754/
- Author: Aaron
- Published: 2014-08-06
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: http://blog.wo.ai/archives/754

我记得在两年前，两步验证(2-Factor-Authentication, 2FA)变得非常普及并且在各大主流网站(Google, Facebook, Yahoo 等)广泛应用。那时我十六岁，天真的我想不通为什么这么天才的想法之前没有人想到过。在那时，我认为2FA就是一个可以保护自己的金色盾牌，它可以抵御那些最复杂的网络欺诈。

当两步验证依旧是你所使用的主要应用的金色盾牌时，我开始列出以下文档—我是如何用一系列的方法来绕过Google, Facebook, Yahoo, LinkedIn的两步验证以及几乎任何向语音信箱发送两步验证标记的服务的。

注：超过959万的澳大利亚Optus公司的手机用户会受到我下面所说的语音信箱的攻击。这959万使用两步验证的用户中任何一人，都很有可能会受到我下文所说的绕过两步验证的攻击。

## 两步验证的分析，概念以及流程

### 两步验证的分析

当将两步验证看做一个整体时，从一个攻击者的角度看来仅仅有这些东西。在我第一次对两步验证的分析中，我经常在想是否可能进行以下的攻击:

  * 暴力搜索两步验证的pin码（有一些服务，比如苹果，只有四位的pin，并且几乎没有任何频率的限制）。
  * 发现pin生成的漏洞。
  * 通过某种方法窃取两步验证后的session标记，这样攻击者可以不用通过两步验证就登录账户。

以上技术都是攻击的有效手段，但是通常没有人会使用，因为这些手段太老套了，已经有了相应的防御。

在我经历过这个初步测试的阶段后，我列举了更多的东西，意识到一定有一个弱点能够让我们完全避开两步验证。这个弱点就是语音信箱。

有些读者可能会知道为什么语音信箱容易出问题，因为他们可能听说过2009年英国某些名人的语音信箱被黑客攻击的丑闻。他们进入语音信箱的方式相当让人担心，分为以下几种：默认的语音信箱PIN，未设置语音信箱PIN以及拨打自己电话的方法—都在[**Sophos Security**](http://nakedsecurity.sophos.com/2011/07/08/how-phone-hacking-worked/)中写到过。

在另一起类似的事故中，Cloudflare公司的CEO也是通过语音信箱绕过两步验证的受害者之一。然而，在这一次事件中，攻击更为复杂，要求攻击者设法使得AT&T(美国电话电报公司)的员工将Matthew Prince的语音信箱重定向到一个假的语音信箱处。

­那些我用来登录到语音信箱账号（仅限于那些已经授权的用于测试的账号）的方法在很久以前我就写过了，并且执行起来并不难。

虽然进入语音信箱的方法受到越来越多的关注，但是这一方法并不适应部分国家的大多数网络。

### 概念及攻击流程

作为一个攻击者，你需要知道四件事情，才能进入被攻击者被两步验证保护的账号中。它们包括：

  * 被攻击者的用户名/邮箱和密码。
  * 被攻击者关联到两步验证服务的手机号。
  * 一个手机号欺诈服务。
  * 手机语音信箱远程登录的账号。

在现实中，作为一名富有经验的攻击者，以上四点要求并不难达到。获取用户名和密码可以通过任何传统的方法做到，获取关联的手机号码在现在也并不困难。

手机号欺诈服务，比如[**Spoofcard**](http://spoofcard.com/)（可以显示虚假的手机号码的服务）仅仅花费十美元就可以多次使用并且可以获得手机语音信箱的端点。另外，如果想要避免Spoofcard的登记，他们可以雇佣VoIP服务，打电话人的ID可以是虚假的，作用是一样的。

**攻击第一阶段：**

  * 攻击者在支持两步验证的网络应用上登录被攻击者的账号。
  * 攻击者向被攻击者的手机号拨打电话（只需要20-30秒即可）
  * 在此之后立即选择两步验证的选项要求通过电话发送两步验证的验证码

由于被攻击者正在跟攻击者通话，两步验证的电话服务就会立即将验证码发送到被攻击者的语音信箱里。

这是第一个漏洞。我是这样认为的，大家或许不同意，但是我想不出别的使验证码发送到语音信箱的方法了。由于这种方法的易用性，这样做的时候有一点危险。根据过去几年的语音信箱黑客的情况来看，通过向语音信箱发送pin，看起来好像不用管下面我将要告诉你们的第二个漏洞，直接就可以绕过两步验证。

当被攻击者没有接两步验证的电话时，两步验证的pin码也会被发送到语音信箱中。

绕过两步验证的第二阶段实际上依赖所谓的语音信箱窃听/电话窃听。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/880f977319_7cc829d3gw1eivacb49iuj20go08cdgq.jpg)

上图是应用于澳大利亚的和我的整个第二部分的方法，它只是和上述移动服务运营商相对应（在未发现其他的运营商之前）。在图中，我展示了我认为容易受到语音信箱攻击的网络以及其他部分或者完全不易攻击的网络。

另外，我必须指出，英国的Three 和EE网络也很容易通过电子欺骗受到语音信箱攻击。这一点最近被英国的[**The Register**](http://www.theregister.co.uk/2014/04/24/voicemail_still_easy_to_hack/?page=2)证实。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/8e22f62a9a_7cc829d3gw1eivacbo27mj20go08cjrr.jpg)

**完全易受攻击的：**

Telco公司的自动数字识别(ANI)或者是Caller ID是用来判断呼叫者是否是语音信箱账户的合法拥有者。如果ANI或Caller ID和账户持有者相匹配，在进入语音信箱账户时系统就不会要求输入pin码。

在美国，可以不通过Caller ID来请求pin码，然而在澳大利亚，据我所知除非服务提供商从他们的服务上来解决问题，否则没有可以预防语音信箱受到欺诈攻击的办法。

  1. 通过网络语音电话业务运营商或者专门的欺诈服务提供商获得ANI/Caller ID欺诈服务。
  2. 在上文列出的所有的所有易受攻击的服务中，输入目标号码为**+610411000321.**
  3. 输入被攻击者的手机号作为要显示的Caller ID.
  4. 如果你在使用SpoofCard（可以显示虚假的手机号码的服务），你会收到一个手机号和一个访问码。拨打这个手机号码并输入访问码。
  5. 你会连接到被攻击者的语音信箱服务提供商的终端上。在这里输入被攻击者的手机号并按#键、
  6. 你现在会拥有被攻击者语音信箱的全部权限。这甚至包括可以改变用户pin码或者是欢迎音乐的权限。

为什么目标号码是**+610411000321****：**

  * 澳大利亚有三大主要的移动业务运营商：Telstra, Optus和Vodafone。
  * Telstra, Optus和Vodafone可以转售他们的服务，因此业务可以拓展到其他的提供商处。
  * 所有的中间商用和Optus相同的主要服务（例如账号信息热线，语音信箱服务等）。
  * 因此，如果攻击者能够开发任何三个电信提供商其中的任何一个服务的话，每个下属的服务提供商也很有可能受影响。
  * Optus呼叫语音信箱的主号码是“321”。
  * 然而，当进行欺诈攻击时，由于我们不能呼叫“321”我们需要远程号码去呼叫。
  * Optus为在海外的用户提供了一个可以呼叫的远程号码，这个号码就是：**+610411000321** ，并且这个可以作为任何提供欺诈服务的终端。

****注意：Optus语音信箱中任何易被攻击的端点都已经被固定了,包括我曾经用来绕过他们的端点。****

**部分易受攻击/不易受到攻击的：**

我说过Telstra, Virgin和 Vodafone是部分易受攻击或不易受到攻击的，因为我并没有机会彻底测试攻击语音信箱的能力。然而我的确知道：

  * ******Telstra** 不管是什么Caller ID或者是ANI都要求一个pin码，因此对于我上文描述的破解来说是安全的。
  * ******Vodafone** 在未设置pin码的情况下，如果我通过欺诈服务冒充你的号码拨打，会让我设置pin码或者是进入你的语音信箱。
  * ******Virgin Mobile** 我并未测试，然而由于它是Optus网络的一部分，因此它很有可能是易受攻击的。

你如果不确定你现在使用的是哪种网络，或者你想检查一下自己是否是易受攻击的，我的一个朋友（([**Aleksa Sarai**](http://www.cyphar.com/)）写了一段程序通过你的手机号来确定你的在澳大利亚的移动网络。你只需输入你的手机号然后点击check就可以了。

你可以在[**Github**](https://github.com/cyphar/voicemail-check)上找到检测移动网络的代码。

* * *

### 向谷歌安全团队揭露

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/123d68b16e_7cc829d3gw1eivallmbfnj20ay02zt8q.jpg)

谷歌是两步验证的早期使用者，它的全部服务都使用了两步验证。如果你所选择的电话公司在语音信箱安全方面管理非常严格的话，谷歌现在使用的两步验证系统还是非常安全的，但是谷歌所提供的两步验证可以绕过的概率其实是非常高的。

假设你现在已经阅读了上文中提到的破解步骤，使我能够绕过两步验证的Google, Facebook, Yahoo 等其他主要的支持两步验证服务的漏洞是当你不在线时，两步验证会发送两步验证标记到你的语音信箱中。单看这一点，这是个很小的问题，但是站在安全的角度上来看，这个漏洞是非常明显的。

语音信箱并未实现全球统一化，它的安全性也是一样的。每个电话公司都运行他们自己的语音信箱管理服务。

  1. 语音信箱服务的安全并不由谷歌管理而是由电话商管理。
  2. 一旦两步认证的标记或者OTP在语音信箱中，有许多可以攻击的因素，可以撤销标记而不改动谷歌端的数据。

如果你想看我和谷歌对话的全部邮件记录，你可以点击这里[**: google.pdf**](http://static.shubh.am/2fadisclosure/google.pdf)。

注意：通过这个绕过两步验证的方法并不能不动声色地来盗取谷歌账户，因为很有可能一旦登录到支持两步验证的谷歌账户中就会自动向用户发送信息。在前面的步骤中你必须选择拨打电话的方式然后继续破解。这样很可能会引起受害者的警觉。

他们对我最初的破解的回复如下：

嗨，

谢谢你的错误报告。我们已经看了你提交的数据并且确信这不是谷歌产品的安全缺陷。这个攻击假设了一个易被盗取的密码，并且实际的易被攻击性是由于电话商提供的对语音信箱的保护不够充分导致的。请直接向电话商报告这些。

Regrads,

Jeremy

虽然我知道语音信箱系统不够安全这是电话商的错误，我仍然觉得谷歌把两步验证标记发送到语音信箱这一做法有缺陷，这是个很危险的做法，并且大部分2FA提供商都不这样做。因此，我作出了以下回复：

Hi, Jeremy,

当我发现这些漏洞时，我完全理解并且我也和电话商在不断联系。

澳大利亚和英国的大部分电话商都只要求一个并未锁定的四位的pin码。然而，使用VoIP服务以及Asterisk AGI(<http://www.voip-info.org/wiki/view/Asterisk+AGI>)的一些脚本就在一天内可以进入语音信箱的账号。

实质上，虽然你说的“这一定是电话商的问题”是对的。这不仅意味着在最近四年里（或更多），在澳大利亚使用Optus提供的服务的人（澳大利亚的大部分人）是非常容易受到绕过两步验证攻击的，这也意味着许多国家的电信商也非常容易受相同种类的攻击。

我觉得把这个问题说成是一个纯粹的电话商的问题，会有点忽略掉两步验证并没有很好的理由来发送到个人的语音信箱里这个事实。另外，先不考虑由于外部的易受攻击性使得谷歌的两步验证可以被绕过这件事，谷歌这样做事实上还是会把敏感信息交给一个可能易受攻击的终端。

另外，在做了一些调查后，我能够跟Duosecurity 和Authy的专门负责两步验证的工作人员交流了。当我第一次发现谷歌发送两步验证的标记到语音信箱时，我非常肯定像Duosecurity 和Authy这样的两步验证服务提供商也是易受攻击的。但是我错了，他们并不会将两步验证标记发送到语音信箱。他们是这样处理这个问题的：

  * – 在通过语音发送PIN码或者两步验证标记时要求用户的某些交互行为。
  * – 在语音信箱留下一个空白信息而不是pin。
  * -要求用户的交互作为验证的方式（接到两步验证的电话->告诉用户按下数字键”x”->如果正确按下=确认，如果没有=未确认）

请让我知道你对此有何看法以及谷歌是否有应对这种情况的措施。十分显然这个问题是由于电话商的不安全的语音信箱服务造成的，然而这并不是谷歌或者是我可以控制的因此使得两步验证在某种程度下易受攻击。

两步验证对于那些将Optus手机号和谷歌账户绑定到一起的澳大利亚人来说是无效的，并且至少近四年是无效的（假设其他人已经知道Optus语音信箱的漏洞了）。

谢谢,

Shubham

谷歌很快回复道：

嗨，

感谢你解释这个问题的潜在作用域。

由于这并不是我们2SV系统在技术上的缺陷，我不确定我们能够做些什么来应对这个问题。但是我已经把一个bug记录下来并且会让团队成员来看一看。

Jeremy

假设这个问题不能修正，因此目前解决这个问题的最好方法就是禁用通过短信或者电话的两步验证，启用谷歌的两步验证，如果你绑定到手机就可能容易受到攻击。

这个设置方法可以在下面找到：[**https://accounts.google.com/b/0/SmsAuthSettings**](https://accounts.google.com/b/0/SmsAuthSettings)

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/9c475a8e37_7cc829d3gw1eivacd2t3nj20ij03aaa9.jpg)

另外，当不确定时，可以通过下面的方法通过两步验证来还原谷歌账户：

[**https://support.google.com/accounts/answer/183728**](https://support.google.com/accounts/answer/183728)  
[**https://support.google.com/accounts/answer/152124**](https://support.google.com/accounts/answer/152124)

我自己还原账户时失败了，我的朋友也是一样的。然而一段时间以前，[**Matthew Prince (Cloudflare)**](http://blog.cloudflare.com/post-mortem-todays-attack-apparent-google-app)成功地还原了账户。

状态: ******仍然易受攻击****/****并不会修复** | 揭露时间: **Wed, Apr 30, 2014 at 11:49 AM**

———————————————————————————————————————————————————–

### 向Facebook安全团队揭露

因为我的一个失误，在这次揭露之前我刚刚意识到可以用攻击谷歌的类似方法来攻击Facebook。Facebook称他们的两步验证[**“Login Approvals”**](https://www.facebook.com/help/www/148233965247823)是一个类似于登录通知的特点，但是有额外的安全步骤。

用和上述步骤相同的流程来破解，同样可以绕过Facebook的两步验证。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ce06e35110_7cc829d3gw1eivacet7o7j20fg0a8t9q.jpg)

让Facebook发送验证码到语音信箱的步骤如下：

  1. 登录账户。
  2. 点击“通过短信发送验证码”。
  3. 会显示出拨打电话的选项。
  4. 通过拨打被攻击者电话或其他方法保证被攻击者处于通话状态。
  5. 点击“电话通知验证码”选项。
  6. 验证码会被发送到语音信箱中。

另外，除了上述模式，也可以通过向”[**https://www.facebook.com/ajax/login/approvals/send_sms**](https://www.facebook.com/ajax/login/approvals/send_sms)“发送表单数据为”method_requested=phone_requested”的请求。

这个方法是通过截取最初发送短信的请求，将”sms_requested”替换为”phone_requested”来实现的，它是最有效地方法。

你可以在这里找到我向facebook 披露这个漏洞的完整版本[**facebook.pdf**](http://static.shubh.am/2fadisclosure/facebook.pdf).

然而，他们对此的回复如下：

Shubham 你好，

我们目前暂时禁用了通过电话来发送登录验证码的功能，未来还将进一步研究。我们的计划是当可以实现用户在通话中的交互时再重新启用这一功能，这样就可以防止我们将验证码发送到语音信箱中。

Neal, Facebook 安全团队

Facebook在我绕过两步验证之后迅速的禁用了部分功能，他们非常迅速地采取了措施，至少是临时的措施。

状态: 不再会受攻击| 揭露日期: **Sun, May 11, 2014 at 10:28 AM**

* * *

### 向 LinkedIn安全团队揭露

正如谷歌和Facebook一样，当被攻击者没有接到系统自动来电或者占线时LinkedIn就会将两步验证码发送到被攻击者的语音信箱中。

LinkedIn处理地很好，他们关闭了通过电话发送两步验证码这个功能，直到他们可以和第三方的两步验证提供商来修复这个问题。

你可以在这里看到我和LinkedIn发送的所有邮件[**linkedin.pdf**](http://static.shubh.am/2fadisclosure/linkedin.pdf).

他们对这一问题的主要回复如下：

Shubham，你好

感谢你在公开这个问题之前告诉我们。

虽然这个问题对我们的影响是有限的，但是我们暂时关闭了发送两步验证码的语音的功能。我们正在和第三方协商解决这个问题。在问题修复后，我们会考虑恢复语音功能。

谢谢，

David

状态: 不再会受攻击| 揭露日期: **Wed, Apr 30, 2014 at 4:15 AM**

* * *

### 向雅虎团队揭露 (通过HackerOne)

雅虎支持两步验证的主要服务也容易受到我上文中所说的攻击。事实上，对支持两步验证的雅虎账号的攻击会更严重因为攻击者并不用担心被攻击者知道他的账号已经登录。

通常支持两步验证的网络应用会在有人登录后发送短信通知。然而，当登录到雅虎账号以后，并不会发送短信，并且可以选择通过短信或者是电话来发送验证码。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/b67405a76f_7cc829d3gw1eivacg7cqej20cu0bedgc.jpg)

由于攻击者不用冒着被立刻知道的风险，攻击者会更有可能登录更长时间。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6fa4b3f0a5_7cc829d3gw1eivacgc2hnj20q504yjs6.jpg)

当我揭示这个问题14天后，雅虎仍然没有回复，因此他们仍然很容易受到攻击。

在这里可以看到我揭示雅虎漏洞的全过程[**yahoo.pdf**](http://static.shubh.am/2fadisclosure/yahoo.pdf)

状态: **仍然易受攻击****/****尚未回复** | 揭露日期: **2014-04-29 13:46:16 UTC**

* * *

### 向 Authy & Duosecurity揭露

我很快假设那些提供两步验证的服务都一定是易受攻击的。然而，我是错误的—因为他们知道这个事实并且对发送pin码到语音信箱这个问题有着长远考虑。

你可以阅读我和Authy 及 Duosecurity的来往邮件[**authy.pdf**](http://static.shubh.am/2fadisclosure/authy.pdf) and [**duosecurity.pdf**](http://static.shubh.am/2fadisclosure/duosecurity.pdf)

这两个服务提供商都在24小时内给了我回复，并且他们对此都非常热心。

**Authy** | 状态：不易受攻击 | 揭露日期: **Wed, Apr 30, 2014 at 1:27 AM**

**Duosecurity** | 状态:不易受攻击 | 揭露日期: **2014-04-29 13:46:16 UTC**

Authy会发送空白的语音信息，Duosecurity会在验证前要求用户的交互操作。

感谢[**Authy**](https://www.authy.com/) 和[**Duosecurity**](https://www.duosecurity.com/)!

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/1e1802ba47_7cc829d3gw1eivachc4tmj20a407awel.jpg)

* * *

### 缓解技术和向电话商 Telco 揭露：

广大的读者你们好，我校对了上面的一些信息，包括世界各地各种移动网络的终端。

由于我不能查对 Telco 的海外电话商，我 知道世界各地的人都关心他们的电话商是否是易受攻击的。

要看你是否可以通过欺诈服务不用pin码就进入语音信箱，仅需要跟着上午所说的流程来，将终端号码改为你的电话商用的。

如果你的电话商也容易受到攻击请通过邮件或者是评论来告诉我。

应对这个问题并没有想象中的那么简单，这要求重新构造两步验证的电话通知。这里是一些建议的解决方法（在给那些公司的邮件里都提到过）：

  * 要求用户的交互作为验证（推荐）
  * 以语音信箱检测结束通话（不可靠）

最后也是最重要的：

  * 去除语音通话发送验证码的功能（减少了用户体验）

* * *

## 向 Optus揭露

我和[**Ben Grubb**](https://twitter.com/bengrubb)一起工作很愉快(The Sydney Morning Herald and The Age的编辑)，他帮助我把这些问题反映给Optus并且在此过程中非常热心也很有合作精神。

当我第一次发现Optus是易受攻击的时候，我的研究让我注意到这篇文章**[thisIs your Voicemail Hackable? Optus, Telstra and Vodafone respond](http://www.ausbt.com.au/is-your-voicemail-hackable-optus-telstra-and-vodafone-respond)**

Optus很严肃认真地对待顾客的隐私。顾客必须设置一个独一无二的PIN码来激活他们的语音信箱系统。当他们的PIN码被用户服务重新设置时，Optus会建议他们重新设置一个只有他们自己知道的PIN码。

至于欺诈服务，我们正在寻求多种方式来强调这一正在出现的整个工业界的威胁，包括技术上的解决途径以及进行对顾客的教育。

这篇文章的日期是2011年7月22号，距今已经三年了，令人惊讶的是这个问题依然存在并且是一个关于隐私的巨大隐患！

我和Ben在2014年3月2日将这个问题告诉了Optus，从那以后七天左右Optus修复了这个问题。

然而，在修复以后几个小时之内，我能够又一次找出不用pin就可以进入任何Optus顾客语音信箱的方法。Optus正在研究这样的绕过方法，但是在没有其他公告之前，如果你使用Optus或者其他使用他们网络的代理商的服务，请假设你的语音信箱是不安全的，比如Vaya, LiveConnected, Amaysim, Exetel, Yatango 等等。

* * *

### 备注****

正如同我之前对于[**captchas**](http://blog.shubh.am/captchajacking-bypass-captchas/), [**SSRF**](http://blog.shubh.am/demonstrating-the-critical-nature-of-ssrf---accessing-paypal%27s-internal-network-2/)和 [**rate limiting**](http://blog.shubh.am/full-disclosure-coinbase-security/)的迷恋一样，我认为语音信箱和移动网络的安全会占用我未来的许多时间。

每个人都知道移动网络的安全性很差，但是都没有做出什么改变，直到我们因此受到侵害才能意识到这件事情的重要性。

如果你想要跟进我的语音信箱的研究，我会根据电话商的回复来定期更新我的twitter.

[**Follow @infosec_au**](https://twitter.com/infosec_au)

以下服务可能会受到影响，但是我并没有彻底去检测：

  * Snapchat
  * Egnyte (Uses DuoSecurity 2FA and hence is not vuln until further notice)
  * Amazon
  * Dynadot
  * Airbnb
  * Elance
  * Chase
  * Discover
  * Fairwinds

另外有已确认是易受攻击的：

  * Zoho.com (Found by [**David Vo**](https://twitter.com/auscompgeek))

感谢你的阅读，我希望你能够觉得这篇文章有用。

[我是如何绕过Google和Facebook等大站的两步验证的](http://blog.jobbole.com/74590/)，首发于[博客 – 伯乐在线](http://blog.jobbole.com)。
