####
有時候app抓不到包,這不是工具的問題,而是你沒有搞清楚網絡協議,
###
網絡協議
網絡協議,比如http協議,這是全球通用的,大家約定好的,你要開發軟件,就要遵守這個協議,
瀏覽器都是只能抓到應用層,
###
TCP/IP五層模型
五層協議:
應用層:用戶使用的應用程序都歸屬於應用層,作用為規定應用程序的數據格式。
抓包工具,比如fiddler,Charles,都是只能抓應用層的協議,wareshark可以抓傳輸層的協議,但是一般不用這個軟件太重了,
http協議,FTP,SMTP協議,都在應用層,
tcp,udp,在傳輸層,
ip協議,在網絡層,
傳輸層:網絡層幫我們找到主機,但是區分應用層的應用就是靠端口,所以傳輸層就是建立端口到端口的通信。(端口范圍0-65535,0-1023為系統占用端口)
網絡層:區分不同的廣播域或者子網(否則發送一條數據全世界都會收到,是災難)。
數據鏈路層:定義電信號的分組方式。
物理層:基於電器特性發送高低點電壓(電信號),高電壓對應數字1,低電壓對應數字0。
c)OSI七層模型
七層協議:(應用層、表示層、會話層)、傳輸層、網絡層、(數據鏈路層、物理層)
比如pc版本的qq客戶端,你就抓不到包,因為這個沒有用http協議,而是用的tcp協議,所以你抓不到
###
你發了一個微信消息給另外一個人,發生了什么?
這個就是遵守這個tcp/ip五層協議,
先從應用層往下封包,----然后到物理層開始傳輸,---到了對方那里之后開始從物理層開始解包,----一直到在微信里面開始展示出來,
###
抓包方式:
抓包方式
第一種抓包:代理抓包
1,代理抓包,比如fiddler,Charles,這都是使用的代理抓包,這是抓的應用層,這種是用的最多的,
優點:
配置簡單/抓取解析SSL方便
缺點:
APP對代理抓包的檢測屏蔽越發厲害
原理:
注意,這個fiddler這樣的工具,只能抓http,https,websocket三種協議,比如發一個郵件是抓不到的,因為這是smtp協議,
這種代理抓包,又叫做中間人攻擊,
所以這個工具的抓包原理是什么樣的,就是使用的代理,把請求攔截,然后轉發,
所以代理抓包這個抓包工具,既是充當了客戶端,也是充當了服務端,
http和https的區別,
這個還是要想想原理,
HTTPS:
HTTP是明文傳播,易被攔截,易被修改,網頁彈廣告。
HTTPS在HTTP的基礎上加了一安全層(SSL或TSL)
HTTPS的特點:
1.數據加密,不再明文傳播
2.使用數字證書(CA Certificate Authority)(賽門鐵克),做身份校驗,防止數據被截獲,只有合法證書持有者
才能讀取數據
3.數據完整性,防止數據被篡改。對數據做簽名
####
代理抓不到包的原因第一種:app設置了自己的代理
主要是app設置了自己的代理,安卓會優先走app自己設置的代理,所以就不會走抓包工具的代理,
###
如果判斷app沒有走我們的fiddler代理呢?
就是保持網絡連接,關閉抓包工具,如果app還能訪問正常,就說明沒有走我們的fiddler代理,因為正常是fiddler關閉了之后,整個的app就訪問不了了,
###
怎么解決這個問題?
使用一個app,proxydroid,這個app強制把代理往fiddler上面轉,
原理就是配置了全局代理,強制把ip指向指定的端口上,
案例:mm應用市場
具體怎么設置Charles手機抓包,網絡上都有很多的教程,不多說,
一個app不能被代理工具抓包,
安裝mm應用市場,這個app做了強制升級,否則就不讓你用了,這是一個問題,也就是有些app,你是沒有辦法進行低版本的逆向的,
我們抓包這個app,是抓不到的,沒有我們想要的東西,
第一步:
首先你要先能正常抓包到其他的app,證明代理設置是對的,可以抓到手機app的包,
這個時候,你把代理軟件關閉,這個app是不能訪問的,因為設置了代理,而代理關閉了,
第二步:
關閉代理,看看這個抓不到包的app,是否還能正常運行,
我們可以發現,這個app,沒有受到代理的影響,也就是沒有走我們設置的代理,
第三步:
我們要解決這個問題,
使用一個app,proxydroid,這個app強制把代理往fiddler上面轉,
安裝這個app,注意手機要root,
實際上,用了這個代理轉發的app之后,可以不用設置手機wifi里面的代理轉發了,
###
解決方法:
ProxyDroid APP 全局代理 強制把IP轉發到指定端口上
原理: 使用 iptable 命令 實現端口轉發
mumu虛擬器 iptable 會報錯
案例:mm應用市場
###
代理抓不到包的第二種:ssl pining ssl證書校驗,這個是大部分的app抓不到包的原因
就是app對服務端的證書做校驗,我們也叫做單向認證,
而fiddler上面肯定是沒有這個證書的,所以app會校驗不過,
為什么瀏覽器不會出現這個問題,因為瀏覽器不會校驗這個證書,而app是公司自己開發的,可以加這個校驗的功能,
###
這個ssl pining ssl證書校驗的原理
這種和不走代理還不一樣,這種是走了代理,但是ssl證書驗證,
####
抓包安吉星:
我准備在真機上面測試,
先安裝兩個app,安吉星,justtrustme,
記住關鍵點!,justtrustme安裝了之后,要重啟這個手機設備,這個justtrustme才會生效,
第一步,抓包發現是一個connect,是看不到內容的,
第二步:怎么解決這個問題,
ssl pinning解決辦法:
1.使用Hook手段 Hook APP端網絡請求庫對 ssl證書的判斷方法
借助xposed 模塊 justtrustme apk 地址:https://github.com/Fuzion24/JustTrustMe ----通過安吉星演示
借助frida 程序 DroidSSLUnpinning https://github.com/WooyunDota/DroidSSLUnpinning ----這個沒有演示,
解決的思路是直接強制校驗證書通過
示例:安吉星
2,使用上面的justtrustme,有時候還是會抓不到的,
因為這個apk是使用hook網絡請求庫的方法, 但是如果你沒有hook到這個網絡請求庫,就會失效,比如這個網絡請求庫是企業自己開發的,
怎么處理這種情況?
逆向APP 扣出里面的證書 放到charles里 讓charles使用真實證書做代理(在雙向驗證中講) ---這種沒有演示
部分 ssl pinning 失效的原因:---這種沒有演示
Hook 失敗,APP的網絡請求庫代碼被混淆,或者大廠自己實現了一套網絡請求庫
解決辦法:
逆向APP,找到證書驗證的地方,修改xposed 的 justtrustme 或者 frida的DroidSSLUnpinning 代碼,
重新Hook
這個是一個比較麻煩的事情,
###
現在抓包反而成了一個問題,
1,mumu模擬器不能安裝Xposed,也就不能使用justtrustme,也就不能使用fdex2脫殼,
2,夜神模擬器安裝不上mac版本,這個讓人惱火,虛擬機安裝夜神又非常的慢,
3,真機是安卓8的版本,Xposed能用,但是fdex2,不能用,這個也讓人惱火,
4,genymotion,最新的情況是可以Charles抓包了,
怎么辦?
我覺得,
Xposed+justtrustme+安吉星+真機安卓8,嘗試一下,
我發現這種方法,justtrustme,沒有生效,還是抓不到,
####
Xposed+justtrustme+安吉星+genymotion安卓6,嘗試一下,
還是不行,justtrustme,沒有生效,還是抓不到,
到底是為什么?
我終於知道了,是因為這個安吉星app,是使用的雙向認證!!!
####
手機有時候有的app能打開,有的app打不開,這是為什么?
很可能是有抓包代理,
因為有的app是通過代理的,只是有ssl驗證,所以失敗,
有的app是繞過代理的,所以是正常的
有的app是沒有對代理進行處理的,沒有繞過也沒有ssl驗證, 所以也是正常的,
細細分析一下,不要慌,
實在不行,重啟手機,然后再分析,
###
代理抓不到包的第三種,雙向認證
雙向認證 使用者很少,會影響服務器性能 很難找到有app使用這種app
客戶端對服務端發來的證書做校驗
真實的服務端也對客戶端證書做校驗
###
這種為什么使用Charles不能抓到包,
因為你請求服務器的時候,Charles是把自己的證書攜帶着去請求服務器的,這種肯定是校驗不過的啊,
####
雙向認證解決辦法:
客戶端校驗,仍然使用SSL unPinning方法,也就是客戶端強制不校驗這個ssl證書,強制通過,
服務端校驗,需把APP里的證書導入到代理抓包軟件中,讓代理抓包工具使用真實的APP證書。charles 比較方便配置
示例:soul
####
如何找到APP里的證書?
反編譯APP 在assert文件夾里有.p12 .pem之類文件cer ssl
反編譯后,在源代碼里大量搜索
Hook 監聽Assert文件夾 知道讀了哪些文件
可能有密碼 Hook java.security.KeyStore 查看密碼
###
然后把證書在Charles配置一下,
###
通常有上面三個手段,只要是走應用層的,就可以把大部分抓不到包的問題都解決了,
###
APP抓包相對繁瑣,越來越多的 APP 在 https 請求和響應時,為了防止中間人攻擊(或中間人抓包),會做證書認證,讓抓包工具抓不到請求。
證書認證分單向認證和雙向認證,雙向認證是相較於單向認證而言的,單向認證就是只在 APP 側做證書校驗,單向認證有現成的解決方法,比如用各種 bypass ssl 校驗的 hook 腳本既可讓單向認證失效,例如:JustTrustMe 。如果 APP 的網絡請求庫有混淆,上述 bypass ssl 腳本無效,也有開源作者開發了自適配的 bypass 程序,可以 hook 混淆后的網絡庫。比如:JustMePlush 。 簡單說了下單向認證如何解決,
開始說雙向認證如何解決。
雙向認證除了要在 APP 側做證書校驗外, 對方服務端還要做證書校驗。對方服務端是要檢測證書的,不提交真正的證書給服務端,肯定會請求失敗。
雙向認證抓包有兩種解決方法:
一是:按照搞定證書的思路去想的話,就是要想辦法拿到真正的證書。
二是:Hook SSL 對數據解密數據的地方。
方法一: 因為 APP 能正常跟服務端通信,所以真正的證書肯定是在 APP 里面。所以就是要想辦法從 APP 里摳出證書。摳證書有開源的 Frida Hook 腳本。如下地址是開源作者寫的 Frida Hook 腳本 https://gist.github.com/ceres- c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg 可以把證書從內存里讀出來保存到本地,並且證書密碼也能讀出來,非常的方便。 該腳本的原理是: 因為 APP 在向服務端發請求時, APP 肯定會操作證書,所以如果能找到 APP 操作證書的代碼地方, Hook 這部分代碼,對參數做些輸出打印,證書和證書密碼就都有了。 大部分情況下,我們不用非常熟悉安卓原理,比如安卓在代碼層面是如何操作證書的(當然熟悉更好)。因為資訊發達,一般靈活借助搜索引擎,靈活查閱資料,可以大體知道這些,就可以嘗試去寫 Hook 腳本去嘗試看看。 查閱資料可以知道,安卓操作證書通常是 java.security.KeyStore 這個類,然后再了解下這個類的用法,參數形式。就可以嘗試去 Hook 了。上述腳本就是 Hook java.security.KeyStore 這個類的 load 方法,load 方法的形參就是我們需要的證書和密碼。 摳出的證書和密碼,配置進 fiddler 或 charles 里面,就可以抓到雙向認證的包。 PS: 還要注意證書的格式,摳出的證書可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先轉換一下格式。
方法二: 如果只是想抓包,還有另一種方法,不需要摳證書的方法。雖然 https 在傳輸過程中是加密的,但在終端顯示的時候,必然會解密,不然 APP 上都沒法顯示了。所以如果能知道安卓解密 SSL 加解密是哪個類, Hook 這個類, 類里相關方法的輸入輸出肯定就是傳輸的明文數據。 所以可以查閱資料,看看相關類的用法,就可以嘗試去 Hook 打印輸出看看情況。
也有開源作者開源了該 Hook 腳本, 比如 5alt 老板在google開源的腳本基礎上做了修改了的 ssl_logger 。 https://github.com/5alt/ssl_logger 能夠 Hook SSL 加解密的地方,它會把傳輸的數據保存為 pcap 格式。再使用 wireshark 打開該 pcap文件, 在 wireshark 上就可以看到明文的數據了。 如果要模擬向服務器發送請求的話,還是只能使用第一種方法,因為客服端必須要提交正確的證書,服務端才會正確響應。必須得摳出證書,模擬請求時必須帶上證書,才能請求到數據。安卓上的證書好多是 jks/bks格式的, 如果使用 Python requests 庫的話, 不支持這個格式, 所以要想辦法把證書轉成 cert 格式的。 上面兩種方法都是使用 Frida 進行 Hook ,所以要有 Root 過的手機和明白Frida 怎么使用就能搞定。
對於爬蟲來說,搞定抓包和請求參數加密的問題,大部分 Hook ,都可以通過 Hook 安卓系統 API 來找到 APP 代碼位置,或直接搞定。其實很少人能很熟悉安卓系統的各種原理,大部分時候能靈活通過各種關鍵字能查到相關原理的講解文獻,文獻里講的 API 靈活點拿去 Hook 康康線索,就能搞定很多拉。 其實使用雙向認證的 APP 還是少數, 對服務器性能多少有影響。
####
代理抓不到包的第四種,沒有走應用層-----了解
socket通信是IP層,fiddler/charles抓不到,用wireshark抓包 在網卡混雜模式里講wireshark
比如PC QQ
解析socket通信數據麻煩,要分析APP協議解析部分
代理抓不到包的第五種,私有協議----了解
這種不是通用的協議,
wireshark能抓到,不知道協議細節,解不了包。
需要分析APP協議解析部分
##
第二種抓包:網卡混雜抓包--了解
2,網卡混雜抓包,webshark,這個能抓傳輸層,和應用層,但是一般不用這個軟件太重了,
第三種抓包:路由器抓包--了解
3,路由器抓包,網絡組網方式,因為所有的流量都要從路由器過,使用特殊的路由器,可以進行路由器抓包,
公司有的老板,監控每一個員工的訪問記錄,就是路由器可以監控每一個機器的訪問記錄
這個也沒有什么可將的,你去買一個有這個功能的路由器就可以了,
第四種抓包:hook域名--了解
4,hook域名,把https改成http,
5,hook網絡請求庫,比如request,
這種hook的抓包就比較麻煩了,了解一下有這種方式,但是不做為掌握,
####
注意:
1.安卓7.0(包括7.0)以后,安卓系統不再信任用戶安裝的證書。(例如 fiddler/charles的代理抓包證書) mumu模擬器
解決7.0以后用戶證書不信任問題兩種方法:
(1)root手機,把代理證書放到系統證書根目錄下
用戶CA證書目錄
/data/misc/user/0/cacerts-added
系統CA證書目錄
/system/etc/security/cacerts
問題:
有的手機root /system 分區是只能讀 仍然不能把證書放到系統根目錄, 比如魅族pro5
df 命令
mount -o rw,remount /system
(2) hook 系統方法,強行讓系統信任用戶證書:
比如:使用xposed框架的justtrustme模塊 和 frida的DroidSSLUnpinning
####
tricks:
1.優先使用安卓系統低版本抓包
優先使用安卓4.0 5.0 6.0抓包
2.優先使用APP低版本抓包
比如微信7.0以下 在安卓4.0-6.0上 容易抓包微信小程序
優先使用能用的APP最低版本
所以工具充分准備,
各種抓包工具都准備好,fiddler,Charles,wirsshark,
各種模擬器都安裝一下,夜神,mumu,雷電,4.0 5.0 6.0
各種手機都准備一下,安卓4.0 5.0 6.0 7.0 root過的,還有蘋果手機,
沒有必要因為一個抓包非要搞定一個高版本的app,我們只是要數據,不是要對抗新版本,
###
####