记两次Instagram APP密码重置POC
“要重置密码吗?要1000台电脑的那种”
原作 | thezerohack.com "Laxman Muthiyah"
译者 | 公 众 号 HackerHub
这两次漏洞的作者都是Laxman Muthiyah,并依次获得Facebook 3万美元和1万美元的漏洞奖励。两个漏洞公开时间分别是2019年7月29和2019年8月26。
目前两个漏洞都已经被修复,但是其攻击方法,对其它APP的攻防提供了一个重要思路。
漏洞奖励之一说在前
当用户使用手机号找回Instagram密码时,手机会收到一个6位的数字验证码,用户必须输入这个验证码才能重设自己的密码,验证码10分钟内有效。6位数字,排列组合总共1百万种(000001 ~ 999999),所以,对于任意一个账号,在10分钟内最多尝试100万次就能重设他的密码了。。。
然鹅。。。
第一个,任意用户密码重置漏洞
通过测试发现,连续发送1000次请求,250次可以过,剩下的750次因为频率过高被拦截。再尝试1000次,发现大部分都被拦了。貌似,大多数风控都这种路数,看起来很有效。。。
然鹅,经过测试,发现两个套路可以绕过他们的频繁限制机制:
竞争冒险 (组合逻辑电路的概念)
IP轮换
当通过多个IP同时发送请求可以达到发送一大堆请求而不被限制的效果。因为验证码10分钟内过期,经过测算,需要1000个IP来实现这种攻击。
POC
请求重置密码的验证码:
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
受害者会收到一个验证码,并在10分钟后过期
发送验证码:
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
上面是一个正常用户重置密码的过程,现在以HTTP协议的方式展现。
现在需要做的把这个http请求,利用很多个ip发送出去。
测试时,大概每个ip发送200次请求都没被拦,使用1000个机器和ip(使并发更容易),发送大约20万个请求便达到重置密码的效果。
在实质上的攻击场景,攻击者需要用5000IP才可以比较完美地攻击任意一个Instagram 账号。这个数字听起来很大很可怕。可怕那是是以前,在现在,使用云,例如亚马逊云或者Google云,大概150美元就能完成一次需要100万次验证码的攻击。
第二个,超大规模用户密码重置
跟第一个很类似,主要有问题的地方在devic_id:
recover_code=123456&device_id=device-id
当用户请求重置密码时,有一个device id 会随着请求发送过去。同一个device id会再一次被用来发送验证码。
device id是一个由Instagram app 生成的随机字符串。所以,如果同样的device id用来给多个Instagram 账号请求验证码呢?通过测试发现,同一个device id可以用来给不同的账号请求多个验证码。
POC
6个数字的验证码有100万种可能。如果我们给很多个账号都申请重置密码,那么我们黑下账号的概率就提升了。
例如:
如果你用同样的device id给10万个账号申请重置密码,你就有了10%的成功率,因为有10万个验证码和这个device id绑定在一起了。
如果我们用同样的device id给100万个用户申请密码重置,那么这100万个用户都和这个device id绑在一起,并且都对应一个6位数的密码重置验证码。我们便可以快速地控制这100万个账号,仅仅只需要递增挨个尝试验证码便可(这个时候,其难度和操作方法就回到了第一个漏洞)。
因此,攻击者可以给100万人申请密码重置来实施100%的攻击成功率。还需要注意的是,验证码10分钟过期,所以整个攻击需要在10分钟内完成。
两个现在都已经修复。但这两种方式给APP渗透一个攻击思路,相信现行的绝大多数APP都没有充分考虑超大规模的IP攻击的安全性问题。也给蓝队一个警醒。
两个漏洞的详情:
https://thezerohack.com/hack-any-instagram
https://thezerohack.com/hack-instagram-again