首页 > 其他分享 >【Android 抓包对抗】客户端证书和域名校验绕过

【Android 抓包对抗】客户端证书和域名校验绕过

时间:2023-03-09 16:58:41浏览次数:52  
标签:return 校验 ssl var Java Android null net 抓包

1. 按照之前的方式(https://www.cnblogs.com/gradyblog/p/17197707.html)进行抓包发现证书校验失败

SSL handshake with client failed: An unknown issue occurred processing the certificate (certificate_unknown)

2. apk拖入到jadx中查看

private static OkHttpClient getClient() {
        OkHttpClient okHttpClient = client;
        if (okHttpClient == null) {
            try {
                Certificate generateCertificate = CertificateFactory.getInstance("X509").generateCertificate(in_cer);
                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                keyStore.load(null, null);
                keyStore.setCertificateEntry("wallpaper", generateCertificate);
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                trustManagerFactory.init(keyStore);
                TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
                SSLContext sSLContext = SSLContext.getInstance("TLS");
                sSLContext.init(null, trustManagers, null);
                SSLSocketFactory socketFactory = sSLContext.getSocketFactory();
                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(socketFactory, (X509TrustManager) trustManagers[0]);
                builder.hostnameVerifier(new HostnameVerifier() { // from class: com.dta.dtawallpaper.util.OkHttpUtil.1
                    @Override // javax.net.ssl.HostnameVerifier
                    public boolean verify(String str, SSLSession sSLSession) {
                        return str.equals("www.dtasecurity.cn");
                    }
                });
......
                return builder.build();
            } catch (Exception unused) {
                return null;
            }
        }
        return okHttpClient;
    }

从这里可以看出进行了 客户端证书的校验,和Hostname的校验,就防止了中间人转发的问题,但这也不是问题

2. 编写frida脚本绕过

function main(){
    Java.perform(function (){
 
        //TrustAllManager
        var TrustAllManagerClass = Java.registerClass({
            name: "TrustAllManager",
            implements:[Java.use("javax.net.ssl.X509TrustManager")],
            methods: {
                checkClientTrusted(chain, authType) {
                    console.log("checkClientTrusted Called!!")
                },
                checkServerTrusted(chain, authType) {
                    console.log("checkServerTrusted Called!!")
                },
                getAcceptedIssuers() {
                  return [];
                },
              }
        })
        var trustAllManagerHandle = TrustAllManagerClass.$new()
 
        var sslContext = Java.use("javax.net.ssl.SSLContext").getInstance("TLS")
        var trustManagers = Java.array("Ljavax.net.ssl.X509TrustManager;",[trustAllManagerHandle])
        sslContext.init(null,trustManagers,null)
        var sslSocketFactory = sslContext.getSocketFactory()
 
        Java.use("okhttp3.OkHttpClient$Builder").sslSocketFactory.overload('javax.net.ssl.SSLSocketFactory', 'javax.net.ssl.X509TrustManager').implementation = function(arg0, arg1){
            console.log("sslSocketFactory Called!!")
            return this.sslSocketFactory(sslSocketFactory,trustAllManagerHandle)
        }
 
 
        //HostnameVerify
        var MyHostnameVerify = Java.registerClass({
            name: "MyHostnameVerify",
            implements:[Java.use("javax.net.ssl.HostnameVerifier")],
            methods: {
                verify(hostname, session){
                    console.log(hostname)
                    return true
                }
            }
        })
        var myHostnameVerifyHandle = MyHostnameVerify.$new()
 
        Java.use("okhttp3.OkHttpClient$Builder").build.implementation = function(){
            this.hostnameVerifier(myHostnameVerifyHandle)
            console.log(this.hostnameVerifier)
            return this.build()
        }
    })
}
 
setImmediate(main)


这里主要是自定义了TrustAllManager类和HostnameVerifier类,来控制其行为实现绕过

3. 以spawn模式执行,成功抓到https的包

ps 这里遇到了一个小问题,但是本应该不存在的 首先我们要在 (SSL Proxy Settings)中设置好host和port ,比如我设置的是*:443 和 *:10081,但是有一个请求还是没有显示,右键它 选择enable ssl proxying就好了
参考: https://stackoverflow.com/questions/49117151/charles-proxy-ssl-ssl-proxying-not-enabled-for-this-host

标签:return,校验,ssl,var,Java,Android,null,net,抓包
From: https://www.cnblogs.com/gradyblog/p/17199072.html

相关文章

  • Android Studio的各种bug(二)
    1.按钮Button无法改变背景色原因: AndroidStudio4.1之后的版本进行开发时,创建的项目默认的主题所有Button都是Material类型的Button,默认使用主题色,所以想要修改颜色,就要......
  • 云音乐 Android 内存监控探索篇
    小结:1、编码不规范导致的内存异常问题:内存泄露、大对象、大图等不合理的内存使用2、简单来说内存泄露就是某些不再使用的对象被其他生命周期更长的GCRoot直接或者间......
  • Android学习日志
    App工程分为两个层次,第一个层次是项目,另一个层次是模块模块依附于项目,每个项目至少有一个模块,也能拥有多个模块一般所言的“编译运行App”,是指运行某个模块,而非运行某个......
  • 【Android 逆向】VM Kali 中 charles 抓android https 协议
    1.虚拟机调成桥接模式(不用选择复制物理网络链接状态)2.虚拟机中打开Charles4.选择Proxy->SSLProxyingSettings1.选择SSLProxying菜单2.勾选EnableSSL......
  • IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf
    1、前言最近我负责的LiveChat客服聊天系统到了自研阶段,任务类似于做一个腾讯云IM这样的通信层SDK。在和后台进行技术选型讨论后,确定了数据传输层协议格式使用Protobuf......
  • Android工程接入UnityLibrary工程
    目录结构Unity工程指UnityLibrary目录下文件;安卓工程指app目录下文件;整体指App目录下不包括app和UnityLibrary;1.Unity打包时勾选导出安卓工程;拷贝gradle.properties......
  • [调试工具]如何使用tcpdump抓包
    如何使用tcpdump抓包打开一个终端,输入以下命令来安装tcpdump(如果您已经安装了tcpdump,请跳过这一步):sudoaptinstalltcpdump输入以下命令来查看您的网络接口的名称:ipl......
  • 2023年度Android面试复习
    Android系统启动流程?当按电源键触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader到RAM中,并执行BootLoader程序启动LinuxKernel;然后启动用户级别的第一个......
  • Qt for Android开发环境这样设置简单正确高效
    1.按照如下网址安装设置JDK、SDK、NDK版本并创建环境变量:JAVA_HOME、ANDROID_SDK_ROOT、ANDROID_NDK_ROOT。https://doc.qt.io/qt-6/android-getting-started.html2.如本......
  • 2023.3.7Android开发
    今天学习了Android开发的图像显示imageview中的图片属性xml中的缩放类型,fitxy拉伸图片使其正好填满试图(图片可被拉伸变形)firststrat保持宽高比例,拉伸图片使其位于试图的......