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 findClass
                    if (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.mfbz.cn/a/553611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运动想象 (MI) 分类学习系列 (8) :IFNet

运动想象分类学习系列:IFNet 0. 引言1. 主要贡献2. 提出的方法2.1 交互式频率卷积神经网络2.1.1 光谱空间特征表示2.1.2 跨频交互2.1.3 分类&#xff08;一个池化分类层&#xff09; 2.2 重复试验增强 3. 实验3.1 基线比较3.2 消融实验3.2.1 数据增强消融3.2.2 条带分割消融3.2…

✅技术社区--布隆过滤器在项目中怎么用的?不用可以吗?

使用 布隆过滤器 一般就是用于快速判断某个元素是否在集合中出现了&#xff0c;可以用于解决 缓存穿透 的问题&#xff0c;布隆过滤器提供 一组哈希函数 h1, h2, ..., hk &#xff0c;对需要存储的数据使用哈希函数计算得到 k 个哈希值&#xff0c;将 BitMap 中这 k 个位置都设…

面试stm32基础知识

1.ISP 第一步进入bootloader模式&#xff1a;先置BOOT0为高&#xff0c;BOOT1为低&#xff0c;再复位单片机进入bootloader模式&#xff0c;之后通过上位机下载程序&#xff1b; 第二步配置启动代码的地方&#xff1a;代码下载完毕后&#xff0c;置BOOT0为低&#xff0c;BOOT1…

中兴F7607P自启动程序,关闭JAVA插件

本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为CMCCDPI的插件&#xff0c;用途可以从名字上窥见。机器rootfs分…

Windows系统下查看C语言文件反汇编

一、配置编译器环境变量 1.下载mingw64 MinGW 的全称是&#xff1a;Minimalist GNU on Windows &#xff0c;MinGW 就是 GCC 的 Windows 版本 。 MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成32位可执行程序&#xff0c;而 MinGW-w64 则可以编译生成 64位 或 32位 可执行…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题&#xff1a;为什么使用 FinalShell 连接&#xff0…

字符串拆分优化算法

字符串拆分优化算法 问题背景算法设计思路伪代码实现C语言代码实现 详细解释结论 在面对字符串拆分问题时&#xff0c;我们的目标是找到一种最优的拆分顺序&#xff0c;以使得总的拆分代价最小。这个问题可以通过动态规划算法来解决。在本文中&#xff0c;我们将详细介绍这个问…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户&#xff0c;然后通过本地电脑telnet 软件ensp中的设备&#xff0c;尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

python数据可视化:折线图plt.plot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 折线图 plt.plot() 选择题 关于以下代码输出的结果说法正确的是&#xff1f; import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans…

2011年认证杯SPSSPRO杯数学建模C题(第二阶段)你的爱车入保险了吗全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 C题 你的爱车入保险了吗 原题再现&#xff1a; 近几年&#xff0c;国内汽车销售市场异常火爆&#xff0c;销售量屡创新高。车轮上的世界&#xff0c;保险已经与我们如影随形。汽车保险&#xff0c;简称车险&#xff0c;是指对机动车辆由于自然…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想&#xff0c;对于两个有序数组&#xff0c;我们分别取他们首元素比较大小&#xff0c;取小的插…

向量数据库Chroma初步了解学习记录

目录 前言 一、Chroma是什么&#xff1f; 二、使用步骤 1.安装 2.连接Chroma 内存模式 client模式 Server模式 3.创建数据集 4.写入数据 5.查询数据 6.完整代码 7.更多参考 三、瞅瞅chroma之sqlite 总结 前言 大模型很强大&#xff0c;但是大模型也存在知识的局…

格灵深瞳,实现核心能力高强度保护与灵活交付

格灵深瞳&#xff0c;AI领域的领先企业&#xff0c;借助泰雷兹圣天诺技术&#xff0c;实现核心能力高强度保护与灵活交付&#xff0c;引领行业风向&#xff0c;安策信息助力AI行业企业实现产品核心能力保护、销售模式创新以及软件产品的灵活交付。 格灵深瞳&#xff0c;AI领域的…

量子密钥分发系统的设计与实现(二):光路子系统初步讨论

通过上一篇文章&#xff0c;我们对量子密钥分发系统的基本架构、硬件结构以及密钥分发流程进行了初步的总体介绍&#xff0c;从本文开始&#xff0c;我们就基于系统顶层的架构设计&#xff0c;开始从模块到器件&#xff0c;从硬件到软件开始详细讨论QKD系统的设计与实现。本文主…

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…

注塑机自动喷雾程序 报警自动关机

/***参数设置,开模数计数,秒脉冲计时***************/ /***实现功能:检测报警信号,脱模剂开模数计数信号***/ /***参数:1:脱模剂开模数 2:喷雾时间 3:延时时间 ***/ /***串口接收触摸屏参数设置字符串,接收并保存******/ /***端子输入口读开模数,比较设定值后输出到电磁阀**/ /…

Emmet表达式

目录 Emmet语法简介 Emmet作用 Emmet在HTML中的使用 Emmet在CSS中的使用 Emmet语法简介 Emmet语法的前身是Zen coding,它使用缩写,来提高HTML的编写速度&#xff0c;VScode内部已经集成该语法。 Emmet作用 快速生成HTML结构语法快速生成CSS样式语法 Emmet在HTML中的使用…

python连接数据库失败怎么解决

Python 连接数据库失败怎么解决&#xff1f; 什么是 PyMySQL&#xff1f; PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库&#xff0c;Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范&#xff0c;并包含了 pure-Python MySQL 客户端库。…

Vue_管道符“|”(单竖线)的用处

目录 1、管道符是什么 2、应用场景 背景&#xff1a;项目中偶遇在 {{ }} 插值表达式里用了 “&#xff5c;”此写法&#xff0c;一开始误以为是写错了&#xff0c;应该是写成 “&#xff5c;&#xff5c;” 双竖线&#xff08; 逻辑或运算符 &#xff09;&#xff0c;结果询问…

为什么用云渲染农场?3D云渲染农场助力影视动画行业发展

​计算机图形技术的进步使得3D渲染成为多个产业发展的重要推动力。设计师和艺术家利用这项技术将创意实现&#xff0c;创造出震撼的视觉作品。但是&#xff0c;高质量的渲染需要大量的计算资源。云渲染农场通过提供这些资源&#xff0c;有效提高了渲染的速度和效率&#xff0c;…