挖掘任意微软账户接管漏洞赢取 5 万美元的全过程

  • 发表时间:
    , 文章来源:MyZaker, 新闻取自各大新闻媒体,新闻内容并不代表本网立场

    在这篇文章中,我将为读者详细介绍自己是如何在微软在线服务中挖掘到一个高危安全漏洞的——利用该漏洞,任何人都可以在未经用户同意的情况下接管任意的微软账户。目前,微软安全团队已经修补了这个漏洞,并为本人颁发了 5 万美元的奖金。

    在发现 Instagram 账户的接管漏洞之后,我一直在寻找其他服务中类似的漏洞。后来我发现,微软也在使用类似的技术来重置用户的密码,所以,我决定测试其中是否存在速率限制漏洞。

    为了重置微软账户的密码,我们需要在 "忘记密码" 页面中输入自己的电子邮件地址或电话号码,同时,还要选择到底使用电子邮件还是手机号码来接收安全码。

    *(photo:MyZaker)

    当我们收到 7 位数的安全码后,必须输入该码,然后才能重置密码。在这里,如果我们能够遍历所有的 7 位数的安全码组合(即 10^7=1000 万个密码),就能够在未经许可的情况下重置任何用户的密码。但是,很明显,微软肯定会设置速率限制,以防止攻击者进行大量的尝试。

    *(photo:MyZaker)

    我们可以拦截向代码验证端点发出的 HTTP POST 请求,具体如下所示:

    *(photo:MyZaker)

    如上图所示,我们输入的 1234567 安全码并没有以明文形式出现在该请求中,因为它首先会进行加密处理,然后才会发送验证。之所以这么做,很可能是为了防止攻击者利用暴力破解攻击自动攻击该验证系统。也就是说,我们无法使用像 Burp Intruder 这样的工具自动测试大量的安全码,因为它无法处理加密的部分。

    *(photo:MyZaker)

    经过一段时间后,我终于弄明白了这里使用的加密技术,并实现了从加密安全码到发送多个并发请求的整个过程的自动化。

    初步测试显示,正如预期的那样,这里的确存在速率限制。在发送的 1000 个安全码中,只有 122 个被放行,其他的安全码都被阻止了,并显示出错代码 1211;也就是说,如果我们连续发送请求,超出一定的数量之后,系统会阻止相应的用户账户进一步发送发送请求。

    *(photo:MyZaker)

    然后,我试着像对 Instagram 那样同时 / 并发发送请求,虽然这种方式使我可以发送大量请求而不被阻止,但仍然无法在注入正确的 7 位安全代码时获得成功的响应。我认为他们肯定采取了某些控制措施来防止这种类型的攻击。尽管在发送正确的安全码时收到了出错信息,但仍然没有像我们在最初的测试中看到的那样阻止用户的迹象。所以,我认为还是有机会的。

    *(photo:MyZaker)

    过了些日子,我突然意识到,如果我们发送的所有请求没有同时命中服务器,他们就会把 IP 地址列入黑名单,因此,哪怕请求之间只有几毫秒的延迟,也能让服务器检测到攻击并阻止该攻击。因此,我调整了自己的代码,以处理这种情况,并再次进行了测试。

    *(photo:MyZaker)

    出乎意料的是,这次竟然成功了——这次收到了成功的响应。

    *(photo:MyZaker)

    为此,我发送了 1000 个左右的七位数安全码,其中包括正确的安全码,之后就可以进入修改密码的步骤了。

    需要注意的是,上面描述的方法仅适用于没有启用双因素认证的用户;如果用户启用了 2FA,我们首先需要绕过双因素码认证,然后才能修改密码。

    我测试了一个启用了 2FA 的账号,发现他们使用的都是同一个终端,并且都容易受到这种攻击的威胁。一开始,用户会被提示输入一个由身份验证器应用程序生成的 6 位数安全码,然后才会被要求输入发送到他们的电子邮件或电话号码的 7 位数的安全码。之后,他们就可以修改密码了。

    综合来看,攻击者必须发送所有可能的 6 位和 7 位数的安全码,为此,大约需要进行 1100 万次的请求尝试,而且必须同时发送,只有这样才能修改任意微软账户的密码(包括那些启用 2FA 的账户)。

    要发送如此大量的并发请求,可不是一件容易的事情,因为这需要大量的计算资源以及数以千计的 IP 地址才能成功发动该攻击。

    我立即录制了攻击过程的相关视频,并与重现该漏洞的详细步骤一起提交给了微软。之后,他们很快就确认了这个安全漏洞。

    该漏洞已经于 2020 年 11 月得到了修复,但是,刚开始的时候,他们并不认为这是一个提权漏洞。于是,我要求他们重新考虑漏洞的性质,经过多次交涉之后,微软终于将漏洞归类为提权漏洞(同时,还涉及多因素认证绕过漏洞)。鉴于该攻击的复杂性,该漏洞的严重性被被定为 " 重要 " 而非 " 严重 "。

    来自 MSRC 的 Bount 电子邮件:

    *(photo:MyZaker)

    微软确认了本文报告的漏洞:

    *(photo:MyZaker)

    2021 年 2 月 9 日,我通过 hackerone 收到了 5 万美元的赏金,并在 3 月 1 日获准发表这篇文章。在这里,我要特别感谢 Dan、Jarek 和整个 MSRC 团队,感谢他们耐心倾听我的所有意见,提供更新并修复了该漏洞。同时,这里也要感谢微软的慷慨。