avatar
avatar

初探Charles的抓包原理

1
最近接手的小需求需要使用到抓包工具,发现类似Charles这样的抓包工具,对于程序员的日常开发是必不可少的;

HTTPS的安全性

对于HTTPS的分析可见上篇博客:
https://oyjcodes.github.io/2020/09/13/浅尝HTTPS通信协议/

Charles抓HTTPS包原理

当使用者还没有在手机上安装Charles根证书且没有设置为信任时,此时使用Charles抓包HTTPS的情况如下:
正常情况下,得到的结果都是,这是因为我们前面讲的HTTPS的安全性的作用;

avatar
avatar

由上篇博文知HTTPS能有效防止中间人攻击,那么Charles是如何截取HTTPS包的呢?

  1. 这里最为重要的一步就是事先在客户端安装了Charles根证书

  2. 接下来Charles需要做的事情是双向伪装:对服务端伪装成客户端,对客户端伪装成服务端

avatar
avatar

1
2
对服务端伪装成客户端:截获真实客户端的HTTPS请求,伪装客户端向真实服务端发送HTTPS请求
对客户端伪装成服务端:接受真实服务器响应,用Charles自己的证书伪装服务端向真实客户端发送数据内容

HTTPS不是可以避免证书被篡改掉包么?为什么手机安装了Charles根证书后就能正常抓包呢?

其实Charles做的就是针对HTTPS的通信双方身份的真实性进行处理;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
当客户端和服务器建立连接时,Charles会拦截到服务器返回的证书(服务器公钥)

然后动态生成一张伪造证书(Charles公钥/假公钥)发送给客户端

客户端收到Charles证书后,进行验证;因为之前我们手机设置了信任,所以验证通过;(只要手机不信任这种证书,HTTPS还是能确保安全的)

客户端生成会话密钥,使用Charles证书对会话密钥进行加密再传输给服务器

Charles拦截到客户端传输的数据,使用自己的Charles私钥进行解密得到会话密钥

连接成功后,客户端和服务器通信,客户端对传输的数据使用会话密钥加密并使用公钥对数据摘要进行数字签名,一同传输给服务器;

Charles拦截到通信的数据,使用之前获得的会话密钥解密就能得到原始数据;

Charles同样也能篡改通信的数据:将篡改后的数据重新加密并重新生成摘要并使用之前获得的公钥进行数字签名,替换原本的签名,再传输给服务器;

服务器收取到数据,按正常流程解密验证;

服务器返回响应数据时,Charles也是类似拦截过程