该Writeup是关于Instagram渠道的恣意账户绑架缝隙,作者通过构造出打破速率约束(Rate Limiting)的办法,可暴力猜解出恣意Instagram账户的暗码重置确认码,以此完成Instagram账户绑架。终究Facebook和Instagram的安全团队联合修正了该缝隙,并对作者给出了高达$30,000美金的奖赏。以下是作者的同享。
从暗码重置功用入面试命运
在闻名的数据走漏事情发作之后,Facebook在全渠道不断改进它的安全操控措施。出于对包含账户绑架等严峻缝隙的奖赏,Facebook增加了相应的缝隙赏金数额。我想试试命运,看看能否发现一些东西,成果真的就在Instagram上中大奖了。(Instagram为Facebook旗下的子运用)
对Instagram的测验一开始,我就想到了账户绑架缝隙(Account Takeover),当然与之相关的应该便是Instagram的忘掉暗码功用了。所以,我就在Web办法下,用我自己的Instagram账户进行重复的暗码重置测验。暗码重置恳求宣布后,Instagram会给账户相应的邮箱回来一条重置链接,这种重置链接形似进行了全面的安全防备,滴水不漏,我找不到任何缝隙。
转向移动端深入分析
所以,我就转向了Instagram移动运用端的暗码重置机制下,不料我就在这儿发现了一个可疑行为。暗码重置要求下,当用户输入他的手机号码后,Instagram会向该手机号发送一个6位确认码,在手机端输入该6位确认码之后,暗码重置才干成功收效。理论上来说,这种6位数确认码,有10*10*10*10*10*10*的一百万种或许,假如我在手机端都能测验一遍一切这一百万种的各种或许,那么是不是就能对恣意账户完成账户绑架了呢?能够必定的是,应对这种暴力破解,Instagram后端必定存在必定的速率约束(Rate Limiting)。不过,我决议试试看。
至少我的测验验证了Instagram后端的速率约束机制长什么样。在我发送的1000多个恳求中,大约有250个左右会被有用通过,其他的750个会被速率约束机制阻挠掉。然后,我又发送了别的一组1000多个恳求,这一次,其中有绝大部分被速率约束机制阻挠掉。这样看来,Instagram的验证和速率约束机制还能够。
但有两件事我有点想不通,那便是宣布的恳求数量和Instagram未对恳求履行黑名单化的行为。原因在于,即便我能在短时间内发送有限数量的恳求,但我也能接连发送恳求而不会被阻挠掉。这就…..是不是有点问题呢?
发现打破速率约束(Rate Limiting)的办法
通过几天的接连测验,我发现了能够成功绕过Instagram速率约束机制的办法,那便是:
Race Hazard(竞态条件)
IP Rotation(IP轮换)
竞赛冒险(Race Hazard):又叫竞态条件、竞赛条件(Race Condition),它旨在描述一个体系或许进程的输出依赖于不受操控的事情呈现次序或许呈现机遇。此词源自于两个信号试着互相竞赛,来影响谁先输出。
举例来说,假如计算机中的两个进程一起企图修正一个同享内存的内容,在没有并发操控的状况下,终究的成果依赖于两个进程的履行次序与机遇。并且假如发作了并发拜访抵触,则终究的成果是不正确的。竞赛冒险常见于不良规划的电子体系,尤其是逻辑电路。但它们在软件中也比较常见,尤其是有选用多线程技能的软件。
IP轮换(IP Rotation):是指在必定时间内,用不同的IP地址去恳求同一个服务端接口。通常用署理可完成这种IP地址轮换,这种办法运用于打破网站反爬虫机制对很多数据的抓取。
假如你对竞赛冒险(Race Hazard)或竞态条件(Race Condition)了解较少,请自行百度了解。在竞态条件之下,我运用多个IP地址向Instagram后端发送多个暗码重置的确认码并发恳求,这种状况下,能够绕过Instagram的速率约束机制,不被阻挠。能够发送的恳求数量取决于恳求的并发性和咱们运用的IP地址数量。别的,我还发现,暗码重置的确认码会在10分钟之后过期,这就使得此类进犯愈加困难,也因而,咱们或许需求多达1000个的不同IP地址来履行这种进犯。
后来,我把该缝隙上报给Facebook之后,因为在缝隙陈述中没具体阐明状况,他们的安全团队起先无法复现缝隙。之后,通过和他们的重复邮件交流,我又 *** 了一段概念验证性视频发给他们,终究他们确认了该缝隙的有用性。
概念验证性进犯(PoC)
暗码重置时向Instagram后端恳求确认码:
POST /api/v1/users/lookup/ HTTP/1.1
User-Agent: Instagram 92.0.0.11.114 Android (27/8.1.0; 440dpi; 1080×2150; Xiaomi/xiaomi; Redmi Note 6 Pro; tulip; qcom; en_IN; 152830654)
Accept-Language: en-IN, en-US
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Host: i.instagram.com
Connection: keep-alive
q=mobile_number&device_id=android-device-id-here
该POST恳求宣布后,受害都将会收到一个6位数的暗码重置确认码,该确认码的有用期为10分钟。
客户端输入以上确认码后,Instagram后端对该确认码的验证:
POST /api/v1/accounts/account_recovery_code_verify/ HTTP/1.1
User-Agent: Instagram 92.0.0.11.114 Android (27/8.1.0; 440dpi; 1080×2150; Xiaomi/xiaomi; Redmi Note 6 Pro; tulip; qcom; en_IN; 152830654)
Accept-Language: en-IN, en-US
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Host: i.instagram.com
Connection: keep-alive
recover_code=123456&device_id=android-device-id-here
根据以上两个POST恳求和之前的进犯战略,咱们需求运用多个IP地址对该暗码重置服务端进行暴力猜解。经测验发现,大约来说,我能够用每个IP地址发送将近2000个的恳求,而不被Instagram后端的速率约束阻挠。
在我的实践测验中,我用1000台机器对应的1000个IP地址,并轻松完成了恳求并发,发送了将近20万个恳求,占100万个总概率的20%。
总结
实在进犯场景下,进犯者用5000个IP地址就能成功暴力猜解出一个有用的暗码重置确认码,以此就能“黑”掉(绑架掉)一个Instagram账户。这么多的IP地址听起来形似很难完成,但假如用 Amazon 或 Google等云服务就能十分容易地让你具有如此多的IP地址,履行完一百万个暗码重置确认码的暴力猜解,全程的本钱花费也只是便是150美元。这….。
终究,Facebook安全团队因我那个20万个有用恳求发送的POC视频确认了缝隙,并及时修正了该缝隙。而我终究也获得了Facebook官方奖赏的$30,000美金。