用地方别名做网站名,支持html5的网站,电子商务网站功能,网站的建设与颜色搭配实战案例
为了能够更好的复现 SSL Pining 场景#xff0c;我们对一个 App#xff08;https:app4.scrape.center#xff09;进行抓包#xff0c;这个 App 包含了 SSL Pining 的相关设置#xff0c;如果我们将手机的代理设置为抓包软件提供的代理服务#xff0c;那么这个 …实战案例
为了能够更好的复现 SSL Pining 场景我们对一个 Apphttps: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 包