一款基于中间人攻击用于偷窥HTTPs网站流量的秘密代理工具

2022-11-16 22:56:54 浏览数 (1)

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 快速开始

  1. 安装node
代码语言:txt复制
npm install -g node
  1. 安装whistle
代码语言:txt复制
npm install -g whistle
  1. 启动whistle
代码语言:txt复制
w2 start
whistle默认端口为8899,如果要修改端口号,可以这么启动:
w2 start -p 8888
重启whistle:
w2 restart
关闭whistle:
w2 stop
更多内容请查看命令行帮助:
w2 help
  1. 配置代理
代码语言:txt复制
whistle需要手动配置浏览器代理或者系统代理(代理的ip为whistle所在机器的ip,如果是本机就填127.0.0.1;端口号为启动时设置的端口号,默认为8899),这里我们使用chrome的代理插件(SwitchyOmega)
  1. 信任证书使得能够解密https流量
代码语言:txt复制
根据上面提到的原理,我们需要下载根证书,并且信任它,从来实现中间人攻击进行代理网络请求,从而实现我们的捕获数据解密

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

0 人点赞