前言
很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的。直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样。由于部分应用开发者忽视证书的校验,或者对非法证书处理不当,让我们的网络会话几乎暴露在攻击者面前。
下文会向大家展示的对IOS系统上2款常见的应用(知乎,360浏览器)进行MITM攻击,获取或篡改用户数据。
基本介绍
好在20几年前Https就出现了,在保证会话安全的同时也能很好的抵御中间人攻击(不过飘逸的应用开发者们总是能不经意的忽视这种保护)
网上对中间人攻击的介绍还算多,不过具体到实践的就相对要少很多(这里是指针对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】
如上图打开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热点,当然对于网络运营商我们也只能选择相信)
开发者只要正确的在所在平台的底层TLS库中开启证书校验,并对异常证书做合理处理,HTTPS还是相对安全的。
以上内容仅做交流,请勿用于实际网络攻击。
- 谈HTTPS中间人攻击与证书校验(二)
上文说到HTTPS的三次握手:http://www.cnblogs.com/wh4am1/p/6616851.html 不懂的再回头去看看 三.中间人攻击 https握手过程的证书校验环节就是为了识别 ...
- 谈HTTPS中间人攻击与证书校验(一)
一.前言 随着安全的普及,https通信应用越发广泛,但是由于对https不熟悉导致开发人员频繁错误的使用https,例如最常见的是未校验https证书从而导致“中间人攻击”,并且由于修复方案也一直是 ...
- Android安全之Https中间人攻击漏洞
Android安全之Https中间人攻击漏洞 0X01 概述 HTTPS,是一种网络安全传输协议,利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护交换数据的隐私与完整性. ...
- https中间人攻击
攻击过程: 服务器向客户端发送公钥. 攻击者截获公钥,保留在自己手上. 然后攻击者自己生成一个[伪造的]公钥,发给客户端. 客户端收到伪造的公钥后,生成加密hash值发给服务器. 攻击者获得加密has ...
- 基于HTTPS的中间人攻击-BaseProxy
前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...
- TLS是如何保障数据传输安全(中间人攻击)
前言 前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密这阐述,让我对这块原理有了更进 ...
- 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )
一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...
- 如何利用 LTE/4G 伪基站+GSM 中间人攻击攻破所有短信验证
这次公开课请来的嘉宾对自己的简介是: 连续创业失败的创业导师:伪天使投资人:某非知名私立大学创办人兼校长:业余时间在本校通信安全实验室打杂. 自从他在黑客大会上演讲<伪基站高级利用技术——彻底攻 ...
- Https协议简析及中间人攻击原理
1.基础知识 1.1 对称加密算法 对称加密算法的特点是加密密钥和解密密钥是同一把密钥K,且加解密速度快,典型的对称加密算法有DES.AES等 ...
随机推荐
- 听说你的MES系统又失败了?
前些日子,一位前同事跟我抱怨,他们做的MES系统,凉凉了.这样的话,我从不同人口中听到过不止一次. 我们做的系统,做到一半做不下去了...... 我们的系统,工人都不爱用...... 不只是MES,所 ...
- [.NET跨平台]Jexus独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...
- java~集合分组groupby的实现
对于数据聚合来说,分组操作是很常见的,在.net里有lambda和linq,而在java里也有lambda,现在我们来实现对一个集合进行分组. 一 准备工作,有两个类型 @Value class It ...
- 麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像
不管是游戏App,还是H5,又或者是微信小游戏.但凡接入了微信登录的应用,都可能需要显示微信头像. 在Cocos Creator中,我们常见的显示方法像下面这样 var headimg = 'http ...
- vue的父子组件间的相互传参props及props数据的多种验证机制
感觉自己即将完全步入前端大军,后台老板都不需要我弄了,塞翁失马...时间会告诉我们是好是坏 好了言归正传,最近vue是搞的不亦乐乎啊,下面来总结一下vue组件间的各种使用方法以及一些技巧 ------ ...
- java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)
前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...
- [转]How to Download and Setup Blue Prism
本文转自:https://www.hopetutors.com/blog/uncategorized/how-to-download-and-setup-blue-prism/ The Downloa ...
- c# Base64解密加密
private static string base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ...
- dubbo 2.7.0 中缺乏 <dubbo:annotation /> 的解决方案
一.背景 从 dubbo 2.6.5 升级到 2.7.0,突然发现好多地方不能用了,dubbo:annotation 直接报红,原先的 @Service 和 @Reference 中直接报了过时,源 ...
- 倒计时5S秒自动关闭弹窗
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...