ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 简介 证书是 https 里非常重要的主体,可用来识别对方是否可信,以及用其公钥做密钥交换。可以看见证书里面包含证书的颁发者,证书的使用者,证书的公钥,颁发者的签名等信息。其中 Issuer Name 是签发此证书的 CA 名称,用来指定签发证书的 CA 的可识别的唯一名称(DN, Distinguished Name),用于证书链的认证,这样通过各级实体证书的验证,逐渐上溯到链的终止点,即可信任的根 CA,如果到达终点在自己的信任列表内未发现可信任的 CA 则认为此证书不可信。 https 握手过程的证书校验环节就是为了识别证书的有效性唯一性等等,所以严格意义上来说 https 下不存在中间人攻击,**存在中间人攻击的前提条件是没有严格的对证书进行校验,或者人为的信任伪造证书**,下面一起看下几种常见的https“中间人攻击”场景。 ## 证书未校验 由于客户端没有做任何的证书校验,所以此时随意一张证书都可以进行中间人攻击,可以使用 burp 里的这个模块进行中间人攻击。通过浏览器查看实际的 https 证书,是一个自签名的伪造证书。 ## 部分校验 做了部分校验,例如在证书校验过程中只做了证书域名是否匹配的校验,可以使用 burp 的如下模块生成任意域名的伪造证书进行中间人攻击。实际生成的证书效果,如果只做了域名、证书是否过期等校验可轻松进行中间人攻击(由于 chrome 是做了证书校验的所以会提示证书不可信任)。 ## 证书链校验 如果客户端对证书链做了校验,那么攻击难度就会上升一个层次,此时需要人为的信任伪造的证书或者安装伪造的 CA 公钥证书从而间接信任伪造的证书,可以使用 burp 的如下模块进行中间人攻击。 可以看见浏览器是会报警告的,因为 burp 的根证书 PortSwigger CA 并不在浏览器可信任列表内,所以由它作为根证书签发的证书都是不能通过浏览器的证书校验的,如果将 PortSwigger CA 导入系统设置为可信任证书,那么浏览器将不会有任何警告。 ### 手机客户端 Https 数据包抓取 上述第一、二种情况不多加赘述,第三种情况就是我们经常使用的抓手机应用https 数据包的方法,即导入代理工具的公钥证书到手机里,再进行 https 数据包的抓取。导入手机的公钥证书在 android 平台上称之为受信任的凭据,可以看见是 Issuer 和 Subject 一样的自签名 CA 公钥证书,另外我们也可以通过证书类型就可以知道此为公钥证书,crt、der 格式的证书不支持存储私钥或证书路径(有兴趣的同学可查找证书相关信息)。导入 CA 公钥证书之后,参考上文的证书校验过程不难发现通过此方式能通过证书链校验,从而形成中间人攻击,客户端使用代理工具的公钥证书加密随机数,代理工具使用私钥解密并计算得到对称加密密钥,再对数据包进行解密即可抓取明文数据包。 ## 中间人攻击原理 一直在说中间人攻击,那么中间人攻击到底是怎么进行的呢,下面我们通过一个流行的 MITM 开源库 mitmproxy 来分析中间人攻击的原理。中间人攻击的关键在于 https 握手过程的 ClientKeyExchange,由于 pre key 交换的时候是使用服务器证书里的公钥进行加密,如果用的伪造证书的公钥,那么中间人就可以解开该密文得到 pre_master_secret 计算出用于对称加密算法的 master_key,从而获取到客户端发送的数据;然后中间人代理工具再使用其和服务端的master_key 加密传输给服务端;同样的服务器返回给客户端的数据也是经过中间人解密再加密,于是完整的 https 中间人攻击过程就形成了。 ## App 证书校验 app 证书校验已经是一个老生常谈的问题了,但是市场上还是有很多的 app 未做好证书校验,有些只做了部分校验,例如检查证书域名是否匹配证书是否过期,更多数的是根本就不做校验,于是就造成了中间人攻击。**做证书校验需要做完全,只做一部分都会导致中间人攻击,对于安全要求并不是特别高的 app 可使用如下校验方式:** 查看证书是否过期 服务器证书上的域名是否和服务器的实际域名相匹配 校验证书链