0
点赞
收藏
分享

微信扫一扫

iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)

七公子706 2023-05-17 阅读 51

“我正在参加「掘金·启航计划」”

前言

Charles 支持的协议:HTTP/1.1、HTTPS、HTTP/2、ws(WebSocket)、wss(WebSocket Secure,TLS 加密的 WebSocket)、SOCKS


“⚠️ 注:Charles 不支持 HTTP/3,但是大部分开启 HTTP/3 的网站都做了降级处理

若想抓取其他协议的报文,推荐用 Wireshark Wireshark用的是RVI(Remote Virtual Interface)(iOS5以上才支持)。


I 抓包配置

1.1 iOS侧的代理配置(默认不支持拦截SSL数据)

  • 把 iOS 的网络包转发到代理 IP 和代理端口的配置


确保Mac和iPhone在一个局域网,并在iPhone上设置代理信息:Mac端地址代理端口即可

五元组:源 IP 地址,源端口,传输层协议,目的 IP 地址和目的端口

  • 查看 Mac地址 或者使用ifconfig查看IP

inet 192.168.1.107 netmask 0xffffff00 broadcast 192.168.1.255

Charles 的代理端口号可以从Charles -> Proxy -> Proxy Setttings进行查看和更改。端口默认是 8888

iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)_SSL

1.2 Mac侧的证书安装

需要信任证书,否则将提示: You may need to configure your browser or application to trust the Charles Root Certificate.

HTTPS = HTTP 协议 + TLS 协议

在 TCP 三次握手之上加入了四次 TLS 握手,TLS 握手过程中会校验加密用的公钥证书,所以想要拦截SSL请求,我们需要手动安装并信任 Charles 的证书,

  • Mac侧的证书安装

Charles -> Help -> SSL Proxying -> Install Charles Root Certificate

iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)_iOS_02

  • iPhone上的设置方法: Charles -> Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Derive,这时候会跳出一个弹窗,根据提示在手机端访问 chls.pro/ssl,下载安装 Charles CA 证书

或者直接访问charlesproxy.com/charles.crt… 证书,可以选择先发证书到邮箱,再从系统邮箱选择安装

iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)_iOS_03

设置->通用 -> 选择对应的描述文件进行安装信任刚刚下载的证书。

1.3 iOS端信任证书的方法

  • iOS 信任证书

iOS10.3.1 新安装的证书需要手动选择信任证书。

解决方式:

设置->通用->关于本机->证书信任设置

  • 应用场景:iOS10.3.1 新安装的证书需要手动选择信任证书。

iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)_HTTP_04

II 解决Certificate Pinning导致的无法分析问题

在 HTTPS 请求时,服务端发给客户端的公钥证书必须和客户端内置的公钥证书一致才能请求成功。

(支付行业的产品都会采用这个基本的验证

方案1:把证书和私钥导入到 Charles

  • 解决方案1:把证书和私钥导入到 Charles 中,解决Certificate Pinning
  • 方案2:如果没有公钥证书和随之配套的私钥,这个时候当然可以采取逆向的手段来绕过证书校验

方案2:借助逆向手段来绕过证书校验

  • ios-ssl-kill-switch tweak:github.com/zhangkn/ios…

更多相关信息请看这篇文章

  • ssl-kill-switch2:Blackbox tool to disable SSL certificate validation - including certificate pinning - within iOS and OS X Apps
  • objection/hooks/ios

pinning/disable.js: This hook attempts many ways to kill SSL pinning and certificate

III 预备知识

3.1 获取站点的证书【可选】

如果遇到app进行本地证书验证的时候,需要在iPhone上信任对应的站点证书

使用openssl命令来获取到服务器的公开二进制证书(以google为例):

openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer

3.2 pem转变格式为DER

证书有BASE64和DER两种编码,der二进制编码可以使用openssl进行转换。

  • 转变格式为DER

openssl x509 -outform der -in kncmpay.cer -out kncmpay.cer

3.3 Android不同版本对CA 证书权限的处理规则

Android 版本越高,HTTPS 报文越难抓

系统 CA 证书:基本拥有所有权限 用户 CA 证书:用户自行安装,权限很低

获得证书 ROOT 权限

1、直接 ROOT Android 手机,把 Charles 证书放到系统证书里,实现证书洗白 2、Android 7.0 以下:信任用户 CA 证书,可以简单的理解为我们安装的证书直接获得 ROOT 权限 3、修改Android的配置文件 res/xml/network_security_config.xml ,来控制网络安全:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates overridePins="true" src="system" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates overridePins="true" src="system" />
            <certificates overridePins="true" src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

release 包只信任 system 级别的证书, debug 包同时信任 system 和 user 级别的证书

see also

  • how to properly setup security connection 1、iOS安全【 SSL证书验证, 让Charles再也无法抓你的请求数据】2、iOS逆向:【绕过证书校验】
  • 1、iOS网络安全优化:SSL证书验证, Charles再也无法抓你的请求数据;对请求参数进行签名;2、不走全局proxy的方案;3、允许不验证SSL证书;4、拦截请求;5、DoH &DoT6、SDL
举报

相关推荐

0 条评论