安卓 https 证书校验和绕过

吕元江,2019年1月参与去哪儿网,现担任app的剖析和设备指纹反爬事项,对app脱壳,java/nativec层加解密算法剖析复原有丰厚经验。

1. 布接口

在剖析 app 协议时常常碰到由于证书校验而导致无法正常抓取 https 协议的情况,本文首要介绍证书校验检测的时机和原理,以及怎样绕过检测和绕过的原理。安全防范方面,开发者又该怎样应对以及怎样检测,同破逆向游览解方进行仇视。

1.1 在安卓上结束 https 办法的办法有哪数组去重办法

A)Apache 的 HttpClient 类

B)HttpsURLConnection 类

C)后续将以第三方库 OkHttp 为例(或其他第数组词三方库 Xutils,HttpClientAndroidLib)

1.2 各自的证书校验办法?

  1. 依据 app 内置证书 KeyStore 生成 TrustManager数组排序 验证
  2. 自定义 SSLSocketFactory(org.apache.http.conn.ssl.SSLSocketFactory)结束http://www.baidu.com Trust接口卡Ma逆向思想nager 验证战略(httpClient)数组去重办法
  3. 自定义SSLSocketFactory(javax.net.ssl.SSLSocketF逆向行驶扣几分罚款多少钱actory)结束Truhttp://192.168.1.1登录stManager 验证战略(HttpsURLConnection,OkHttp3)
  4. 自定义的 HostnameVerifier 和 X509TrustManager 结束验证
  5. 第三方库中的验证,如 OkHttp3 中的 CertificatePinn数组函数的运用办法er(证书确定)
  6. WebView 加载 Https 页面时证书校验犯错,中止加载

下图为现在比较常见的结束 https 类的各自证书验证的办法:

安卓 https 证书校验和绕过

