Flutter逆向初探

前言

最近應用市場有很多使用Flutter混合開發的APP,測試工作中難免會遇到,由於Flutter在構建APP時相對於Android或iOS是比較獨立的,而且將Dart 編譯爲本機彙編代碼使用的格式尚未公開,因此有些人認爲用Flutter開發的業務部分是比較安全的。但我們依然可以通過逆向Flutter來揭開這層“安全”的面紗,下面將爲大家簡單講解如何在Android環境下逆向Flutter繞過APP證書鏈校驗。

Flutter簡介

Flutter是Google構建在開源的Dart VM之上,使用Dart語言開發的移動應用開發框架,可以幫助開發者使用一套Dart代碼就能快速在移動iOS 、Android上構建高質量的原生用戶界面,同時還支持開發Web和桌面應用。

Flutter特徵

在逆向分析前,我們首先要確定測試目標是否用Flutter開發的。當使用Flutter構建Android APP時,lib文件夾下的每個受支持的架構下會出現兩個庫:libapp.so和libflutter.so,如下圖所示。如果出現這兩個特殊的庫,那可以判定這個APP是有部分或全部使用Flutter開發的。
圖片.jpg
其中,libapp.so庫包含了開發過程中編寫的所有編譯過的Dart業務代碼。libflutter.so庫則存放了flutter的一些基礎類庫。

逆向Flutter解決HTTPS抓包問題

應用市場上有些APP核心的業務邏輯代碼使用了Flutter開發,實際測試過程中發現無法使用Burpsuite、Charles等工具攔截相關的請求數據包。這是因爲Dart使用Mozilla的NSS庫生成並編譯自己的Keystore,導致我們不能通過將代理CA添加到系統CA存儲的方式來繞過SSL驗證。

我們可以通過一個小實驗復現上面提到的場景,目標APP主頁面包括了三個按鈕:HTTP Request, HTTPS Request and Pinned Request,分別用來測試攔截三種類型的請求。
圖片.jpg
其中的HTTP和HTTPS是通過HTTPClient類的getUrl方式發送指定請求,Pinned Request是通過使用Dio包執行SSLPinning,發送HTTPS請求並驗證證書。主要的實現邏輯如下所示:
圖片.jpg
首先像抓包Android APP一樣攔截Flutter的請求包,但會發現三種請求都無法被攔截,因爲Flutter APP默認情況下不使用系統的代理設置,所以可以使用Drony + BurpSuite,將手機上的目標APP的流量都重定向到Drony自身,再轉發到BurpSuite上。發現只能攔截到HTTP請求,如下圖所示。
圖片.jpg
發送HTTPS和HTTPS (Pinned) 請求失敗,可以用logcat看到相關報錯信息,這部分我們之後分析:
圖片.jpg
接下來就是通過逆向來繞過證書鏈校驗,目前有兩種方法可以解決這類場景:

(1) 使用reFlutter開源逆向分析工具;

(2) 使用Frida腳本hook libflutter.so中的函數。

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章