有一些安卓App在進行分析的時候,發現常用的系統代理連接好后,該App就無法正常使用,或是常用的抓包工具Fiddler、Charles等無效。比如支付寶、微博等App就是這樣的情況。下面就來闡述一下無法使用的原因及解決方案。
原理
若不想了解可以直接跳到下文的解決方案處。
當客戶端想要完成一次HTTP請求的時候,首先要根據請求中的URL通過DNS找到服務器,然后與服務器經過三次握手建立TCP連接。建立連接后客戶端會將HTTP報文發送給服務器。
我們在啟動Fiddler或是Charles時,該軟件會自動設置一個系統代理指向自身,從而完成數據包的抓取工作。使用Windows時可以自動設置系統代理,使用Linux可以通過設置環境變量的方式來設置代理,而手機就是在連接網絡的時候手動改指定代理服務器的信息。當系統設置代理后,各類應用在發送請求的時候就不再是直接通過DNS然后連接服務器,而是首先連接系統指定的代理服務器,隨后代理服務器再根據請求去連接真正的服務器。只有這樣,代理服務器才能隨意的進行HTTP包的截獲、修改甚至進行“中間人攻擊”來解密https包。
而部分應用在遇到系統設置的代理的時候,直接繞過代理直接發送請求或是直接報錯。這樣的后果就是要么App無法連接網絡,要么Fiddler等軟件無法正常抓包。
解決方案
解決方案就是利用一些手段,強制的讓這些App走到代理服務器就可以了。
方法有好多種:
①修改Hosts,直接控制DNS解析,欺騙App認為我們的服務器就是他需要到達的服務器。這樣做的話缺點就是針對每個域名都要提前設置好,比較繁瑣。再有就是移動設備上十分不容易操作。
②建立一個新的網絡,將其中特定設備的流量轉發到代理服務器上。優點是對於設備不需要特殊的配置,直接在網絡設備上配置即可。缺點就是需要專門的網絡設備,配置過程一樣較為繁瑣。
③利用VPN將終端的流量轉發到代理服務器上。這種方法的優勢是操作較便捷,缺點就是VPN一般針對於全部軟件的流量進行轉發,配置不當數據量會很恐怖。
綜合考慮,這里我們就選用方案③。
這次操作中,使用的是一台root過的安卓設備(因為要解密https流量需要在系統證書區安裝Fiddler根證書,只有root后或刷有第三方recovery的設備才可以。至於為什么需要安裝根證書,詳見中間人攻擊原理),需要的軟件是Fiddler和Drony。
安裝Fiddler根證書到系統證書區
首先在Fiddler中導出根證書。Tools->Options,選擇HTTPS選項卡,在右側Actions按鈕上點一下,然后選擇Export Root Certificate to Desktop,即導出根證書到桌面。在此例中導出的文件名稱是FiddlerRoot.cer。
然后利用openssl工具計算證書的Hash值,給證書改名。為確保安全,Android系統的系統證書區里面的證書都是以Hash值為名稱。
openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer
將輸出中類似269953fb這樣的字符串復制,將FiddlerRoot.cer改名為hash.0,就像本例中改為“269953fb.0”(去掉引號)。擴展名中的0是防止證書Hash碰撞,概率極低。
改名把改好名的證書放到Android設備/system/etc/security/cacerts目錄中,重啟手機即可生效。可以在手機的系統證書區看到Fiddler根證書的相關信息。
配置Drony
Drony是一款代理軟件。安裝在手機上后打開。滑動上方選項卡,選擇設置(Settings),首先點選網絡中的無線網絡。
然后選擇自己連接的WiFi。點擊進入。
然后在選項中首先設置代理類型為手動(Proxy Type->Manual),主機名和端口填寫局域網中Fiddler主機的IP和Fiddler的端口。(注意,Fiddler軟件中Connection選項卡里面的允許遠程網絡連接選項務必打開!否則無論如何是連接不上的。)
向下翻,代理類型選擇普通http代理。(Proxy Type->Plain http proxy)
繼續下翻,過濾默認值選擇允許全部(Filter default value->Direct all),然后點擊規則(Rules)。
默認的規則里面應該是空的。點擊右上角加號新建一個規則。(即單獨針對某一個App進行代理轉發。)
網絡ID(Network ID)處確認是正確的WiFi名稱。行動(Action)選擇本地代理鏈全部(local proxy chain),應用就選擇想要轉發包的應用。剩下的無需填寫。填寫好后點擊右上角存盤。
然后返回到主頁,點擊下方“關”按鈕開啟。該按鈕上的文字代表程序狀態,顯示“開”就是代表代理已開。
現在就可以打開待抓包的應用了,發現應用使用正常,http包也已經正常出現,https包也成功解密。