如何用 Charles 抓 HTTPS 的包?其中原理和流程是什么?什么又是中间人攻击?

百家 作者:iOS开发 2018-11-10 13:54:56

Linux编程
点击右侧关注,免费入门到精通!



作者丨彭序猿
https://www.jianshu.com/p/210c296eb836


如何用 Charles 抓 HTTPS 的包?其中原理和流程是什么?


前言


我们可以通过网络抓包,来分析网络请求和响应数据,甚至是可以修改请求或者响应来达到我们特殊的需求。在 Mac 环境下,一般使用 Charles 工具来进行网络抓包,当然 Charles 工具还提供了非常多其它实用的功能,在这里我们就只分析 Charles 是如何抓 HTTPS 的包的。

面对这个问题,我们首先需要了解 HTTP 通讯的流程,然后再引出 HTTPS 是什么,最后我们再看 Charles 工具是如何抓取 HTTPS 的包的。


HTTP 通讯过程及缺点


HTTP 超文本传输协议,是属于 TCP/IP 分层中的应用层,位于传输层之上(提供网络连接计算机之间的数据传输)。前面我们也知道,HTTP 为了快速的处理大量事务,确保协议的可伸缩性,所以设计的很简单:将 HTTP 的报文丢给传输层,利用传输层的 TCP 协议或者 UDP 协议来进行数据传输,然后再利用网络层的 IP 协议和数据链路层来进行最终的数据包传输。


这里我们主要看应用层和传输层:对于传输层,直接将应用层 HTTP 报文封装,然后直接传输,在这里不会做数据的加密,不会验证通信双方的身份,也不会校验报文的完整性。所以会导致一下问题:


1.由于通信报文是使用明文传输的,所以内容很容易被窃听。


2.由于不验证通信双方身份,这里很容易遭遇伪装(伪装服务器或者伪装客户端等),服务器也容易遭受 Dos 攻击。


3.不校验报文的完整性,会出现篡改报文信息的情况。


对于以上出现的问题,我们有必要对传输的报文做加密处理,校验报文的完整性,以及验证通信双方的身份。


HTTPS 通讯过程


对于上面 HTTP 出现的问题,我们需要定制一些机制和协议来完善:HTTP + 加密 + 认证 + 完整性保护 = HTTPS。然后就有了 SSL/TLS 协议,它处于应用层和传输层之间,在这里我们可以体会到分层的好处:可以很方便的扩展原有的功能。分层结构如下:



这里我们先不描述传输层 TCP 协议是如何进行三次握手(建立连接)和四次挥手(断开连接),我们直接描述 HTTPS 的通信流程:


1.对于报文的加密:有对称加密和非对称加密方式,HTTPS 采用混合加密机制,在交换密钥环节,使用非对称加密,在之后通信交换报文阶段则使用对称加密方式。

2.对于验证通信双方身份:使用 CA 证书来校验身份。

3.SSL 协议具有完整性校验

HTTPS 大概流程如下,详细的流程图可以参考下文末链接;


1.客户端将自己支持的加密算法发送给服务器,请求服务器证书;


2.服务器选取一组加密算法,并将证书返回给客户端;


3.客户端校验证书合法性,生成随机对称密钥,用公钥加密后发送给服务器;


4.服务器用私钥解密出对称密钥,返回一个响应,HTTPS连接建立完成;


5.随后双方通过这个对称密钥进行安全的数据通信。


Charles 抓包原理


Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析(这里类似中间人攻击)。配合 Charles 的 SSL 功能,Charles 还可以分析 HTTPS 协议。


对于如何使用 Charles 工具,可以参考这篇博客:Charles 从入门到精通

https://blog.devtang.com/2015/11/14/charles-introduction/


Charles 抓取 HTTPS 原理及流程


前面说过,HTTPS 可以有效防止中间人攻击,那 Charles 是如何抓取 HTTPS 包的呢


Charles 作为一个“中间人代理”,当浏览器和服务器通信时,Charles接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。


这里有个大前提,就是客户端信任了 Charles 自己制作的证书,然后导致 Charles 拿到 CA 证书和对称加密的公开密钥;这里我们简单总结下:


1.首先 Charles 假冒了客户端,拿到服务器的 CA 证书


2.然后 Charles 假冒了服务器,给客户端发送了一张自己制作的证书,客户端信任该证书


3.Charles 再次假冒服务器,拿到客户端的对称密钥


4.Charles 再次假冒客户端,将对称密钥加密发送给服务器,让服务器认为这次通信是没问题的,服务器发送成功响应


5.最后 Charles 假冒服务器将成功响应发给客户端


6.建立连接,客户端与 Charles 建立连接,Charles 与服务器建立连接(中间人攻击)


详细图文流程:浅谈Charles抓取HTTPS原理

https://www.jianshu.com/p/405f9d76f8c4


总结


Charles 抓包,主要用的是中间人攻击。对于 HTTP 的话,可以直接抓取,但是对于 HTTPS,就需要在建立 HTTPS 连接的时候(SSL 连接),偷取证书和密钥。


iOS 面试题·什么是中间人攻击?如何避免?


前言


中间人攻击的定义:中间人攻击是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。


简单来说,攻击者在请求和响应传输途中,拦截并篡改内容。对于 HTTP 来说,由于设计的简单,不需要太多步骤就可以进行监听和修改报文;在这里主要是针对 HTTPS,HTTPS 使用了 SSL 加密协议,是一种非常安全的机制,目前并没有方法直接对这个协议进行攻击,一般都是在建立 SSL 连接时,利用中间人获取到 CA证书、非对称加密的公钥、对称加密的密钥;有了这些条件,就可以对请求和响应进行拦截和篡改。


中间人攻击需要截获请求响应


对于中间人攻击,有一个前提就是:需要截获到客户端与服务器通信的线路。


抓包工具一般都是用户主动将其设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。


对于其它工具则是利用 DNS欺骗、ARP投毒、劫持网关等手段,将客户端的请求重定向到攻击者的机器,以便进行网络抓包。


SSL 证书欺骗攻击


SSL 证书欺骗攻击流程大概如下:


1.截获客户端与服务器通信的通道


2.然后在 SSL 建立连接的时候,进行中间人攻击


3.将自己伪装成客户端,获取到服务器真实有效的 CA 证书(非对称加密的公钥)


4.将自己伪装成服务器,获取到客服端的之后通信的密钥(对称加密的密钥)


5.有了证书和密钥就可以监听之后通信的内容了




这个避免方法就是:


客户端不要轻易信任证书


App 可以提前预埋证书在本地


SSL 剥离攻击


SSL 剥离就是将客户端的 HTTPS 请求降级成 HTTP 请求,阻止 HTTP 请求重定向成 HTTPS ,流程图如下:



总结


中间人攻击主要是伪装身份,然后截取通信的内容,对于 HTTP 是可以很轻松的截获;但是对于 HTTPS,主要是在建立 SSL 连接的时候,骗取到证书和密钥;流程不是很复杂,但是这个里面会涉及到比较多的知识点。


这块知识我自己是比较匮乏的,也就只能做粗浅的总结,依旧,参考文献很棒棒。


参考文献


中间人攻击

https://zh.wikipedia.org/wiki/中间人攻击


MITM攻击(中间人攻击)

https://www.jianshu.com/p/a825de42ccbc


HTTPS连接过程以及中间人攻击劫持

http://netsecurity.51cto.com/art/201712/559836.htm


中间人攻击(MITM)姿势总结

https://www.cnblogs.com/LittleHann/p/3735602.html


 推荐↓↓↓ 

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接