https站点劫持的攻击方法探讨

之前文章中已经讲过https的基本原理,理解了https原理后,下面我想到了几种https网站劫持的攻击方法。经过分析之后,我的感受是: 其实这个世界上并没有绝对安全的银弹。

黑客用自己的证书+自己的域名

方法描述: 黑客精心做一个类似于qq.com的网站: oq.com, 并且给自己的网站申请https证书。粗心的用户打开这个长得很像qq.com的网站时,看到浏览器中亮起了绿色的小锁,误以为是安全的qq网站。

这方法相当于做一个钓鱼网站,这里所有https证书都是黑客自己的,并没有入侵一说。仅仅是钓鱼而已。对待这种攻击,我们平常要非常小心的去看下地址栏里的网址,不要打开陌生人给的链接。

证书劫持+用自己的域名

这样做是毫无意义的,因为既然黑客要用自己的域名钓鱼了,直接用自己的证书就行了,干嘛要去窃取目标网站的证书。。。

不过从技术上来看的话,由于服务器证书是可以公开的,访问网站服务器自动就会把证书发送给浏览器。 所以我们确实可以劫持目标网站传来的证书,把证书拿来作为自己钓鱼网站的证书来使用。
但这样浏览器会报错的,别忘了https原理中我们讲到的证书校验的三步骤;浏览器校验时除了验证证书本身是否是CA机构颁发的,而且要验证证书内容和当前访问的网站是否一致,如果不一致也会爆出证书错误的提示的。

如果用户看到浏览器警告证书错误后,依然点击 继续访问 那这样花样作死的行为谁也挡不住。

域名劫持+用自己的证书

例如黑客将域名劫持,指向自己的服务器,自己服务器上放置自己生成的私有证书(黑客只能这样做,因为他没有域名控制权是无法向CA机构申请该域名的证书的)。 这种情况浏览器会报错吗?

答案是肯定的,你自己造一个hack.com域名的合法CA证书,在浏览器端对证书进行签名校验时会发现这个证书不属于全球公认的合法CA机构颁发的, 会报出证书错误

DNS域名劫持+证书劫持

上面方法还是有缺陷的,会因为证书和网站信息不匹配而被浏览器警告,毕竟现在浏览器的警告做的越来越鲜艳,我们不能指望小白用户去点击继续访问。

所以,我又想到一个办法,我们能否既把用户的DNS劫持掉、也把目标网站的证书也劫持掉,直接让他们访问目标网站时指向我的服务器,而且还用的是他访问的目标网站的合法证书呢?

  • DNS劫持这一步,显然是可以的做到,而且现在越来越简单可以做到;

  • 盗取真实网站的证书也是可以的,毕竟证书是公开的。

然而,要实现https欺骗还是不行。因为虽然我们劫持了目标网站的证书,但是我们没有目标服务器的私钥。 所以尽管在客户端进行证书验证阶段确实是能欺骗成功的,但由于握手阶段计算sessionkey(后续会话秘钥key)的时候,是有一次对随机数的非对称解密的(客户端会使用公钥加密一个随机数给服务器,服务器把它解密出来作为会话秘钥的一个算法来源)。

此时作为中间人你是无法解开客户端用真正网站服务器的公钥加密过的随机数的;这就导致SSL握手的第四步无法完成。我司的https专家罗成也告诉我,这会爆出 SSL连接错误; 好吧,我们又不能优雅的进行入侵了。

域名入侵

域名入侵这个应该不能简单的理解为劫持了,而是直接入侵目标网站的域名服务器或者域名账户控制权。黑客通过拿到域名控制权然后去CA机构给自己的公钥申请数字证书,则黑客就可以拿到 合法 的一本证书,而且黑客是拥有跟这个证书匹配的私钥的。

有了这些,下一步就只需要通过DNS劫持等手段,让用户访问到黑客的服务器了。 然而,连域名都入侵了,我们还需要DNS劫持吗,显然不需要了,此时直接把域名指向我们自己的服务器就行了。

当然,这个几乎不可能发生,毕竟第一域名是比较难入侵而且能持续很长时间不被发现的;另外即使入侵了域名,你想重新申请到CA证书也是比较难的,因为知名公司的CA证书申请都是要提交营业执照等东西的。 但事实上在国外还真的发生过一起针对银行的大型攻击事件,黑客真的做到了 http://news.cnblogs.com/n/567978

中间人证书欺骗攻击

既然上面的方法都那么难,还有什么办法可以攻击呢。这时候,我们想到了一种 中间人攻击 的手法。

所谓中间人攻击,就是我们DNS劫持后,我们自己不对用户提供Web服务,我们作为一个中转,当用户请求过来时,我们给用户提供一个用自己的私钥颁发的私有的假的证书(当然这个假证书肯定会导致用户这边发出证书不是CA机构颁发的警告,我们要通过其他办法来让用户继续访问这个网站)

只要用户信任了中间人的证书,这样中间人跟用户建立https连接后,用户的信息对中间人来说是可解析的(因为中间人是拥有此本证书私钥的,可以正常管理当前建立的这个https连接);

然后用户跟中间人建立握手连接的过程中,中间人顺便跟后方的目标服务器建立一个同样的https连接(此时中间人的角色是客户端);接下来,用户SSL握手的所有请求以及后续的内容请求,中间人都在中间负责做内容中转–即先解析出明文再传递给另外一端。

显然这种方法,是可以窃取到https的信息明文的。当然,唯一需要你做的,就是取用户电脑上帮他点一下 “继续浏览”…. 其实这就是mac上的charles对https抓包的原理, 所以如果你的手机需要抓包,则需要在手机上安装Charles的证书。 (如果你是windows用户,则fiddler的原理也是一样的)

更牛逼的攻击

当然,还有更牛逼的办法,比如httpsStrip等。具体可以展开更多的学习讨论了https://www.zhihu.com/question/22779469