APP测试之安全机制问题及Bypass
APP測試之安全機制問題及Bypass
前言
? 在一次APP漏洞挖掘的過程中又遇到了之前都會遇到的一個問題今天來討論一下APP安全滲透測試及漏洞挖掘中遇到的這個問題并進行一些總結,其中有一些方法之前也有許多師傅分享過,這里再次遇到正好想歸結到一起,若對移動APP安全機制繞過有興趣的師傅也能夠一起交流或加以補充。
? 相信也會有很多師傅在挖掘漏洞中遇到以下的幾種令人抓頭的場景:
等等。
一般情況下在對APP測試時burp抓包需要配置代理和下載安裝burp的客戶端證書才可以正常的進行下一步測試,但是在HTTPS信任機制和APK自有的安全機制下測試時或許就不是那么容易了,經常會出現網絡錯誤、抓不到包、丟包,無法正常發送請求等情況。主要可以歸結為:IOS/安卓系統的固有的信任機制問題,另一方面是APK的SSL證書的綁定、SSL證書雙向校驗和代理檢測問題。
系統固有的信任機制
IOS設備上測試
雖然安裝了burp證書但是你會發現有https的數據包仍然無法抓到,仔細深究其實還是信任機制的問題,默認情況下ios系統不會對第三方安裝的證書開啟完全信任,由此就導致了雖然安裝了證書但還是無法抓到https的包。
默認情況下IOS設備的對安裝的根證書的完全信任是處于關閉狀態,所以要解決以上問題,還需要將該設置為完全信任。
設置好后就可以正常抓包了。
如果前面都沒問題排除了系統固有的信任機制問題還是無法正常抓到包這種情況下一般就屬于第二種可能了----APK自有的安全機制
APK的安全機制
https協議驗證服務器身份的方式通常有三種,一是根據瀏覽器或者說操作系統(Android)自帶的證書鏈;二是使用自簽名證書;三是自簽名證書加上SSL Pinning特性,所謂SSL pinning即證書綁定。
另外一種是雙向認證,客戶端與服務端分別存放不同的證書,客戶端在通訊時會校驗服務端的證書的一致性,反之,服務端在建立通訊前也要驗證客戶端證書的一致性,驗證皆無問題后才建立通訊。
SSL pinning
? 一般情況下,關于SSL Pinning的反制,主要有兩種辦法,第一種是反編譯APP文件,篡改內部證書信息。涉及到逆向,調試,重簽名等技術,如果客戶端存在殼保護、混淆、完整性自校驗等防護則無法進行替換。
? 第二種是利用了Hook技術。Hook就是一個函數鉤子,把程序原本要調用的函數改成另一個函數,就是對原函數的一個掛鉤(hook) 。比如,客戶端使用方法hostnameVerifier.verify、checkServerTrusted和checkClientTrusted對證書進行了校驗,證書不對則拋出異常,停止加載頁面并結束通訊。只需要Hook 證書校驗失敗的處理方法,讓其繼續加載頁面并保持通訊即可。具體的SSL Pinning的反制,主要以Xposed框架和Frida框架進行Hook關鍵函數,從而進行數據包的截取。
針對以上情況可以總結了以下幾種的具體繞過方式
1)反編譯apk,得到源碼編輯應用程序的Manifest文件,修改 AndroidManifest.xml,重新打包
apk反編譯及打包
反編譯
apktool.bat d -f test.apk -o test apktool -f [待反編譯的apk] -o [反編譯之后存放文件夾]
打包
apktool.bat b test
**java -jar .apktool_2.3.0.jar b . est**
簽名
java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk
ps:簽名文件:android/build/target/product/security/
2)用自定義的CA覆蓋應用程序原本的CA
3)反編譯提取APK文件,注入動態庫和通過Objection工具【項目地址】
也可參考roysue師傅的一篇文章實用FRIDA進階
4)hook證書驗證函數設置鉤子--針對自定義證書的驗證代碼
詳情針對這四種的方法有位大佬做了詳細的介紹可參考繞過安卓SSL驗證證書的四種方式
除了以上修改apk驗證證書邏輯重新打包的方式外,還有一種最簡單的方法是使用xposed相關模塊。Xposed+JustTrustMe來進行繞過。使用方法網上也已經有師傅研究過了具體可以參考還有https://www.jianshu.com/p/a818a0d0aa9f
代理檢測
客戶端內置代理
有些APP內置了指定代理,導致開著抓包工具也無法正常抓到包。
private void N(){
Address v0=this.g();
if(v0!=null){
if(this.e.b().d())
n.a(v0.getHost(),v0.getPort());
}
this.f();
}
解決:
1)直接設置代理為自己指定的代理。
比如
const v0,0x22b8 sonst-string v1,"192.168.0.101"http://設置為自己的代理,PORT:0x22b8=8888,IP:192.168.0.101
2)hook "system.setproperty" 設置代理到本地
//設置代理
System.setProperty("http.proxySet","true");
System.setProperty("http.proxyHost","10.1.1.199");
System.setProperty("http.proxyPort","80");
客戶端檢測是否開啟代理
比如APP存在對代理的檢測的代碼,當存在代理檢測時,這個數據包并不會通過代理發送出去。修改smail代碼繞過,或者nop掉檢測方法。
代碼:
private boolean isWifiProxy() {
final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
String proxyAddress;
int proxyPort;
if (IS_ICS_OR_LATER) {
proxyAddress = System.getProperty("http.proxyHost");
String portStr = System.getProperty("http.proxyPort");
proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
} else {
proxyAddress = android.net.Proxy.getHost(this);
proxyPort = android.net.Proxy.getPort(this);
}
return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}
SSL 雙向校驗
問題:可攔截到包但返回異常
解決方式:bypass 雙向校驗
做了雙向驗證的apk,一般反編譯后在APK的assets中就可以找到客戶端證書.p12和.cer的文件,而在服務端和客戶端進行正常通信就需要在服務端也安裝p12證書,但導入時會需要一個證書密碼,一般可以通過靜態分析代碼,搜索KeyStore或者 逆向分析客戶端的.p12來找到密碼。
Sign
sign的繞過并不大了解,但是按照常規套路,就是反編譯之后搜索sign/signature相關字符串,然后找到加密算法的地方,摳出來分析,再hook掉,比如系統的java.security.Signature這個接口,直接讓系統獲取的簽名永遠返回true,這樣就繞過了app的簽名校驗了。
利用xposed可以:
public void initZygote(StartupParam startupParam) throws Throwable {
XposedHelpers.findAndHookMethod("java.security.Signature",null,"verify", byte[].class,new XC_MethodHook(){
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("disabled verifysignature......");
param.setResult(Boolean.TRUE);
}
});
來繞過app的簽名校驗。有大佬師傅github給出了一鍵繞過App簽名驗證的工具,https://github.com/xxxyanchenxxx/SigKill,但是本人也沒有測試過,不知道有沒師傅用過。
參考:
https://xz.aliyun.com/t/6558
https://www.anquanke.com/post/id/200911
https://www.anquanke.com/post/id/200911
https://www.jianshu.com/p/a818a0d0aa9f
http://z-gelen.com/index.php/archives/68/
總結
以上是生活随笔為你收集整理的APP测试之安全机制问题及Bypass的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Msm 高通平台配置记录之一
- 下一篇: 《魔兽世界怀旧服》正义之手怎么样 正义之