1. 程式人生 > 實用技巧 >APP 抓包(應用層)

APP 抓包(應用層)

0x01 前言:

app抓包是逆向協議的前提,也是一個爬蟲工程師的基本要求,最近發現這塊知識非常欠缺就抓緊補補了(我太菜了)

然後接下來是通過vpn將流量匯出到抓包軟體的方式,而不是通過wifi設定代理,因為太容易被檢測了。

0x02 環境配置

vpn代理軟體就下載postern這個軟體,vpn是在網路層這樣可以把傳輸層和應用層的流量都抓到,大概是這樣

當然這個配置規則的ip和埠其實是charles的socket代理的埠,和charles所在機器的ip,所以接下來繼續配置charles,開啟最右上角的按鈕

修改proxy setting,把socket代理配置開啟。

之後再返回到postern中,設定配置代理,然後設定配置規則,都在左邊的按鈕,點開就能看見

0x03 https的抓包

  然後前面大體已經配好了,http的流量完全可以抓了,不過現在的app將重要功能的請求方式全改成https了,會涉及到一個證書的驗證

又因為在應用層抓包本質是一箇中間人在攔截流量,導致客服端到伺服器端的通訊一分為二了,一部分是客戶端到抓包軟體,另一部分是

抓包軟體到伺服器端,所以得分開來考慮,

一.第一部分的情況分為客戶端沒有校驗app證書和有校驗證書

1.如果沒有校驗證書,首先需要把charles的證書安裝到手機的根目錄下並安裝信任,

這裡放個表哥的圖片2333

圖中的瀏覽器是手機的瀏覽器,也就是在手機去訪問。

2.然後如果客戶端有校驗證書的話,也就是客戶端並不預設信任系統根目錄安裝的證書,額外增加一手程式碼驗證,也就是證書繫結機制,這裡有好幾種處理方式

2.1 hook住checkServerTrusted的所有過載,把所有過載置空。貼個肉絲表哥的程式碼

function hook_ssl() {
    Java.perform(function() {
        var ClassName = "com.android.org.conscrypt.Platform";
        var Platform = Java.use(ClassName);
        var targetMethod = "checkServerTrusted";
        var len = Platform[targetMethod].overloads.length;
        console.log(len);
        
for(var i = 0; i < len; ++i) { Platform[targetMethod].overloads[i].implementation = function () { console.log("class:", ClassName, "target:", targetMethod, " i:", i, arguments); //printStack(ClassName + "." + targetMethod); } } });

2.2 objection直接把ssl ping給關了

android sslpinning disable

2.3 還沒研究,還在繼續學習中

二.伺服器端有校驗證書,這波其實和第一部分類似,不過我們不能再通過hook伺服器端的程式碼來bypass了,我們得學會偽裝

比如charles這個中間人,穿上客戶端的衣服,給伺服器端發請求不就好了,所以這裡解決方式就是將手機app中的內建證書,裝入

charles中,這波操作,首先需要找到證書檔案和證書密碼,

對apk解包後,直接搜尋p12為字尾的檔案,常見命令tree -NCfhl |grep -i p12,直接打印出p12的路徑,有些app狡猾的話,

會估計把p12檔案的字尾改成別的格式,file檔案可以檢視一下檔案格式,找到檔案中,hook出密碼,這裡貼一波表哥的程式碼

function hook_KeyStore_load() {
    Java.perform(function () {
        var StringClass = Java.use("java.lang.String");
        var KeyStore = Java.use("java.security.KeyStore");
        KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) {
            printStack("KeyStore.load1");
            console.log("KeyStore.load1:", arg0);
            this.load(arg0);
        };
        KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) {
            printStack("KeyStore.load2");
            console.log("KeyStore.load2:", arg0, arg1 ? StringClass.$new(arg1) : null);
            this.load(arg0, arg1);
        };

        console.log("hook_KeyStore_load...");
    });
}

然後就開啟charles新增證書,