前言
很早以前看过HTTPS
的介绍,并了解过TLS
的相关细节,也相信使用HTTPS
是相对安全可靠的。直到前段时间在验证https
代理通道连接时,搭建了MITM
环境,才发现事实并不是我想的那样。由于部分应用开发者忽视证书的校验,或者对非法证书处理不当,让我们的网络会话几乎暴露在攻击者面前。
下文会向大家展示的对IOS
系统上2款常见的应用(知乎,360浏览器)进行中间人攻击(Man-in-the-MiddleAttack
,简称“MITM
攻击”)攻击,获取或篡改用户数据。
基本介绍
中间人攻击(Man-in-the-MiddleAttack
,简称“MITM
攻击”)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。中间人攻击是一个(缺乏)相互认证的攻击。大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL
协议可以验证参与通讯的一方或双方使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。
网上对中间人攻击的介绍还算多,不过具体到实践的就相对要少很多(这里是指针对https
的中间人攻击实践)
上图简单的表述了中间人攻击的主要过程(上部为正常https
流量,下部为被劫持的https
流量),后面我们可以对着这个图来实施我们自己的中间人攻击。
准备中间人攻击
需要提前准备些简单常见工具:
1:Fiddler
(注意虽然Fiddler
抓取HTTPS
报文的实际原理就是MITM
,不过这里当然不是用Fiddler
实施中间人攻击。因为Fiddler
是自动完成的,也没有实践的意义,并且Fiddler
需要被攻击者自己提前导入并信任根证书)
2:一个已经申请SSL
证书的域名 (需要域名也意味着还需要一台代理该域名的nginx
服务器,这里之所以选择一个真实的域名主要是为尽可能了还原现实的场景,如果您没有域名也可以用ip
代替,不过证书还是要提前准备好)
这里用的是一个合法签发的DV
证书(网上其实可以很容易找到免费的证书),一般浏览器或客户端校验证书时,都会先检查证书是否是“受信任的根证书颁发机构”颁发,再检查SSL
证书中的证书吊销列表,再检查检查此SSL
证书是否过期,再检查SSL
证书的网站的域名是否与当前访问域名一致。如果使用一个合法签发的证书实际上可以通过大部分校验。
HTTPS
会话的发起是需要先建立SSL
通道的。
我们借助Fiddler
将所有HTTPS
的流量引导到我们自己的服务器【lulianqi.com
】
引导流量需要使用到FreeHttp
插件(https://www.cnblogs.com/lulia...可以在这里下载该插件),插件安装好后直接按下面截图配置即可(FreeHttp
本身具备强大的自定义报文篡改能力,如果有兴趣可以在前面链接处查看详细内容)。
如上图打开Fiddler
进入FreeHttp
插件页签,添加一个请求修改规则,点击确定,将规则添加到规则列表并勾选该规则,将其置为可用。(如果您没有域名也可以用ip
来代替,将http://lulianqi.com:443
换成http://
您服务器的ip:443
即可)(注意图中红色线框标记的地方,如以上设置启用规则)
这里简单说明下使用代理的HTTPS
请求会利用Connect
请求建立SSL
通道,我们修改Connect
连接目标即可(因为这个时候SSL
通道还没有建立,目标地址还是明文,我们可以直接修改,这样操作可以模拟网络中存在的攻击)
FreeHttp
默认跳过connect tunnels
,所以这里我们需要在设置项里设置is skip connect tunnels
为否(按图中提示操作即可)
然后是Fiddler
自己的设置
如上图,在Options
中配置仅捕获Connects
,上面也有提到实际上我们不需要Fiddler
进行中间人攻击,所以不用解密,也不用在客户端导入证书
最后我们需要配置我们的服务器【lulianqi.com
】上的nginx
(当然,在这之前您的nginx
需要在服务器上先安装并配置好网络)
如上图我们直接在nginx
中添加一个server
用于劫持会话(我们自己的域名要解析过来),证书使用的是lulianqi.com
的一个dv
证书。
这个nginx
实际是就是中间人了,现在我们的中间人仅仅劫持流量(即被动网络攻击),但一旦流量到了我们的服务器而且SSL
通道是与我们的服务器建立的,即表示我们可以任意的处理这些流量,随时都可以进行主动网络攻击。
实施中间人攻击
所有准备工作做完了我们就可以看下中间人攻击的效果了
TLS
对中间人攻击的抵御
当然正常情况下,我们的网络安全肯定不会这么脆弱,所以暂时我们在下面看到的是在一切正常的情况下,看浏览器是如何借助HTTPS(LTS)
抵御中间人攻击的
用浏览器访问https://www.baidu.com
得利于TLS
证书体系,虽然我们能发起中间人攻击,不过浏览器察觉到了证书的异常(这个时候就怕你点继续浏览)
浏览器如何知道当前通道存在风险的,浏览器一开始就知道自己需要连接的主机是www.baidu.com
,我们虽然通过网络劫持的方式让浏览器以为我们的中间人服务器就是www.baidu.com
,不过我们的中间人服务器却没有www.baidu.com
的证书,所以我们依然使用了lulianqi.com
的证书,前面我们也提到过了浏览器等客户端会检查“受信任的根证书颁发机构”,证书吊销列表,SSL
证书是否过期,证书签发的域名。最后浏览器发现我们证书签发的域名不是www.baidu.com
,自然就知道了当前网络的风险,然后停止发送真实业务请求,并向用户提示或询问。
(证书的校验有赖于CA
,而CA
一般都是比较权威的组织机构,我们选择信任他们)
如果用户执意访问,就会出现如上图证书提示的错误,但同样意味着您可能正处于攻击下(事实上的确如此)
然后我们我服务器就完美的劫持了用户的会话,所有信息都暴露了(所以遇到这样的提示还是不要点确认比较好)
补充说明下上图及下文中类似的图片都是中间人服务器nginx
的访问日志,如果日志中出现相应请求报文,即表示中间人攻击实施成功。
这里顺便看下Chrome
的表现
Chrome
明显对HSTS
处理更为出色。因为对于已经开启严格安全传输HSTS
的www.baidu.com
,浏览器发现证书错误后,Chrome
的做法是直接禁止访问,而Edge依然可以通过询问的方式继续访问
上面的实例演示了中间人攻击发起的基本过程,及浏览器是如何通过证书体系来抵御中间人攻击的。(HTTPS
对中间人攻击的抵御)
还有一点需要说明上文及下文提到的流量或对话都是指HTTPS
,如果您使用的是http
那么风险随时都在。
无法抵御中间人攻击的实例(知乎,360浏览器)
现实中我们被手机陪伴的时间明显更多,我们下面来看下手机上移动应用是否能抵御这种中间人攻击。
许多应用使用HTTPS
与后端进行通信,这种做法在系统程序,网站及移动应用中非常常见。不幸的是,应用开发者往往没有正确的对证书进行校验,这样系统实际对攻击者敞开了怀抱。
QA
流程应该包括证书校验方面的测试。
首先我们将手机连上Fiddler
代理(注意这里我们不需要让手机安装或信任任何第三方证书)
我们尝试着如日常生活一样使用手机(注意这里测试使用的都是IOS
上APP
)
大部分应用出现了无法访问,弹出式安全提示等反应
不过不幸的是仍然有一些应用无视了证书的保护,直接与危险的中间人服务器建立了连接,并向用户正常的显示了页面等数据。
下面列几个代表性强的APP
进行说明 (这里不是特意选择这些APP
,只是我手机中正好安装有,而且个人认为这些APP
大家也比较常用)
1:知乎 (IOS版 4.34.1(1228) )#
可以清楚看到知乎是完全无视了证书不匹配的错误,与没有受到MITM
时表现是一样的,正常访问,正常提交数据。但事实却是所有流量都是通过中间人服务器转发到知乎的,中间服务器解密了所有流量,并且可以对其进行篡改。更糟的是这一切发生的时候,用户是完全不知情的。简单的说就是当您在使用知乎APP
浏览或发帖时,网络节点中的任何别有用心的人都是可以获取您在浏览的内容,并对其进行修改。(这样的描述一点都不夸张,后面会说明实际MITM
中,也不会需要您的手机提前连接Fiddler
代理,有许多可行且更隐秘的方式可以将流量引入中间人服务器。如果应用不能识别到分享,就会跟上面描述的情况一样)
2:360浏览器(IOS
版本360浏览器 4.0.10)
其实某款特定APP
由于自身安全问题不能抵御MITM
,最多也只会影响到自己的APP
及自己的用户,不过浏览器如果出现这种问题就会对使用者所有浏览的网站都有影响
特别是以安全为一大卖点的360,其自家浏览器的安全策略让人无法理解
上面的截图来自使用360
浏览器分别浏览baidu
及apple
的情况,可以看到使用360手机浏览器浏览网页(开启https
的网站),在受到MITM
时只有一个不起眼的变化,那个原本应该是绿色的小盾牌变成了灰色,并且没有向用户进行任何询问,直接就建立了不安全的SSL
通道,后面的情况就很惊悚了,所有使用360手机浏览器浏览的内容全部被中间人服务器劫持。
一开始自己也并不相信360手机浏览器会直接无视证书错误,不向用户询问。特意找了另一台没有安装过360手机浏览器的手机(iphone6
),在AppStore
里下载了新版本的360手机浏览器测试,结果是一样的,除了那个不起眼的灰色小盾牌完全无视了证书域名不匹配的错误。(顺便提一下上面的知乎也一样,都用新手机测试过,的确有安全问题)
3:其他APP
当然我在自己手机了不只发现上面2款APP
存在上面的问题,还有许多APP
存在类似的问题,包括个别金融类应用,还有部分APP
部分模块的流量存在被劫持的风险。这里也就不一一列出。
通过上面的实践可以看出我们平时使用的网络并不安全,部分开发者忽视证书校验,或对证书异常处理不当,导致本来十分有效LTS
失去原本的防御能力。
改进
还是强调下,个人对于上面提到的2款App
(知乎,360浏览器)并没有恶意,只是借此说明下当前网络大环境下确实存在的一些安全风险。
也希望2款APP
的相关开发者看到后,可以及时改进,为用户提供更安全的使用环境。
以上实践测试环境(大家可以此重新上面的效果)
- 手机:
iphone6
(10.3.3) ,iphone6s
(11.3.1),iphone8 plus
(11.2.1) - 服务器:
CentOS
(7.3)nginx
(1.10.3) - 以上测试的2款应用均是苹果版本的
APP
- 知乎 (4.34.1)
- 360手机浏览器(4.0.10)
上述中间人攻击实践中使用到了Fiddler
及FreeHttp
插件仅是为了方便控制及调试中间人攻击的状态,实际操作中并不需要Fiddler
,也就是说你的手机不需要连接任何代理,因为往往流量的劫持发生在更隐蔽的网络节点中,如链路中的网络设备完全可以在无感的情况下将经过自己的流量先转发到中间人服务器,或者这种劫持也可能由DNS
解析引起,您可以尝试修改host
文件模拟dns
劫持将目标域名指向中间人服务器同样可以得到上面的结果。
事实上ARP
欺骗,WPAD
劫持,DNS
劫持,BGP
路由劫持,都会为这种中间人攻击创造条件(作为网络设备的控制者实施起来就更容易了,所以不要连接不认识的wifi
热点,当然对于网络运营商我们也只能选择相信)
ssltrip2
可以通过arp
欺骗篡改响应页面内容,将https
降级为http
做劫持,曲线救国。这种攻击利用的是很多网站并没有关掉http
访问,而是在服务端将首页从http
跳到https
,给了攻击者一个http
响应做突破口。不过这种攻击也可以防御,启用hsts
和pre load
就行了,让攻击者找不到任何http
的机会。
开发者只要正确的在所在平台的底层TLS
库中开启证书校验,并对异常证书做合理处理,HTTPS
还是相对安全的。
以上内容仅做交流,请勿用于实际网络攻击。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。