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添加證書,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM