SSL Pining 问题解决方案

news2024/11/15 20:44:28

实战案例

为了能够更好的复现 SSL Pining 场景,我们对一个 App(https:app4.scrape.center)进行抓包,这个 App 包含了 SSL Pining 的相关设置,如果我们将手机的代理设置为抓包软件提供的代理服务,那么这个 App 在请求数据的时候检测出证书并不是受信任的证书,从而直接断开连接,不继续请求数据,相应的数据就会加载失败

首先,在手机上安装这个App ,此时手机没有任何代理,可以发现数据是正常加载的

接下来就是抓包了,我们还是以 Charles 为例。打开 Charles ,配置好环境,然后重启手机,打开 app4 会出现 “证书验证失败” 的提示

Charle 配置:

写文章-CSDN创作中心

与此同时,Charles 的抓包结果如下图

可以看到这里报了一个错误

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

此时如果取消代理,然后重新打开App 就又能加载成功了

以上就是 SSL Pining 导致的抓包失败线下

SSL Pining 技术原理

SSL Pining 是一种防止中间人攻击的技术,只针对 HTTPS 协议。在遵循 HHPS 协议的数据通信过程中,客户端和服务端握手建立信任时,有一步是客户端收到服务器返回的证书,然后对该证书进行校验,如果这个证书不是自己信任的证书,就直接断开连接,不再进行后续的数据传输,这就会导致整个 HTTPS 请求失败

为了更好的理解其中原理,我们在电脑上做一个小实验,打开百度首页,在浏览器左上角看一下证书信息

可以看到颁发者是 GlobalSign RSA OV SSL CA 2018 鉴于其权威性,我们认为其颁发的证书是可信的,接下来我们将电脑的全局代理设置为 Charles , 一般在 Charles 的菜单中可以设置,打开 Proxy-----Windows Proxy , 将此选项勾选上即可

注意: 在设置全局代理之前,需要先在电脑上设置 信任 Charle Proxy CA  这个证书颁发机构(这也是一种证书),具体的设置方法 

写文章-CSDN创作中心

找到证书安装,按步骤进行即可

现在刷新一下百度首页,再次查看证书详情

可以看到,当前的证书颁发者变成了 Charles Proxy CA (13 Aug 2024, DESKTOP-ON5T7S2) ,那么此时电脑要不要信任这个证书呢? 答案是要, 因为我们已经信任了,如果没有设置,那现在访问百度首页会出现 SSL 安全提示。

于是我们可以进一步得出结论,在电脑上设置了信任 Charles Proxy CA 的证书后,如果 PC 使用 Charle 的代理来访问 HTTPS 网站, 所有使用的证书都会变成 Charles Proxy CA 颁发的

电脑上是这样,手机上自然也一样。在抓包之前,我么先在手机上设置信任 Charles 的证书,之后手机上使用Charles 代理访问 HTTPS 网站的时候,所有的网站证书都会是 Charles 颁发的,因为手机信任它,所以手机也就能正常访问 HTTPS 网站了

那么问题来了

我们在开头提到客户端(这里指 APP )在获取证书信息后,是可以对证书做校验的,如果不做校验,那么不会有任何问题,但一旦校验,并发现指纹不匹配,就会直接连接中断,请求自然就失败了

那这个校验的过程怎么实现的呢? 校验证书指纹即可。因为使用代理和不使用代理的证书颁发机构不是一个,所以两个证书的指纹不一样,只要证书的指纹跟指定的指纹不一样,就算校验失败。例如当前证书的指纹

在开发阶段,如果知道服务器返回的证书指纹,是可以提前把证书写死在客户端这边的。客户端获取证书后,对比证书的指纹跟写死的指纹是否一致,如果一致就通过校验,否则不通过,中断后续数据传输

这个过程怎么实现的呢?两种方式

1)  对于 7.0 以上的 Android 系统, SDK 提供了原生的支持。 在 APP  开发阶段,会直接将指纹写死在一个 XML 文件里,然后在 AndroidManifest.xml 文件中添加一个 android:networkSecurityConfig 配置,具体可以参考 Android 官方文档 不过要注意 Android 系统的版本

2)  直接将指纹和校验流程写在 Android 代码里, 现在 Android 的很多 HTTP 请求库是基于 OKHttp 库开发的, OKHttp 的 SDK 就提供了对 SSL Pining 的支持,一般可以在初始化 OKHttpClient 对象的时候添加 certificatePinner 这个选项,将信任的证书指纹写死。当然除了 OKHttp ,其他库也提供类似的支持

第二种方式的适用性更广,不局限与特定的 Android 版本,本节也将基于第二种方式实现

至此 SSL Pining 的技术原理就大概清楚了

绕过

明白了原理,那怎样才能绕过这个技术,解除它的限制呢? 

某些 APP 是使用第一种方式实现 SSL Pining ,这种方式对 Android 版本有要求,所以直接使用 7.0 以下的 Android 系统,即可解除

既然客户端会校验证书,那我们直接 Hook 某些用于校验正是的 API , 不管证书是否可信,都直接返回 True , 从而绕过证书的校验过程。可以使用的 Hook 工具: Xposed  Frida 等

通过反编译的方式还原 App 代码, 修改 AndroidManifest.xml 文件或代码中用于校验证书的逻辑,修改完后重新打包签名。不过由于 App 代码不好完全还原,该方案可行度不高

那么, 第二种方案将是最好的

Frida + DroidSSLUnpining

如果想基于 Frida 实现 Hook ,那么可以结合 DroidSSLUnpining 这个开源库,其 Github 地址是 https://github.com/WooyunDota/DroidSSLUnpinning

下载后解压, 解压之后在  DroidSSLUnpinning-master\ObjectionUnpinningPlus 里面有一个叫 hooks.js 的文件, 后面会用到,也可以使用 git 命令下载

启动前的状态:

模拟器: 在首页,不要打开 App 

Charles : 打开,并确定能够 链接 模拟器或真机

打开CMD

frida : 需要指定传递数据的端口: adb forward tcp:27042 tcp:27042

然后启动server:   adb shell  -----  su --- cd data/local/tmp  --- ./frida-server-16.4.8-android-x86 (server 的名字)

新开一个 cmd 窗口

正常是输入: frida -U -f com.goldze.mvvmhabit -l hooks.js --no-pause

不过好像  --no-pause 命令不能用了,有说要改成 -pause  但是会报错

frida: error: argument -p/--attach-pid: invalid parse_target value: 'ause'

然后改成: frida -U -f com.goldze.mvvmhabit -l hooks.js

如果报错: Failed to spawn: need Gadget to attach on jailed Android; its default location is

则需要改成: 

frida -H 127.0.0.1:27042 -f com.goldze.mvvmhabit -l hooks.js

com.goldze.mvvmhabit : 是包名

hooks.js : 这个也可以是 hooks.js 的路径

27042 : 是前面   adb forward tcp:27042 tcp:27042  里面的

我的到这一步 frida 就成功启动了

模拟器也启动 App 了

Charles 这时候也有数据了

中间遇到的报错处理:

Failed to spawn: connection closed

需要将启动 frida-server 的cmd 关掉重新启动,或者使用 kill 命令杀死这个进程

Waiting for USB device to appear

是你的模拟器或者真机没打开,或者没有跟 frida 链接

Failed to spawn: unable to find process with name 'com.goldze.mvvmhabit

包名写错了,或者是命令没写完整,导致找不到 app 包

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 11上RTX 4090深度学习与大模型微调环境安装指南

【本文原作者:擎创科技资深产品专家 布博士】 在安装深度学习及大模型微调环境时,经历了多次反复操作(如CUDA、cuDNN、PyTorch的安装与卸载)。为了避免走弯路,总结了以下步骤: 步骤 1:显卡驱动…

【轨物方案】直流电源屏物联网解决方案,让在线监测更简单!

流屏是保证各类变电站、水力、火力发电厂正常、安全运行的电源设备,也是其它使用直流设备用户(如石化、矿山、铁路、医院等)的直流电源,是电力系统的重要组成部分。同时直流屏在变配电中,发挥着很大的作用,它在很大程度上影响着配…

Waymo第六代无人驾驶技术亮相:更少传感器,更高效率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【系统分析师】-综合知识-数据库基础

1、给定关系模式 R < U &#xff0c;F >&#xff0c; U {A&#xff0c;B&#xff0c;C&#xff0c;D &#xff0c;E} &#xff0c; F {B→A &#xff0c;D→A &#xff0c;A→E &#xff0c;AC→B }&#xff0c;则 R 的候选关键字为&#xff08;CD&#xff09;&#xff…

76、docker-harbor

一、docker-harbor 私有仓库部署和管理&#xff1a; docker-harbor 私有仓库部署和管理&#xff1a; harbor&#xff1a;开源的企业级的docker仓库软件。 仓库&#xff1a;私有仓库、公有仓库。私有仓库。 docker-harbor&#xff1a;是有图形化的&#xff0c;页面UI展示的一…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【Hot100】LeetCode—148. 排序链表

目录 1- 思路归并 2- 实现⭐148. 排序链表——题解思路 3- ACM 实现 原题连接&#xff1a;148. 排序链表 1- 思路 归并 1- 先求解链表的长度&#xff0c;求出长度后利用 subLen 1 开始归并 定义虚拟头结点 dummyHead &#xff0c;便于处理头结点 2- 归并逻辑 for(int subLen…

