Android 7.0+使用VirtualXposed+Charles進行抓包


本文首發於“合天智匯”公眾號 作者:yunen
前言
最近在對一個app進行測試的時候,嘗試抓取數據包,發現以前的使用方法失效了,原因是隨着安卓版本的提高,對證書的限制越發嚴格,而我身邊的老機子放在學,不在身邊,沒得辦法,只好研究一下怎么繞過這種限制。
經過一方查找,終於發現了一個相對比較簡單的辦法,這里就開一篇文章,記錄一下。
過程
首先下載所需要的工具:
  • Charles——https://www.charlesproxy.com/download/
  • Charles-Crack(有能力的同學請支持正版)——https://github.com/8enet/Charles-Crack
  • VirtualXposed——https://github.com/android-hacker/VirtualXposed/releases
  • TrustMeAlready——https://github.com/ViRb3/TrustMeAlready/releases
PC端
PC端下載並安裝好之后,運行Charles。
依次點擊菜單欄的:Proxy→Proxy Settings,並按如下進行勾選。
接着點擊菜單欄:Proxy→SSL Proxying Settings
按照下圖進行配置:
若事先確定要抓取的Host和Port信息,可自行進行更改。
接着點擊Proxy→Windows Proxy (注:不同版本名稱不同),將不再抓取本地流量。
然后點擊Help→SSL Proxying→Install Charles Root Certificate on a Mobile Device or Remote Browser,將證書掛載到chls.pro/ssl這個地址上。
手機端用瀏覽器打開上述地址,將證書下載到本地。這步也可以選擇點擊菜單欄:Help→SSL Proxying→Save Charles Root Certificate...,來將證書下載到PC,通過數據線、QQ等方法傳到手機。
手機端
首先需要把手機與電腦連接到同一個網絡內。
打開WLAN,選擇對應的WIFI,進行代理配置。如下圖所示:
主機名為PC端的內網IP,端口為配置Charles時Proxy Settings配置中的Http Proxy里的Port內容。
PC端內容不清楚的同學可以打開終端運行如下命令:
  • Windows: ipconfig
  • Linux: ifconfig
  • Mac: ifconfig
