SSL Pinning之双向认证

双向认证处理流程

  • 概述
  • 获取证书
  • 逆向app 获取证书的KeyStore的 key
      • 通过jadx 反编译 app 获取证书:
      • frida hook
  • 证书转换
      • 命令行转换
      • portecle 工具使用
  • charles 配置 p12 格式证书

概述

本篇只介绍怎么解决ssl pinning, 不讲ssl/tls 原理。
为了解决ssl pinning 服务端验证(又称 双向认证), 解决步骤如下:

获取证书

我们知道服务端证书绑定在客户端中, 那么直接解压apk就可以获取了

常见 akp 的证书一般放在assets 目录下面, 常见的证书格式: cer、pem、p12、pfx、bks
示例:
在这里插入图片描述

逆向app 获取证书的KeyStore的 key

通过ssl pinning 原理我们知道服务端证书被绑定在客户端中(apk里)
这里分为两步:第一步获取 证书passwrd代码位置; 第二步通过frida hook获取password

常见java代码模拟双向认证的请求的过程:

// 双向认证证书
KeyStore keyStore = KeyStore.getInstance("PKCS12");
KeyStore trustStore = KeyStore.getInstance("jks");
// keyStore是服务端验证客户端的证书,trustStore是客户端的信任证书
InputStream ksIn = new FileInputStream("E:/Java/jre8/lib/security/re/1.pfx");
InputStream tsIn = new FileInputStream(new File("E:/Java/jre8/lib/security/re/1"));// 这里是客户端证书加载, 123456为keyStore的password
keyStore.load(ksIn, "123456".toCharArray());SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).loadKeyMaterial(keyStore, "123456".toCharArray()).setSecureRandom(new SecureRandom()).useSSL().build();ConnectionSocketFactory pSocketFactory = new PlainConnectionSocketFactory();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext);Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create().register("http", pSocketFactory).register("https", sslConnectionSocketFactory).build();
PoolingHttpClientConnectionManager secureConnectionManager = new PoolingHttpClientConnectionManager(r);HttpClientBuilder secureHttpBulder = HttpClients.custom().setConnectionManager(secureConnectionManager);
HttpClient client = secureHttpBulder.build();HttpGet httpGet = new HttpGet("https://xxx.com");
HttpResponse httpResponse1 = client.execute(httpGet);

通过jadx 反编译 app 获取证书:

  • 查找特征:
    • keyStore.load

示例: ( 图二 )
图一

frida hook

由于不同apk hook代码不同, 这里介绍两个hook点, 不提供hook 代码

  • hook 密码解密函数
  • hook keyStore 的load 函数

示例:(以图二为例)

