APP测试之安全机制问题及Bypass
APP測試之安全機(jī)制問題及Bypass
前言
? 在一次APP漏洞挖掘的過程中又遇到了之前都會(huì)遇到的一個(gè)問題今天來討論一下APP安全滲透測試及漏洞挖掘中遇到的這個(gè)問題并進(jìn)行一些總結(jié),其中有一些方法之前也有許多師傅分享過,這里再次遇到正好想歸結(jié)到一起,若對移動(dòng)APP安全機(jī)制繞過有興趣的師傅也能夠一起交流或加以補(bǔ)充。
? 相信也會(huì)有很多師傅在挖掘漏洞中遇到以下的幾種令人抓頭的場景:
等等。
一般情況下在對APP測試時(shí)burp抓包需要配置代理和下載安裝burp的客戶端證書才可以正常的進(jìn)行下一步測試,但是在HTTPS信任機(jī)制和APK自有的安全機(jī)制下測試時(shí)或許就不是那么容易了,經(jīng)常會(huì)出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤、抓不到包、丟包,無法正常發(fā)送請求等情況。主要可以歸結(jié)為:IOS/安卓系統(tǒng)的固有的信任機(jī)制問題,另一方面是APK的SSL證書的綁定、SSL證書雙向校驗(yàn)和代理檢測問題。
系統(tǒng)固有的信任機(jī)制
IOS設(shè)備上測試
雖然安裝了burp證書但是你會(huì)發(fā)現(xiàn)有https的數(shù)據(jù)包仍然無法抓到,仔細(xì)深究其實(shí)還是信任機(jī)制的問題,默認(rèn)情況下ios系統(tǒng)不會(huì)對第三方安裝的證書開啟完全信任,由此就導(dǎo)致了雖然安裝了證書但還是無法抓到https的包。
默認(rèn)情況下IOS設(shè)備的對安裝的根證書的完全信任是處于關(guān)閉狀態(tài),所以要解決以上問題,還需要將該設(shè)置為完全信任。
設(shè)置好后就可以正常抓包了。
如果前面都沒問題排除了系統(tǒng)固有的信任機(jī)制問題還是無法正常抓到包這種情況下一般就屬于第二種可能了----APK自有的安全機(jī)制
APK的安全機(jī)制
https協(xié)議驗(yàn)證服務(wù)器身份的方式通常有三種,一是根據(jù)瀏覽器或者說操作系統(tǒng)(Android)自帶的證書鏈;二是使用自簽名證書;三是自簽名證書加上SSL Pinning特性,所謂SSL pinning即證書綁定。
另外一種是雙向認(rèn)證,客戶端與服務(wù)端分別存放不同的證書,客戶端在通訊時(shí)會(huì)校驗(yàn)服務(wù)端的證書的一致性,反之,服務(wù)端在建立通訊前也要驗(yàn)證客戶端證書的一致性,驗(yàn)證皆無問題后才建立通訊。
SSL pinning
? 一般情況下,關(guān)于SSL Pinning的反制,主要有兩種辦法,第一種是反編譯APP文件,篡改內(nèi)部證書信息。涉及到逆向,調(diào)試,重簽名等技術(shù),如果客戶端存在殼保護(hù)、混淆、完整性自校驗(yàn)等防護(hù)則無法進(jìn)行替換。
? 第二種是利用了Hook技術(shù)。Hook就是一個(gè)函數(shù)鉤子,把程序原本要調(diào)用的函數(shù)改成另一個(gè)函數(shù),就是對原函數(shù)的一個(gè)掛鉤(hook) 。比如,客戶端使用方法hostnameVerifier.verify、checkServerTrusted和checkClientTrusted對證書進(jìn)行了校驗(yàn),證書不對則拋出異常,停止加載頁面并結(jié)束通訊。只需要Hook 證書校驗(yàn)失敗的處理方法,讓其繼續(xù)加載頁面并保持通訊即可。具體的SSL Pinning的反制,主要以Xposed框架和Frida框架進(jìn)行Hook關(guān)鍵函數(shù),從而進(jìn)行數(shù)據(jù)包的截取。
針對以上情況可以總結(jié)了以下幾種的具體繞過方式
1)反編譯apk,得到源碼編輯應(yīng)用程序的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覆蓋應(yīng)用程序原本的CA
3)反編譯提取APK文件,注入動(dòng)態(tài)庫和通過Objection工具【項(xiàng)目地址】
也可參考roysue師傅的一篇文章實(shí)用FRIDA進(jìn)階
4)hook證書驗(yàn)證函數(shù)設(shè)置鉤子--針對自定義證書的驗(yàn)證代碼
詳情針對這四種的方法有位大佬做了詳細(xì)的介紹可參考繞過安卓SSL驗(yàn)證證書的四種方式
除了以上修改apk驗(yàn)證證書邏輯重新打包的方式外,還有一種最簡單的方法是使用xposed相關(guān)模塊。Xposed+JustTrustMe來進(jìn)行繞過。使用方法網(wǎng)上也已經(jīng)有師傅研究過了具體可以參考還有https://www.jianshu.com/p/a818a0d0aa9f
代理檢測
客戶端內(nèi)置代理
有些APP內(nèi)置了指定代理,導(dǎo)致開著抓包工具也無法正常抓到包。
private void N(){
Address v0=this.g();
if(v0!=null){
if(this.e.b().d())
n.a(v0.getHost(),v0.getPort());
}
this.f();
}
解決:
1)直接設(shè)置代理為自己指定的代理。
比如
const v0,0x22b8 sonst-string v1,"192.168.0.101"http://設(shè)置為自己的代理,PORT:0x22b8=8888,IP:192.168.0.101
2)hook "system.setproperty" 設(shè)置代理到本地
//設(shè)置代理
System.setProperty("http.proxySet","true");
System.setProperty("http.proxyHost","10.1.1.199");
System.setProperty("http.proxyPort","80");
客戶端檢測是否開啟代理
比如APP存在對代理的檢測的代碼,當(dāng)存在代理檢測時(shí),這個(gè)數(shù)據(jù)包并不會(huì)通過代理發(fā)送出去。修改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 雙向校驗(yàn)
問題:可攔截到包但返回異常
解決方式:bypass 雙向校驗(yàn)
做了雙向驗(yàn)證的apk,一般反編譯后在APK的assets中就可以找到客戶端證書.p12和.cer的文件,而在服務(wù)端和客戶端進(jìn)行正常通信就需要在服務(wù)端也安裝p12證書,但導(dǎo)入時(shí)會(huì)需要一個(gè)證書密碼,一般可以通過靜態(tài)分析代碼,搜索KeyStore或者 逆向分析客戶端的.p12來找到密碼。
Sign
sign的繞過并不大了解,但是按照常規(guī)套路,就是反編譯之后搜索sign/signature相關(guān)字符串,然后找到加密算法的地方,摳出來分析,再hook掉,比如系統(tǒng)的java.security.Signature這個(gè)接口,直接讓系統(tǒng)獲取的簽名永遠(yuǎn)返回true,這樣就繞過了app的簽名校驗(yàn)了。
利用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的簽名校驗(yàn)。有大佬師傅github給出了一鍵繞過App簽名驗(yàn)證的工具,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/
總結(jié)
以上是生活随笔為你收集整理的APP测试之安全机制问题及Bypass的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Msm 高通平台配置记录之一
- 下一篇: java 字节码分析_手把手带你分析Ja