挖洞经验 | 利用Device ID实现对任意Instagram账户的再次劫持

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担

上一次,作者通过突破Instagram后台速率限制,构建暴力猜解机制,可以破解出发送给用户的密码重置确认码,以此 实现十分钟之内对任意Instagram账户的劫持 ,漏洞赏金$30,000。这一次,作者通过对设备号(Device ID)的利用,用同一用户移动端设备发起暴力猜解,再次实现对任意Instagram账户的劫持,厉害了!由于该漏洞危害程度较上个漏洞相对较低,最终,获得了Instagram官方 $10,000 的奖励。一起来看看

漏洞原理

在上个漏洞中,可以看到,当用户发起密码重置(Password Reset)请求时,用户端移动设备会向Instagram后端发起一个确认码(Pass Code)请求,如下:

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

仔细观察上述这个请求,可以发现,其中的终端设备号device ID是Instagram服务器验证终端用户的唯一识别码。当用户用他自己的手机设备发起这个请求时,这个设备号device ID会包含其中。以上请求可以说明,设备号device ID其实是Instagram后台用来验证验证用户身份,进而分发确认码的。

这里要说明的是,device ID是Instagram应用根据用户情况随机生成的一串字符串,那么,我的想法是:如果使用同一个用户终端移动设备,来针对不同Instagram账户发起上述密码重置请求,结果会怎样?经我测试发现,相同移动端设备会产生同一个device ID,可以用它来针对多个Instagram用户,发起上述请求,从而获得与各个Instagram用户对应的多个密码重置确认码。

漏洞利用

由于密码重置确认码有6位数,所以其范围为 000001 到 999999,共一百万种概率。所以,当我们用同一台用户端移动设备发起对多个账户的密码重置确认码请求时,理论上是提高了账户劫持的可能性。例如,如果使用同一台用户端移动设备去请求100,000个用户的密码重置确认码,那么,这样由于Instagram后端将会向这台移动端设备返回确认码,所以,这就有10%的成功率了。相应的,如果我们请求一百万个用户的密码重置确认码,那么,我们可以对确认码每次增加一位,逐位进行破解。

因此,攻击者针对一百万用户,用上述方式进行暴力请求,获得密码重置确认码的成功率绝对是100%的。另外,我们还要注意,确认码只在10分钟之内有效,所以攻击成功的窗口期只有10分钟。结合上个漏洞分析文章中提到的基础设施,引入该漏洞利用方法,一样可以实现对任意Instagram用户的劫持攻击。

漏洞上报后,Facebook和Instagram团队非常重视,及时进行了修复,继上个漏洞$30,000的奖励后,这个漏洞也获得了Facebook官方$10,000的奖励。感谢Facebook!

*参考来源: thezerohack ,clouds编译整理,转载请注明来自FreeBuf.COM