iOS之Charles抓包原理(上)

637 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

前言

最近有测试同事问我,为什么你打的包可以捉包,线上的包就不能捉包呢?我曾经写过一篇 Charles安装和配置HTTPS证书,是说如何去使用Charles来实现捉包的,那今天我们就来聊聊为什么Charles如何捉包

捉包原理

正常来说我们客户端和服务端进行连接,然后开始传输收据。那现在Charles作为中间人,就变成了客户端 <-> Charles <-> 服务端了。

Charles相当于在客户端给服务器端发消息的时候拦截请求,然后伪装成客户端与服务器进行通信。同理,服务器返回数据给客户端的时候,也会拦截然后伪装成服务器与客户端进行通信。

所以为了数据安全,现在一般都是用HTTPS进行传输数据。

那我们就会安装Charles根证书到手机上,然后进行信任,也可以拦截HTTPS传输数据,那时如何做到的呢?

image.png

下面我们就描写一下流程:

  1. 当客户端对服务端建立连接的时候,因为设置了代理,就会被Charles拦截到服务器返回的证书A,这个证书是包含给客服端的公钥A私钥A是留在服务端。

  2. 拦截到证书后,Charles就会动态生成一张伪造证书B,用的是Charles公钥B,代替服务端的证书A来发给客户端。

  3. 客户端收到Charles证书B,因为我们手机是信任Charles根证书的,根据信任链,所以会通过验证通过。

  4. 验证通过后,客户端生成一个对称加密的密钥X,然后用Charles公钥B加密后传送给服务端。当然这步也会被Charles拦截。

  5. 这时候,Charles就可以用自己的私钥B来解密,就能得到对称加密的密钥X

  6. 拿到密钥X后,就可以解析出真实数据出来。再用原来服务端的公钥A密钥X进行加密,传输给服务端。

  7. 服务端用拿到后用私钥A进行解密,得到对称加密的密钥x

就这样,Charles就神不知鬼不觉的实现获取数据,甚至可以删改数据,客户端和服务端都不会发现异常,这就是中间人攻击

流程图

Snipaste_2022-01-19_10-32-39.png

疑问

那我们如何能防止中间人攻击呢?

中间人通过掉包服务器传来的公钥,进而得到了密钥X。根本原因是客户端无法确认收到的公钥是不是服务端的公钥

那下一篇文章,我们就来聊聊如何防止Charles捉包。