// 这里使用hook 点一
function main(){Java.perform(function(){Java.enumerateClassLoaders({onMatch : function(loader){try {// loadClass or findClassif (loader.loadClass("o0O0000o.OooO0OO")){Java.classFactory.loader = loader;// something to do;var OooO0OO = Java.use("o0O0000o.OooO0OO");console.log("success hook it :", OooO0OO);OooO0OO["OooO00o"].implementation = function (j) {console.log(`OooO0OO.OooO00o is called: j=${j}`);let result = this["OooO00o"](j);console.log(`OooO0OO.OooO00o result= ${result}`);return result;};}} catch (error) {// pass}},onComplete: function () {console.log("complete !!! ")}})})
}setImmediate(main);

结果:

OooO0OO.OooO00o is called: j=-1973552697099
OooO0OO.OooO00o result= MZ4cozY8Qu32UzGe
OooO0OO.OooO00o is called: j=-2046567141131
OooO0OO.OooO00o result= MZ4cozY8Qu32UzGe

证书转换

如果如果证书是bks 的, 还需转换成p12(PKCS12) 或 pem(因为charles 只支持p12 和pem)
转换方式这里介绍两种: 第一种命令行; 第二种使用portecle工具

命令行转换

keytool -importkeystore -srckeystore your_bks_cert.bks -srcstoretype BKS -destkeystore bks.p12 -deststoretype PKCS12

其中,your_bks_cert.bks 是你的 bks格式证书文件,bks.p12 是输出的p12格式证书文件名;之后,按照提示输入bks证书的密码(MZ4cozY8Qu32UzGe)和p12证书的密码(同bks证书)。

portecle 工具使用

网上有很多, 这里提供一个不错的blog 点击前往

charles 配置 p12 格式证书

网上有很多, 这里提供一个不错的blog 点击前往

借鉴:

  • 问题解决过程:https://zhuanlan.zhihu.com/p/60392573
  • charles 配置证书: https://blog.yii2.cc/mutual-tls-authentication/
  • apk 获取证书:https://www.secpulse.com/archives/54027.html
  • java 现SSL双向认证:https://blog.csdn.net/HD243608836/article/details/109105469
  • bks证书转p12: https://tool.yimenapp.com/info@-bks-zheng-shu-zhuai-p12-159502.html
  • 证书password hook点定位:https://xz.aliyun.com/t/12993?time__1311=mqmhqIhiGK0KDsD7GG7DyWrbDteXupuGD&alichlgref=https%3A%2F%2Fwww.google.com%2F
  • Portecle工具 Portecle 使用:https://blog.csdn.net/jlcikai/article/details/124605175

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619486.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELFK (Filebeat+ELK)日志分析系统

一. 相关介绍 Filebeat&#xff1a;轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat&#xff0c;并指定目录与日志格式&#xff0c;Filebeat 就能快速收集数据&#xff0c;并发送给 logstash 进或是直接发给 Elasticsearch 存储&#xff0c;性能上相…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

CMC学习系列 (9):对侧半球可能支持中风后的恢复

对侧半球可能支持中风后的恢复 0. 引言1. 主要贡献2. 方法2.1 患者信息2.2 行为测试2.3 运动任务/实验范式 3. 结果3.1 对照参与者和卒中患者的相干图3.2 地形图上的CMC标签 4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/pii/S2…

golang 使用栈模拟计算器

思路&#xff1a; // Author sunwenbo // 2024/4/12 16:51 package mainimport ("errors""fmt""strconv" )// 使用数组来模拟一个栈的应用 type Stack struct {MaxTop int //表示栈最大可以存放数的个数Top int //表示栈底&#xff…

【方法】如何打开ZIP分卷压缩文件?

ZIP分卷压缩文件&#xff0c;是指在压缩文件时&#xff0c;将文件压缩成若干个ZIP格式的小压缩包&#xff0c;便于储存和传送&#xff0c;这些小压缩包可以被当作一个完整的文件来处理。那ZIP分卷压缩文件要怎么打开呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 首先…

星邦生化设备有限公司将出席2024第13届生物发酵展

参展企业介绍 宁波星邦生化设备有限公司&#xff0c;致力于发酵空气处理、发酵尾气处理及发酵罐节能环保装备的研发制造达30余年。公司拥有20多项自主开发的具有竞争力的国家发明专利技术及核心专有技术。连续三届被中国生物发酵产业协会评为——节能环保重点推荐企业。公司用…

LeetCode 678——有效的括号字符串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 需要两个栈&#xff0c;一个用来保存左括号所在的位置索引&#xff0c;一个用来保存星号所在的位置索引。 从左往右遍历字符串&#xff0c;如果是左括号或者星号&#xff0c;则将位置索引分别入栈&#xff0c;如…

碧桂园服务:政企联合,助力秭归脐橙销售

4月9日&#xff0c;秭归县农业农村局与碧桂园服务智享楼下心选签订了秭归伦晚脐橙助农合作项目。 秭归县农业农村局现场对接碧桂园服务集团智享心选全国十二个重点区域核心业主代表&#xff0c;并授予他们“秭归伦晚脐橙推广大使”证书&#xff0c;每位代表都变成了秭归伦晚脐橙…

【Next】动态路由、加载 UI 和流式传输

动态路由 动态段作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。 /app/blog/[slug]/page.tsx export default function Page({params}: {params:{slug:string}}) {return <h1>Slug Page -- {params.slug}</h1> };/app/shop/[...slug]/pa…

Chatgpt掘金之旅—有爱AI商业实战篇|播客剧本写作|(十三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业播客剧本写作服务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。…

Scaffold-GS 代码阅读笔记

1. 系统启动部分 使用 python 中的 parser 库 为配置系统的参数设定, 和3DGS 类似&#xff0c;并且使用safe_state(args.quiet) 函数 为每一次的 log 输出加上对应的 时间戳 ## 配置参数的设定lp ModelParams(parser)op OptimizationParams(parser)pp PipelineParams(pars…

面试经典算法系列之二叉数6 -- 二叉树的右视图

面试经典算法21 - 二叉树的右视图 LeetCode.199 公众号&#xff1a;阿Q技术站 问题描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4]…