一鍵抓包

中間人一鍵抓包功能,可以全自動地在裝置上開啟全域中間人,它與您常用的工具不同之處在於,您無需顧及憑證安裝設定代理等問題,也無需擔心不同系統版本,抓包方法有所區別這些問題。它可以無縫應用於 Android 6.0 - 14,我們已經為您處理好了一切,您只需要專注於具體業務。 並且支援即時的改包和攔截,相較於常用的 GUI 介面程式,它更適合您作為實際業務使用,而不僅僅是「抓個包看看」。

除此之外,我們可以向您保證沒有抓不到的包(憑證綁定除外),抓包成功率也比常規軟體的方法高。您可以攔截應用程式的 http/s 流量。它可以自動應用及撤銷中間人,退出腳本後,裝置及網路也將恢復原狀,您不必做任何其他設定,腳本同時支援國際中間人抓包(透過上游代理實現),讓您可以輕鬆抓取國外軟體。

注意

不論您是哪種系統的使用者,開始抓包前,為確保準確無誤一次完成,請暫時徹底關閉您的**網路防火牆**。

前期準備

首先確保當前電腦與裝置在同一個網段,或者具備 USB 連接,我們後面假設 192.168.0.2 為執行了 FIRERPA 的手機裝置 IP。其次,確保您已正常克隆專案工具程式碼以及安裝了相關依賴,在命令列驗證 mitmproxy 已安裝成功(可在命令列輸入 mitmdump 進行驗證)。

如果您沒有 Python 也不熟悉什麼是克隆和依賴,您可以在我們的發布頁面下載到 startmitm.exe,它是 startmitm.py 的打包檔,您可以在不安裝 Python 的情況下執行抓包,這是一個主控台應用程式,指令參數與 startmitm.py 相同(該檔案可能會被防毒軟體報毒,請自行決定是否使用)。

基礎抓包

提示

您抓包的應用程式可能存在 SSL PINNING(憑證綁定)或是 QUIC 協定,這兩種情況都可能影響抓包效果。我們會自動強制 QUIC 降級,但是由於可能存在 FallBack 時間,應用程式的網路可能會表現得非常卡頓,請稍等一會。存在憑證綁定的應用程式則無法直接抓包,您需要配合逆向編寫 frida 腳本來繞過 SSL PINNING 邏輯。

您可以透過如下指令快速進行抓包,這是最簡單的使用方法。

python3 -u startmitm.py 192.168.0.2

重要

**務必牢記執行完 startmitm 指令之後,請徹底關掉需要抓包的 APP 並重新開啟,從工作列關閉應用程式不是可靠的做法。請使用 API 關閉或自行使用指令 kill -9 所有與應用程式相關的 PID,否則無法正常抓取。**

按下一次組合鍵 CONTROL + C 即可退出抓包,請不要多次連續按下。

共享抓包

如果您想和區域網路的夥伴一起分析,執行如下指令,隨後讓您的夥伴用瀏覽器開啟 http://您的IP位址:7890 即可和您看到一樣的抓包頁面,你們可以一起愉快地分析。

python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0

特定應用程式

如果您需要攔截特定應用程式的流量,而不是系統全域的流量包,您可以透過下面這種方法在 IP 後面加入 :套件名稱 來抓取特定應用程式的流量資料,以下範例將會只攔截 com.some.package 的流量。

python3 -u startmitm.py 192.168.0.2:com.some.package

即時修改

您可以即時修改應用程式的請求資料和回應資料,此功能基於 mitmproxy 的事件掛鉤。您需要自行根據 mitmproxy 相關 API 編寫掛鉤腳本。關於如何編寫掛鉤腳本,請參考 mitmproxy 的官方文件 docs.mitmproxy.org/stable/addons-examples 以及範例程式碼 mitmproxy/examples/contrib

假設您編寫的掛鉤腳本為 http_flow_hook.py,使用以下方式應用掛鉤腳本。

python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py

不同網路

如果您的手機和當前電腦不在同一個網路,但是可以實體接觸裝置,您也可以透過 USB ADB 的方式進行抓包。需要確保當前裝置已透過 USB ADB 接入電腦且已正確授權。

如果電腦只連接了一個 ADB 裝置,使用如下指令進行抓包,localhost 代表使用 ADB 裝置。

python3 -u startmitm.py localhost

如果電腦連接了多個 ADB 裝置,您需要指定 adb 序號,請從指令 adb devices 的輸出中尋找。

python3 -u startmitm.py localhost --serial bfde362

如果您的環境更嚴苛,例如手機與當前電腦既不在同一網路下,也無法實體接觸裝置,但是只要您可以存取 FIRERPA 的連接埠,也可以進行中間人。這種情況通常為:您使用了內建 frp 服務將 FIRERPA 轉發到遠端伺服器,或者您自行透過某種方式將 FIRERPA 的 65000 連接埠轉發到某個地方。在這種情況下,您和 FIRERPA 之間僅有這一個連接埠可以直接通訊,其他連接埠是無法互相存取的。在這種情況下,手機無法存取到本機的任何連接埠,本機也只能存取到手機的 FIRERPA 連接埠(或者手機有公用 IP,但本機在內網),這樣就需要透過以下方式來進行。(OpenVPN 網路互通,不屬於以上情況)

這時,需要透過下面這種組合方式來進行。首先,使用 adb_pubkey.py 或自行呼叫介面將自身的 ADB 公鑰安裝到裝置上,安裝完畢後繼續執行以下過程,其中 x.x.x.x 為可以連接到 65000 連接埠的 IP 或 127.0.0.1,請依實際情況修改。

adb connect x.x.x.x:65000

最後,按照和上文一樣的方法,透過 USB 抓包來操作。

python3 -u startmitm.py localhost

或者像下面這樣,這裡的 serial 是 adb connect 的位址而不是十六進位序號了。

python3 -u startmitm.py localhost --serial x.x.x.x:65000

上游代理/國際抓包

startmitm 本身會啟動 mitmproxy 作為代理服務,預設情況下,流量都是 mitmproxy 從本機網卡發出的,如果您需要流量透過一個上游代理發出而不是本機,可以使用如下方式指定上游代理,僅支援 HTTP 協定的代理作為上游代理。同時您需要指定一個支援 TCP 查詢的上游 DNS 來避免污染。

小撇步

上游代理模式需要確保 mitmproxy 的版本 >= 9.0.0(且 Python>=3.9)。
python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --proxy-dns 8.8.8.8

如果上游 HTTP 代理需要登入認證,請按以下指令並替換 USER:PASSWORD

python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --proxy-dns 8.8.8.8

以上所有指令將會把裝置流量從 upstream 代理發出,並且將本機所有 DNS 查詢透過代理傳送到 8.8.8.8。