【Network】Charles 为什么可以获取 HTTPS 包内容

Posted by 西维蜀黍 on 2019-05-31, Last Modified on 2022-03-10

背景

之前,我们在【Security】HTTPS【Security】安全的 HTTP 的演化中介绍了HTTPS的工作原理,HTTPS的一个重要的作用,就是防止中间人攻击(Man-in-the-Middle Attack,MITM)。

然而,不知道你有没有考虑过,作为一个常用的macOS下抓包工具 - Charles,它是如何获取到HTTPS包中明文内容的。

比如,当我访问https://github.com 后,我能够在Charles里获取到首页对应的html的内容,如下所示:

分析

我们知道,在我们能让Charles抓取HTTPS包之前,需要进行"Install Charles Certificate"操作,而关键就在这里。

来看看 Charles对这个Certificate的解释:

Charles can be used as a man-in-the-middle HTTPS proxy, enabling you to view in plain text the communication between web browser and SSL web server.

Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings

重点在于,当我们访问一个网站时(比如GitHub),Charles为会这个网站动态生成一张CA证书,这张由Charles动态生成的CA证书是能通过Charles Root Certificate验证的。

我们知道,操作系统都内置了多个根证书(如下所示):

进行"Install Charles Certificate"操作,其实就是向操作系统添加一张根证书,根证书信息如下所示:

而所有的站点证书都基于证书链验证机制(如下图所示),即站点证书需要通过根证书的验证(否则,在浏览器中会提示当前访问网站不安全)。

验证分析

在未打开Charles时,我们访问https://github.com,可以看到当前github的网站证书是由DigiCert(权威CA)签发的。自然地,也由DigiCert 的根证书来验证。

而在打开Charles之后,我们再次访问https://github.com,可以看到,这个github的网站证书其实是在我们访问时,由Charles动态生成的,更准确地说,是通过Charles导入操作系统的根证书进行签发的。

启发

Charles其实就是一个支持HTTPS的中间人攻击(Man-in-the-Middle Attack,MITM)工具,而支持HTTPS的关键在于,我们需要向被攻击者的操作系统中添加我们的根证书。

同时,这也说明了HTTPS机制的安全性是基于客户端操作系统中根证书的正常性所保证的,换句话说,如果被攻击者在无意识的情况下,被攻击者向其其中添加了"攻击"根证书。

这种无意识的情况,可以通过很多种方式来实现,比如我们使用Adobe破解工具时,它请求了root权限,理论上,它也有可能向我们的操作系统中添加"攻击"根证书。

Reference