HTTPS 真的安全吗? 聊聊你可能不知道的中间人攻击
一款基于中间人攻击用于偷窥HTTPs网站流量的秘密代理工具
0x1 为什么是它?
我常用的网络分析工具有:Fiddler、Charles 、whistle 、WireShark 和 Tcpdump
Fiddler,Charles,whistle 处理的网络协议集中在OSI 中的应用层,Wireshark 和 Tcpdump能捕获所有的网路流量数据,经常用户定位二进制协议的网络故障,因此不在本文的比较之列。 Fiddler和Charles分别适用于windows&macOS,都有各自优点。whistle的一个特点是跨平台,能在windows和macOS上运行,而且以MIT的协议进行开源。保持Fiddler 和Charles优点的同时,还增加了不少的特性。如果你有兴趣,可以继续往下阅读。
0x2 简介
whistle是基于Node实现的跨平台web调试代理工具,whistle与所有的web调试代理工具一样,主要功能是用于查看、修改HTTP、HTTPS、Websockt的请求响应或者作为HTTP代理服务器,但不同于Fildder Willow、Charles通过断点的方式修改请求响应,whistle采用的是一种类似配置Hosts方式,通过配置修改请求响应数据,并且提供规则分组功能及通过域名、路径、正则三种匹配方式,特别的,针对终端调试提供了weinre,log等功能,并支持通过Node模块进行扩展。
0x3 抓包原理 Man-in-the-middle
Man-in-the-middle(中间人,简称为 MITM),能够与网络通讯两端分别创建连接,交换其收到的数据,使得通讯两端都认为自己直接与对方对话,事实上整个会话都被中间人所控制。简而言之,在真正的服务端看来,中间人是客户端;而真正的客户端会认为中间人是服务端。
实现中间人攻击有各种各样的手段,这里不展开讨论。一些常见的 HTTP/HTTPS 抓包调试工具,都是通过创建本地 Proxy 服务,再修改浏览器 Proxy 设置来达到拦截流量的目的,他们的工作原理与中间人攻击一致。我用过的这一类工具有:Fiddler、Charles 和 whistle。
本文主要讨论 HTTPS 中间人,简单示意如下:
代码语言:txt复制Server <---> Local Proxy <---> Browser
^ ^
HTTPS(1) HTTPS(2)
上述 HTTPS(1) 连接,是中间人冒充客户端,与服务端建立的连接,由于 HTTPS 服务端一般不认证客户端身份,这一步通常没有问题。而对于 HTTPS(2) 连接来说,中间人想要冒充服务端,必须拥有对应域名的证书私钥,而攻击者要拿到私钥,只能通过这些手段:1)去网站服务器上拿;2)从 CA 处签发证书;3)自己签发证书。
要防范前两点,需要网站做好各个方面的安全防护,从主机安全到网站安全(避免私钥被盗),从域名解析安全到域名邮箱安全(避免攻击者重签证书)。而攻击者自己签发的证书,无法通过系统内置根证书的验证,默认无法用于中间人攻击。
对于 whistle 这一类调试工具来说,能够解密 HTTPS 流量的关键在于他们会往系统受信任的根证书列表导入自己的证书,这样他们的自签证书就能被浏览器信任。进入 whistle 设置中的「HTTPS」Tab,勾选相关功能后,就可以顺利解密和修改 HTTPS 流量。这时在浏览器中可以看到这样的证书链:
0x4 快速开始
- 安装node
npm install -g node
- 安装whistle
npm install -g whistle
- 启动whistle
w2 start
whistle默认端口为8899,如果要修改端口号,可以这么启动:
w2 start -p 8888
重启whistle:
w2 restart
关闭whistle:
w2 stop
更多内容请查看命令行帮助:
w2 help
- 配置代理
whistle需要手动配置浏览器代理或者系统代理(代理的ip为whistle所在机器的ip,如果是本机就填127.0.0.1;端口号为启动时设置的端口号,默认为8899),这里我们使用chrome的代理插件(SwitchyOmega)
- 信任证书使得能够解密https流量
根据上面提到的原理,我们需要下载根证书,并且信任它,从来实现中间人攻击进行代理网络请求,从而实现我们的捕获数据解密
0x5 开始使用
在浏览器中输入 127.0.0.1:8899
#network 后,可以看到下面的界面
主要分为三个部分:
- 菜单栏,包括网络数据的导入导出通常都为text或者saz格式,后者是兼容fiddler的导入导出
- 主要内容,在这里面展示了我们发出的Http(s)请求,每一个条目都包含了
- Result: RFC2616 StatusCode
- Method: RFC2616 Method
- Protocal: Http(s) | ws(s)
- 点击主要内容中的任一个条目,在右侧会显示对应条目的请求和响应
0x6 场景一:捕获手机的网络数据包
如果我们需要在手机上对app进行抓包,那么同样的需要手机信任中间人生成的证书,在safari中打开地址http://192.168.0.4:8899这个地址,找到https选项,下载根证书并且信任它。 需要注意的是请确保你的电脑和手机处于同一个局域网。设置完成后,在手机上访问因特网的流量都会被安装在电脑上的wistle接管。所有的Http(s)流量在这个工具下一览无余。你可以尽情发挥你的想象力,去做那些富有创意的事情。祝你好运
0x7 场景二 : 调式websocket网络流量
除了基本的HTTP协议的流量检测,同时还支持websocket协议,在浏览器中打开ws测试网站,并发送一些文本消息.
然后回到最开始的流量监测tab页面,查看右侧的Frames,你会发现你刚刚发生的消息在这里全部显示出来了。
0x8 场景三: 重放数据
选中左侧条目,拖动到右侧,然后就可以在右边红色方框中看到选中数据包的详情,我们可以在Composer菜单项中修改请求体,对改次请求就行重放。这个方法常用于软件开发过程中的网络接口调试使用,尤其在操作路径很长的场景中,有了这个工具,我们可以很便捷的从中间步骤开始测试,而不是一次失败后,全部重新开始。某些情况下,还可以辅助系统测试专家对网站安全进行测试评估,通过修改参数的方式,验证网站的安全性。
0x9 场景四: 在线页面注入调式
0xa 更多资源
- https://github.com/avwo/whistle#documentation
- https://imququ.com/post/how-to-decrypt-https.html
- https://tools.ietf.org/html/rfc2616#page-36
- https://tools.ietf.org/html/rfc6455