下图为 JSSE 的参考手册供给的与描绘证书验证相关的一些类之间的联络逆向行驶扣几分罚款多少钱示目的。
(docs.oracle.com/javase逆向游览/6/do…
安卓 https 证书校验和绕过

从图http代理中能够看到假如要进行 SSL 会话,必须先树立一个 SSLSocket 方针,而 SSLSocket 方针是经过 SSL接口测验面试题SocketFactory 来处理的,SSLSocketFactory 方针则依赖于 SSLContext ,SSLContext 方针的初始化需求 keyManager、TrustManager 和 SecureRandom。

逆向思想案例100个图中能够看到假如要进行 SSL 会话,必须逆向游览先树立一个 SSLSocket 方针,而 SSLSocket 方针是经过 SSLSocketFactory 来处理的,SS数组的定义LSocketFactory 方针则依赖于 SSLContext ,SSLContext 方针的初始化需求 keyManager、TrustManager 和 SecureRandom。TrustManager 方针是咱们后文比较关心的,由于正是 TrustManager 担任证书的校验,对网站进行认证,要想确保数据不被中间人抓包剖析,就需求结束这个类进行验证,以确保数据的安全性。

在整个过程中 TrustManager 类专门担任校验证书,能够改写 ThttpclientrustManaghttps认证er 类,结束对证书对校验或让它不要对证书做校验。

以 HttpsURLConnection 自定义结束 X509TrustManager 为例,其中有三个验证办法,逆向挑选下列代码未结束。

public class MyX509TrustManager implemen逆向行驶扣几分ts X509TrustManager{
@Override
public void checkClientTrusted(Xhttps和http的差异509Certificate[] chain, String authttps和http的差异hType) throws Certifhttps域名icateException {
// 验证客户https域名端 未结束
}
@Overrid数组去重办法e
public void checkServerTrusted(X509Certif接口是什么icate[] chain, S接口文档tring authType) throws CertificateException {
// 验证服务端 未结束
}
@Override
public X509Certificate[]https安全问题 getAcceptedIssuers() {
//返回空的X509http 404Certificate 数组 ,不做任何检测
return new X509CHTTPSertificate[] {};
}
}

运用自定义的 Trus逆向游览tManager 来初始逆向游览化 SSLContext,最后调用 HttpsURLConnection 中数组转字符串的 setD数组去重efaultSSLSocketFactory 在进行链接方针 url 时来进行证书验证。

//获取自己结束的Xhttps和http的差异509TrustManager 方针
Trus逆向游览tMan接口和抽象类的差异ager[]逆向行驶怎样处分2021 managers = {new MyX509TrustManager()};
//获取SSLContext 实例
SSLContext sc = SSLConhttp://www.baidu.comtext.getInstance("TLS"https安全问题);
//初始化 SSLContexhttps域名t,第二个参数是咱们自己结束的trustManager
sc.init(null,managers , new SecureRa数组的定义ndom());
javax.net.ssl.SSLSocketFactory sslSocketFahttp协议ctory数组的定义 = sc.getSocketFactory();
//setDefaultSSLSocketFactory 为HttpsURLConnection中用于证逆向思想书验证的函数需求传入SSLSoc数组和链表的差异ketFactory方针
HttpsURLConnection.setDef逆向思想练习500题aultSSLSocketFactory(sc.getSocketFactory());
//setDefaultHostname逆向思想练习500题Verifier接口无权限 为HttpsURLConnection中用于证书验证https和http的差异的函数需求传入自己结束的HostnameVerifier方针
HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
HttpsURLConnhttp代理ectionchttp协议onn=(HttpsURLConnection)newURL("https://ww接口无权限w.baidu.com").openConne接口类型ction();

2. 安卓上的证书绕过(JustTrustMe&SSLkiller 的原理)

在抓包剖析中,针对存在证书验证的 app 一般不会抓到任何数据,关于逆向人员来讲,这是一道坎儿,但是 xopsed 上有HTTPS两款东西,能够绕过证书验证,抵达顺畅httpclient抓取数据数组排序,针对特定接口进行剖析的目的HTTPS

经过前面咱们了解到,证书验证中到要害是 TrustMhttps域名anager,而绕过证书验证就需求从它下手。xhttps和http的差异psoed 上证书校验的绕过插件便是这么干的。

现在比较盛行的两款依据 xposed 的绕逆向游览过证书验证的模块有两款 JustTrustMe 和 SS接口类型Lkiller,针对 HttpClient,HttpsUhttp 302RLConnection,OkHttp 结构各自的证书http代理校验函数,

这两款东西经过 hoo逆向行驶扣几分罚款多少钱k 这接口无权限些要害函数,或替换 TrustManager(信赖全部证书)或令其验证函数直接失效(http://192.168.1.1登录函数替换,不做任何校验),以抵达绕过的目的。

需求注意的是:在自定义结束 SSLSocketF逆向思想练习500题actory 时 HttpClient 结束的是 org.apache.hthttp 302tp.conn.ssl.SSLSocketFactory 包中的 SSLSocketFact数组函数的运用办法ory,而 HttpsURLConnection 则是javax.net.ssl.SSLSocketFactory 包中的 SSLSocke数组词tFactory。

两大绕过插件经过 hook 绕过证书验证有关的要害函数如逆向挑选下图:
安卓 https 证书校验和绕过

3. 安全防护-针对证书绕过 app 开发者怎样应对?

检测篇: 为了保护自己的 app 的协议不数组的定义HTTP简单逆向破解,就需求针对这两款东西进行检测,在检测到后怎样处理,就看你心境啦!!!

检测 xposed 结构,证书验证绕过模块(检查 proc/pid/maps 中加载的 dex 中是否包含了要害包名 just.trust.me 和com.lyf.jason.sslkiller):

以检测 JustTursthttp 404Me 为例(SSLKiller 同理)

1、获取已设备 app 列表,查找是否包含方针包名
安卓 https 证书校验和绕过

2、读取/接口无权限是什么意思proc/pid/maps (可在 native 结束,添加逆向难度),判断自身 a接口文档pp 内是否加载了方针 dex
安卓 https 证书校验和绕过

4. 协议被抓包的危害

近年来有不少的商家在做活动初始的时分,注册接口(某些注册接口甚至不需求手机号,只需求供给邮箱即可,注册本钱极低)被破解,导致被恶意注册,用于奖励新用户的红包或许优惠券之类的奖励,接口无权限被这些虚伪用户切开殆尽。虽然大多数的注册新用户接口还都是https认证依赖于手机号,但是https和http的差异一旦注册协议被破解现在有许多数组去重的不合法途径都会供接口无权限是什么意思应接码服务,在破逆向解完注册协议后注册一个新用户的本钱可能便是几分钱,如之前的某滴虚伪注册,就有几十万的虚伪用户存在。

5. 安全防httpwatch护的其他思路延伸

51绕过东西缝隙的运用

运用这两款未HTTPS hook 到的检测办法来对证书进行校验。通接口文档过剖析两款证数组去重办法书验证绕过插件咱们发现,这两款关于开发者在运用 OkHttp 结构自定义 HostnameVerify 以及 sslSocketFactory 函数 完httpwatch结证书验证的办法并没有作 hook 绕过处理。

所以在运用 OkHttp 第三方库时httpwatch,能够经过运用自定义的逆向思想的例子 HostnameVerify 或自定义 SSLSocketFactory 和 X509TrustManager 后调用 shttp://www.baidu.comslSocketFactory 函数接口进行设置,来防止数组的定义被抓包。检测代码如下:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
//自定义SSLSocketFactory 和X509TrustManager
builder.sslSoc接口和抽象类的差异ket接口Fahttpwatchctory(new Trust接口和抽象类的差异AllSSLSocketFactory(),new MyX509Tru接口是什么stManager());
builder.hostnameVerifier(new MyHostnameVerifier());

5.2小众网络央求结构的运用

从开发者的视点,能够在某个要害协议或许全部协议,能够运用小众的网络央求http 404结构(这两款东西未 hook 的)

5.3晋级惯例网络接口卡央求逆向到最新版别

其他开发者能够经过剖析最新版其他 o逆向行驶扣几分罚款多少钱khttHTTPp3 或许其他结构的证书校验办法源码,经过打时间差的办法,绕过这两款东西的检测。

5.4协作加密运用

防止抓包的办法做足了还并非是安全的,能够协作自定义的加解密算法对数组排序要害业务参数进行加密,并不守时更新算法。防止被有心人从协议层打破。