nacos 使用 docker 单机部署连接 MySQL 数据库并开启鉴权

文章目录 本地部署的配置启用鉴权(未验证) docker部署的配置修改docker 镜像源启用鉴权&#xff0c;必须添加如下环境变量如何生成鉴权的密钥 完整环境变量docker启动命令 本地部署的配置 文件结构 application.properties #配置文件 mysql-schema.sql …

[Linux#40][线程] 线程控制 | 多线程

内核中有没有很明确的线程概念呢&#xff1f;没有的。有的是轻量级进程的概念 不会给我直接提供线程的系统调用&#xff0c;只会给我们提供轻量级进程的系统调用&#xff0c;但是我们用户&#xff0c;需要线程的接口&#xff01; 所以 Linux 开发者提供了 pthread 线程库--应用…

成为创作者的第1024天:成长与技术积累的旅程

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天是我成为创作者的第1024天。回顾这段时间&#xff0c;虽然日常的忙碌充斥着生活…

roles(角色)

创建目录&#xff0c;编写剧本下载nginx: 184 mkdir /etc/ansible/playbook 185 vim /etc/ansible/playbook/nginx.yml --- - hosts: groupremote_user: roottasks:- name: 卸载httpdyum: namehttpd stateabsent- name: 安装nginxyum: …

【MySQL 09】复合查询 (带思维导图)

文章目录 &#x1f308; 一、准备工作&#x1f308; 二、多表查询⭐ 1. 多表笛卡尔积⭐ 2. 多表查询示例 &#x1f308; 三、自连接&#x1f308; 四、子查询⭐ 1. 标量子查询⭐ 2. 多行子查询 (需要插入其他博客的链接)⭐ 3. 多列子查询 (需要插入其他博客的链接)⭐ 4. 在 fro…

小米SU7销量超特斯拉,新车明年上半年发布

小米 SU7&#xff0c;一款国内新能源车品牌纯血新势力旗下首款轿车&#xff0c;上市短短 4 个月卖出超 4 万台&#xff0c;月均销量过万。 该说不说&#xff0c;这放在整个新能源汽车工业史上也足以称得上是一件小刀喇拍屁股&#xff0c;让人开了眼的事儿。 就在本月初&#x…

大模型在企业数智化转型中可以做哪些事情?

在数字化浪潮的推动下&#xff0c;企业数智化转型已成为不可逆转的趋势。作为人工智能技术的集大成者&#xff0c;大模型以其强大的数据处理能力、深度学习能力及广泛的应用场景&#xff0c;正逐步成为企业数智化转型的核心驱动力。 大模型&#xff1a;智能时代的基石 大模型…

Error: ReferenceError: ReadableStream is not defined

midway项目在build完&#xff0c;docker启动时&#xff0c;莫名地报错Error: ReferenceError: ReadableStream is not defined&#xff0c;之前一直好好地&#xff0c;初时以为是新加的代码引起&#xff0c;后来排除了。 报错如下&#xff1a; 2024-08-20 11:57:51.446 ERROR …

【教学类-76-01】20240820书包01(图案最大化)

背景需求 通义万相生成图片&#xff0c;把图案最大化的方法&#xff08;切掉白边&#xff09; 【教学类-75-01】20240817“通义万相图片最大化透明png”的修图流程-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞56次&#xff0c;收藏17次。【教学类-75-01】20240817“通义万相…

Aseembly(八)-汇编语言编写程序

前言 在该系列的第六篇文章我们主要讲述了:关于栈的寄存器:SS和SP的问题 来回一下: 对于栈指针来说,栈在被开辟的时候,首先要通过SS指针去找到开辟栈的地址空间的首地址,随后,SP指针指向该栈空间的末尾的下一个空间处.当执行push指令时,sp会-2 随后将目标压入栈中 当执行pop指…

volta引发的血案

什么是volta volta用于做项目级别的node版本控制&#xff0c;当手头上的项目有多个时&#xff0c;且node版本可能还不一样&#xff0c;我们需要不断切换node版本。使用volta可以很好的解决这个问题。只需要安装volta&#xff0c;然后在下面的package.json中配置好node版本即可…

鸿蒙HarmonOS实战开发: CMake脚本编写构建NDK工程

NDK工程构建 HarmonyOS NDK默认使用CMake作为构建系统&#xff0c;随包提供了符合HarmonyOS工具链的基础配置文件ohos.toolchain.cmake&#xff0c;用于预定义CMake变量来简化开发者配置。 常用的NDK工程构建方式有&#xff1a; 从源码构建 源码构建也有不同方式&#xff1a;…

机器学习在智能复合材料中的应用与实践

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方 案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优 化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能…