Charles抓包原理

Posted by boredream on June 10, 2021

实践之前学习的计算机网络知识,尝试分析下Charles手机抓包(重点是Https)流程。
这里以手机访问 https://www.zhihu.com 为例。重点关注密钥、证书交换等关键步骤,其它略。Charles使用方法略。

简单原理

Charles作为正向代理。手机配置手动代理时,IP指向电脑,端口号8888对应Charles应用。设置后所有手机请求和服务器的响应都会经由Charles转发,在转发的过程中Charles进行中间人攻击,拿到明文。

详细流程

流程图

charles

流程说明

先Tcp握手

  1. 手机向Charles发起tcp3次握手连接
  2. 连接成功后手机发起https接口请求
  3. Charles向服务器发起tcp3次握手连接
  4. 连接成功后Charles响应手机http 200连接建立

Tcp建立后,开始TLS握手

  1. 手机向Charles发起TLS握手
  2. Charles将手机发来的随机数等信息保存,之后用自己的参数向服务器发起真正的TLS握手
  3. Charles和服务器完成握手过程,再基于服务器返回的信息重新生成随机数、秘钥、证书等返回给手机端完成握手
  4. 此时Charles端持有两套对称秘钥,一个对应手机keyP,一个对应服务器keyC

传输数据

  1. 后续Charles作为中间人,拦截客户端的请求,keyP解密后用keyC重新加密传给服务端
  2. 服务端返回的数据也同理

Wireshark 抓包

Tcp握手
TLS1

TLS握手
TLS2

Https安全吗?

Charles先用代理技术让自己变成一个类似钓鱼网站的中间者,所有请求都从我这里中转。但在日常网上冲浪时钓鱼网站不会起作用,因为我们在拿到服务器证书时会去CA验证一下。

而Charles就是从这里下手,先让用户安装Charles根证书添加信任。之后在TLS握手过程中,Charles先从服务器获取的正常证书链,把其中的权威根证书替换成自己的再发给客户端,客户端收到后发现根证书在信任列表里,验证通过。

由此可见,Https在「技术」上依然是安全的,除非你自己「人为」的乱安装未知来源证书。就像银行技术再安全,你直接把密码给别人了也歇菜。