成功代理上之后,手機端的流量都會經過PC端的Charles。如果是第一次配置,則Charles會彈出一個窗口,提示有新的連接,點擊Allow按鈕。
其次需要將電腦端Charles的證書給安裝上。
若在PC端選擇的是Install Charles Root Certificate on a Mobile Device or Remote Browse,則先需要通過手機瀏覽器訪問chls.pro/ssl這個網址獲得證書文件。
這里我使用的手機為小米8 Lite,不同的手機品牌/型號安裝證書的方法可能有所不同,具體可通過搜索引擎來獲得安裝的方法。
依次點擊:設置→更多設置→系統安全→加密與憑據→從SD卡安裝,接着在文件瀏覽器中選擇你下載好的證書。
然后給證書憑據起個名字,可隨意填寫,憑據用途選擇VPN和應用
安裝完畢后依次點擊:信任的憑證→用戶,即可查看到剛剛添加進來的Charles證書——XK72 Ltd
以往我們只需要執行到這里,便可以成功抓取到數據包。不過由於Android的版本更新,對用戶自身添加的證書進行了限制,導致我們直接地無法抓取的HTTPS數據包,在Charles里會發現HTTPS的流量都顯示Unknown。
這里我選擇的辦法是用VirtualXposed工具進行繞過,如果你不想使用這個方法,也可以考慮通過將手機進行Root處理,並將Charles的證書添加到系統級的證書中,不過這並不在本文討論的范疇。
手機下載好VirtualXposed和TrustMeAlready兩個apk文件,安裝VirtualXposed.apk之后運行。
在VirtualXposed中,先進入設置頁面,點擊添加應用,選擇你想抓取流量的應用,以及TrustMeAlready.apk文件進行安裝。注意:由於TrustMeAlready.apk未安裝,需要點擊+號按鈕,在對應的目錄選擇apk文件即可。
然后再回到設置頁面,點擊模塊管理,可以看到我們剛剛添加的TrustMeAlready便在其中,點擊右邊的框框進行勾選,接着回到設置頁面,在最下方點擊重啟、確定。
到這里我們便已經完成了全部的操作,之后你可以在VirtualXposed框架內打開任意的app都可以成功取到HTTPS流量。
關於Charles的使用方法,本文不再贅述,網絡上已有許多教程,稍微花點時間搜索即可。
分析
Android7.0+為何無法直接截取HTTPS流量
在Android開發者平台文檔,我們可以查到這么一段話:
默認情況下,來自所有應用的安全連接(使用 TLS 和 HTTPS 之類的協議)均信任預裝的系統 CA,而面向 Android 6.0(API 級別 23)及更低版本的應用默認情況下還會信任用戶添加的 CA 存儲區。應用可以使用 base-config(應用范圍的自定義)或 domain-config(網域范圍的自定義)自定義自己的連接。 自定義可信 CA|Android Developer
以上說明了安卓6.0以上的版本,在默認情況下應用是不會相信用戶添加的CA證書,導致我們使用老方法無法完整地獲取到應用發出的HTTPS數據。
VirtualXposed+TrustMeAlready實現原理
簡單的說,VXP相當於手機上的虛擬機,在手機原有的系統上創建一塊虛擬空間,類似沙盒般的效果,而通過TrustMeAlready插件,便可HOOK到 APK 中所有用於校驗 SSL 證書的 API (詳情可以點擊參考里的《JustTrustMe原理分析》),從而繞過證書校驗,故此達到https抓包的效果。
一、什么是Virtual Xposed? Xposed 眾所周知Xposed是來自國外XDA論壇的rovo89開發的一款開源的安卓系統框架。 它是一款特殊的安卓App,其主要功能是提供一個新的應用平台,玩家們安裝Xposed框架后,就能夠通過Xposed框架搭建起的平台安裝更多系統級的應用,實現諸多神奇的功能。 Xposed框架的原理是修改系統文件,替換了/system/bin/app_process可執行文件,在啟動Zygote時加載額外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),並執行一些初始化操作(執行XposedBridge的main方法)。然后我們就可以在這個Zygote上下文中進行某些hook操作。 Xposed真正強大的是它可以hook調用的方法.當你反編譯修改apk時,你可以在里面插入xposed的命令,於是你就可以在方法調用前后注入自己的代碼. Github開源地址: https://github.com/rovo89/Xposed 由於Xposed最大的弊端在於設備需要root,並且編寫插件模塊后需要重啟手機(當然也有辦法可以不用重啟),所以有了VirtualApp。 VirtualApp VirtualApp是一個App虛擬化引擎(簡稱VA)。 VirtualApp在你的App內創建一個虛擬空間(構造了一個虛擬的systemserver),你可以在虛擬空間內任意的安裝、啟動和卸載APK,這一切都與外部隔離,如同一個沙盒。 運行在VA中的APK無需在外部安裝,即VA支持免安裝運行APK。 熟悉android系統開機流程的應該知道各services是由system server啟動一系列的系統核心服務(AMS,WMS,PMS等等)ViratualApp就是構建了一個虛擬system_process進程,這里面也有一系列的核心服務。 VirtualApp主要技術用到了反射和動態代理來實現的 Github開源地址:https://github.com/asLody/VirtualApp VirtualXposed VirtualXposed就是基於VirtualApp和epic 在非ROOT環境下運行Xposed模塊的實現(支持5.0~8.1)。 Github開源地址:https://github.com/android-hacker/VirtualXposed 來源:http://jackzhang.info/2018/04/09/VirtualXposed/
HTTPS抓包為何需要安裝抓包工具的CA證書
為了弄清楚這個問題,我們首先得清楚SSL/TLS加密的原理。
通常來說,SSL與TLS都是非對稱加密的,有一個公鑰與私鑰。公鑰是公開的,私鑰是私密的,存在於服務端。服務器返回的內容會被私鑰加密,客戶端需要使用公鑰進行解密。同樣的,用戶端的數據便有公鑰加密,私鑰來解密。
而我們都知道,使用了SSL之后我們便可以保護我們的站點免受中間人攻擊。那又何為中間人攻擊呢?
舉個例子,用戶A要使用電腦訪問網站http://example.com,而這台電腦已被攻擊者B攻陷,那么攻擊者B可通過修改A電腦上的hosts文件,將example.com的解析指向B自己的服務器,這樣A用戶就在”不知情“的情況下中了招。而如果該網站使用了SSL/TLS加密時,用戶A在訪問https://example.com的時候,需要向服務器請求公鑰的內容,又因為公鑰是放在CA證書里的,且CA證書通常是由相關的權威CA機構(權威性由微軟等操作系統巨頭決定)才能發布,類似我們的民政局才能發布身份證。這使得攻擊者無法偽造CA證書,因為客戶端在收到CA證書之后會根據不同的權威CA機構進行相應的驗證,而若頒發該證書的機構不夠權威(這使得權威機構也不會隨意頒發CA證書,以免自身的權威性被取消),是不會被系統所信任的。這一連串的操作,使得使用了SSL/TLS的網站可以不受中間人攻擊的影響。
OK回歸正題,那這HTTPS抓包與中間人攻擊有何關系呢?其實這兩者的原理都是一樣的,只不過攻擊者的角色變成了抓包工具。
So,這次的問題就變成了中間人攻擊如何在HTTPS通信中生效?
我們注意到,中間人攻擊的最大難點就在於CA證書的權威性,而我們在沒有域名解析權的情況下是不能去向權威CA機構申請證書的。那么既然如此,為何我們不考慮自己“開”一家權威機構呢,這樣我們生成的證書不就會被信任了嘛。
這時候,就得需要安裝我們抓包工具的CA證書了,這個證書與域名所有者向權威機構申請的證書不同,他是根證書。
因為域名的CA證書的驗證過程也是非對稱加密驗證,也就說,CA證書的驗證是由根證書里的公鑰來解密驗證的。通常操作系統里已經默認信任了一批權威機構的根證書。
所以,當我們把我們自己的根證書添加到操作系統中時,相當於我們自己“開”了一家權威CA機構,這樣便可以解決了之前的難題。
借一張網圖:
結語
別看上邊方法好像挺簡單的,實際操作起來卻挺繁瑣,網絡上的方法大多抄來吵去且時效性很差,導致在操作過程中也走了許多彎路,許多東西還是自己實驗之后才知道。看似簡單的東西,其實寫起來可學習的東西還是很多的,以前自己在學習的時候沒有注意的點,現在看起來也是可以細細研究的。不驕不躁,Stay Hungry, Stay Foolish.
參考
聲明:筆者初衷用於分享與普及網絡知識,若讀者因此作出任何危害網絡安全行為后果自負,與合天智匯及原作者無關!


免責聲明!

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



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