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新增證書,