[翻译]我是如何发现微软任意账户劫持漏洞,并因此获得5万美元赏金的

概述

本文描述了研究人员是如何发现微软在线服务上存在的一个漏洞,该漏洞可能允许任何人未经许可就可以接管任意微软帐户。微软安全团队已针对该漏洞进行了修复,并向研究人员颁发了5万美元的漏洞赏金。

研究人员在发现Instagram上的帐户劫持漏洞后,就试图在其他服务中的寻找类似漏洞。结果,研究人员发现微软重置用户密码使用的是类似的技术,因此研究人员决定对其进行渗透测试,以查看其否存在任何速率限制漏洞。

渗透测试

在对微软帐户密码进行重置时,我们需要进入“忘记密码”页面,并在页面中输入账户的电子邮件地址或电话号码,之后我们需要选择可接收安全码的电子邮件或手机号码。

image-2-512x420

我们必须在页面中输入收到7位数安全码,才能对该账户密码进行重置。但如果我们可以对7位数安全码的所有组合(即10^7=1000万个代码)进行暴力破解,我们将可以在未经许可的情况下重置任意用户的密码。但是,显然为了应对这种暴力破解,微软的后端肯定存在一定的速率限制,以阻止我们进行大量的尝试。

image-6-491x420

拦截向代码验证端点发出的HTTP POST请求,如下所示:

从以上屏幕截图中,我们可以看出请求中不存在我们输入的1234567安全码。它已被加密,然后发送以进行验证。我猜想开发人员这样做的目的是为了防止自动暴力破解工具对其系统进行利用。因此,我们无法使用Burp Intruder之类的工具自动测试多个代码,因为它们不会执行加密。

giphy (3)

一段时间后,我想出了加密技术,并且能够自动地完成从加密代码到发送多个并发请求的整个过程。

我的初始测试结果,表明存在速率限制,这符合我们预期。在发送的1000个代码中,只有122个能够成功通过,其他代码则受到1211错误代码限制。且如果我们不断发送请求,它们将阻止相应的用户帐户发送进一步的尝试。

接下来,我尝试通过发送并发请求,以绕过速率限制,从而允许我们发送大量请求。但是当注入正确的7位数安全码时,我依然无法获得成功的响应。这意味着,开发人员可能已经采取了一些控制措施来防止此类攻击。

尽管在发送正确的安全码时出现错误,但是并没有出现我们在初始测试中遇到的阻止用户的迹象,所以我们的希望并没有完全破灭。

giphy

几天后我意识到,如果我们发送的所有请求没有同时到达服务器,则服务器会将IP地址列入黑名单。即使请求之间的延迟间隔只有几毫秒,服务器仍可以检测到攻击并进行组织。想通这一点后,我立即调整了代码以处理这种情况,并再次对其进行测试。

giphy (1)

令人惊讶的是,它生效了,这次我获得了成功的响应。

giphy (2)

我一共发送了约1000个左右七位数的安全码,其中包含正确的安全码,使我成功对密码进行了重置。

上面的过程仅对未启用双因素身份验证的用户有效,因为如果用户启用了2FA,我们必须绕过双因素身份验证代码才能更改密码。

我对一个启用了2FA的帐户进行了测试,发现其同样也容易受到此类攻击。启用2FA的账户在重置密码时,首先会被要求输入由身份验证器应用程序生成的6位数字代码,验证通过后,才会被要求输入发送到其电子邮件或电话号码中的7位数字代码。

这意味着,攻击者必须同时发送6位和7位安全码的所有可能性(约1100万次请求尝试),以更改任意微软帐户(包括启用了2FA的帐户)的密码。

要发送如此大量的并发请求并不是一件容易的事,攻击者需要需要大量的计算资源以及数千个IP地址才可能成功进行攻击。

总结

研究人员在发现该漏洞后,立即用视频记录下了所有绕过的过程,并将其连同漏洞复现的详细步骤提交给微软安全团队。该漏洞已在2020年11月被微软修复,通过这一发现,研究人员也获得了微软奖励的五万美元的漏洞赏金。

hackone上边也看过类似的手段,我想问一下国内的话那么多ip怎么找