流量分析与漏洞利用
主角介绍
喜马拉雅旗下的小雅nano
智能音箱,闲鱼买一个还是挺便宜的,用小雅app给音箱配网之后就可以使用了,注意需要使用2.4G网络。
开机流量分析
将音箱连接到电脑热点,抓取从音箱启动到完成一次用户对话过程中产生的流量进行分析。
- dhcp协议,获取ip地址,这里没啥。
- arp协议,解析ip地址到物理地址,这里也没啥。
- dns协议,从域名到ip,这里有进行dns劫持的机会。
- http协议,请求了api的服务,这里有进行中间人攻击的机会。
- 之后就是连接建立后的正常通信了,TLS加密,没有利用机会。
中间人攻击思路
出现http请求肯定是要重点关注的,毕竟http明文传输,可以利用的空间大。
根据请求的格式GET /smart-os-ws-register/register/service/get?
来看,似乎是在请求音箱的服务,这和返回的一长串websocket地址和api地址正好能够对应。
wss协议
是负责客户端和服务端的数据传输,在进行tcp握手之后,可建立长连接,允许服务器和客户端进行双向数据传输。考虑到wss的作用,推测这是音箱与服务器的语音交互的连接,当用户通过音箱使用语音对话服务的时候,使用的就是wss建立的长连接。
WebSocket (WS)是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,能更好地节省服务器资源和带宽并达到实时通讯。WebSocket建立在TCP之上,同HTTP一样通过TCP来传输数据,但是它和HTTP最大不同是:WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/Client Agent都能主动的向对方发送或接收数据,就像Socket一样;WebSocket需要类似TCP的客户端和服务器端通过握手连接,连接成功后才能相互通信。WSS(Web Socket Secure)是WebSocket的加密版本。
WS协议和WSS协议两个均是WebSocket协议的SCHEME,两者一个是非安全的,一个是安全的。也是统一的资源标志符。就好比HTTP协议和HTTPS协议的差别。非安全的没有证书,安全的需要SSL证书。其中WSS表示在TLS之上的WebSocket。WS一般默认是80端口,而WSS默认是443端口,大多数网站用的就是80和433端口。
那真正的交互使用的是不是本次http请求获得的地址呢,看一眼后面的流量,在建立TLS连接的时候,握手的域名正是上面获得的地址。
那梳理一下逻辑,在音箱开机的时候,完成dhcp+arp+dns之后,通过http协议来请求了进行交互的云服务地址,这次请求获得的地址用在了音箱之后的对话长连接中。那么如果可以控制这条http请求,对请求的response的进行篡改,强行把wss降级到ws,那么就可以通过中间人攻击来对音箱进行监听了。
这里我不知道大佬是怎么看出可以进行降级攻击的,毕竟这里并没有给出ws的连接,只给了wss的,理论上服务器能够接收的连接是都得给出来让用户选择的,但这或许就是理论与实际的区别。
并且在我的返回地址中,ws05直接给的是ws://,大佬的博客里面显示的是wss://,这一点我不知道是为啥,或许是我之前已经进行过攻击了,攻击后连接的正是ws://ws05,所以这里服务器直接给我返回ws://了?这一点想不通,或许可以买个音箱再试一试…
想要控制http的话,就得能拦截到其对应的流量,如果是在自己的笔记本上开热点进行的话,直接修改hosts文件就行了;但如果是在公网上进行的话(假设已经获取了路由器的控制权),需要有个自己的攻击服务器,然后将流量劫持到服务器上进行修改。
不管是内网还是公网,第一步都是进行dns劫持,将请求的地址转发到攻击服务器上。
这里有一个点,大佬博客里说只有在没有内置dns服务器的情况下才能进行dns劫持,如何判断呢,其实看一下流量数据就行了,根据抓取到的dns流量,通信发生的双方是音箱与电脑自身,也就是说走了电脑的dns,可以直接通过修改hosts文件的方法来进行dns劫持。
实现(本地测试)
先在本地环境进行测试。
DNS劫持
在获取wsDomainNames
的时候,请求的Host是api.xiaoyastar.com
,所以需要将该地址劫持到本地。在本机hosts文件中插入一条192.168.137.1 api.xiaoyastar.com
。再因为请求wsDomainName
时,请求Host是xvstc.xiaoyastar.com
,所以再在hosts文件中加一条192.168.137.1 xvstc.xiaoyastar.com
。
1 | 192.168.137.1 api.xiaoyastar.com |
反向代理
将流量转发到fiddler中做进一步篡改,请求涉及到的端口是80和443,所以将这两个端口上的流量劫持的fiddler即可。
1 | const httpProxy = require("http-proxy") |
在进行https代理的时候,使用到了自签名证书,直接用openssl生成一份即可。
同时这份脚本使用的语言是typescript,可以直接运行也可以转成js的运行,运行需要下载对应的库文件啥的,按着报错走就行。
在运行时,可能会遇到报错80端口或者443端口占用,网上搜一下就有解决方法。
流量篡改
在fiddler中使用free http
插件对请求的response body
进行修改,start with
参数是http://api.xiaoyastar.com/smart-os-ws-register/register/service/get
,body modific
参数是将wss://
替换为ws://
,最后记得在response rule
中启用规则,ID
那里一定要打勾。
free http插件网上随便找一个下载了放在fiddler的scripts文件夹下即可
最终效果
在进行攻击前,音箱通过wss
进行安全通信,攻击后,音箱使用不安全的ws
进行通信,攻击者可以通过监控流量来获取用户敏感信息。