白帽故事 · 2023年11月24日 0

突破Google的Bug跟踪系统,获得15,600美元赏金之旅

背景介绍

也许你从没有听说过谷歌Bug/问题追踪器,除非你是Google员工或是最近报告过Google工具中Bug的开发人员。

国外白帽子某天注意到除了通常的电子邮件通知之外,Google还通过打开一个新线程来处理漏洞报告。

那么这个Bug/问题追踪是否有“洞”可寻呢?

file

根据文档介绍,Bug/问题跟踪器(Google内部称Buganizer系统)是谷歌内部使用的工具,用于跟踪产品开发期间的Bug和功能请求。

它可以在 Google 外部使用,供需要与 Google 团队就特定项目进行协作的外部公众和合作伙伴用户使用。

换句话说,当有人对 Google 产品有疑问时,它就会出现在Bug/问题跟踪器中,作为外部用户,我们只能看到冰山一角:一小部分预先批准的类别,以及 Google 某人明确添加外部帐户的问题,例如漏洞报告。但这表面之下会隐藏着多少信息呢?

file

通过上图观察分配给最新公开的 ID,可以轻松估计该工具的内部使用量,工作时间内每小时大约有 2000-3000 个问题被打开,其中只有 0.1% 是公开的,如果这个系统发生数据泄露,确实会产生比较大的影响!

获取Google员工账户

在发现Bug/问题跟踪器后,白帽小哥首先注意到的一件事是通过向一个特殊的地址发送电子邮件来参与讨论,这个地址看起来像下面这样:

buganizer-system+componentID+issueID@google.com

其中ComponentID是表示类别,IssueID是要响应线程的唯一标识符。

白帽小哥想起最近一项名为‘票据欺骗’的漏洞发现,该发现允许黑客通过利用这种电子邮件系统渗透到组织的聊天系统中,考虑到这是一个@google.com的电子邮件地址,白帽小哥试着用它注册了谷歌的Slack团队,得到的确认页面看起来非常有希望:

file

可惜,一封来自Slack的电子邮件都没有出现。

那么接下来最好的事情就是获得一个带有 @google.com 后缀的电子邮件地址,从而在 Buganizer 上带来一些额外的特权!

file

白帽小哥发现了一个绕过的方法:如果用任意其它假电子邮件地址注册,但不通过点击电子邮件收到的链接来确认帐户,就可以没有任何限制地更改电子邮件地址。

通过该方法,白帽小哥成功更改了一个新的Google帐户的电子邮件:

buganizer-system+123123+67111111@google.com

不久之后,白帽小哥便收到了作为相应问题页面消息的确认电子邮件:

file

太棒了!点击确认链接,登录Bug/问题跟踪器,然而…

file

却被重定向到企业登录页面,裂开~

尽管如此,这个帐户在互联网的其它地方依然有很多额外的好处,比如免费’搭便车’的能力,所以这依然是一个安全问题,会为恶意用户打开了很多方便之门。

漏洞受理时间:11小时 | 赏金:3,133.7美元 | 级别:P1

获得内部票据通知

在熟悉UI的同时,另一个吸引白帽小哥眼球的功能是标注星标,突出问题意味着你对正在讨论的问题感兴趣,并且希望每当有人添加评论时收到电子邮件通知。

file

白帽小哥注意到这个功能的有趣之处是当尝试无法访问的问题上使用它时,没有出现任何错误提示。

访问控制规则似乎从未应用于该端点,因此当登录到第二个帐户,并尝试通过替换请求中的问题 ID 来为主帐户的漏洞报告加注星标,就看到了下面这条消息,因此也就意味着该操作已经成功:

1 person has starred this issue.
1 人已为此问题加注星标

监视谷歌公开的漏洞真的这么容易么?白帽小哥很快就发布了一条关于这个问题的讨论,然后查看虚构的攻击者账号是否会收到通知。

这次,依然没有电子邮件出现…

恍惚间,白帽小哥决定对这个问题做进一步的测试,于是他得到了最近一期的 ID,并推断出几千个 ID 的范围,这些 ID 应该与数据库中的最新一期相吻合,然后,白帽小哥给它们都加注了星标。

于是短短几分钟内,白帽小哥的收件箱就变成了下面这样:

file

当打开收件箱时,白帽小哥第一个念头便是“中头奖了!”

经过仔细检查后,这些帖子中并没有什么特别有趣的事情,只能窃听与翻译相关的对话,在这些对话中,人们会争论如何用不同的语言表达一个短语的意思。

白帽小哥考虑不报道该事件,他希望能找到一种方法来升级漏洞的严重程度,最终白帽小哥意识到Google安全团队可能会对寻找可能的Pivot方法和绕过感兴趣,于是便发送了漏洞发现的详细信息。

漏洞受理时间:5小时 | 赏金:5000美元 | 优先级:P0

继续尝试

当以外部用户身份访问Bug/问题跟踪器时,它的大部分功能都会被移除,给你留下的权限极其有限,如果你想看到Google员工才能看到的信息,可以尝试在Java文件中寻找API端点。

一些功能被完全禁用,但有些功能则简单地隐藏在界面中。

在设计这个系时,有程序员朋友很好心地为我们留下了一个方法,可以将自己从抄送列表中删除,以便我们对某个问题失去兴趣或不想再收到有关该问题的电子邮件使用。

可以通过发送如下所示的POST请求来实现:

POST /action/issues/bulk_edit HTTP/1.1{
   "issueIds":[
      67111111,
      67111112
   ],
   "actions":[
      {
         "fieldName":"ccs",
         "value":"test@example.com",
         "actionType":"REMOVE"
      }
   ]
}

然而,这里的一些疏忽导致了一个巨大的问题:

  1. 访问控制不当:在尝试执行给定操作之前,没有明确检查当前用户是否确实有权访问 issuesIds 中指定的问题

  2. 无提示失败:如果你提供的电子邮件地址当前不在抄送列表中,端点将返回一条消息,说明该电子邮件已成功删除

  3. 响应的完整问题详细信息:如果操作过程中没有发生错误,则系统的另一部分假定用户具有适当的权限。因此,有关给定问题 ID 的每个详细信息都将在 HTTP 响应正文中返回。

于是我们便现在可以通过替换上面请求中的 issuesIds 来查看数据库中每个问题的详细信息!

白帽小哥立即将利用漏洞的详细信息发送给Google,他们的安全团队在一小时后禁用了受影响的端点。令人印象深刻的响应时间!

漏洞受理时间:1小时 | 赏金:7500美元 | 优先级:P0

关于‘票据欺骗’漏洞:https://medium.freecodecamp.org/how-i-hacked-hundreds-of-companies-through-their-helpdesk-b7680ddc2d4c

更多Google案例