Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

流量分析与漏洞利用

主角介绍

喜马拉雅旗下的小雅nano智能音箱,闲鱼买一个还是挺便宜的,用小雅app给音箱配网之后就可以使用了,注意需要使用2.4G网络。

开机流量分析

将音箱连接到电脑热点,抓取从音箱启动到完成一次用户对话过程中产生的流量进行分析。

  1. dhcp协议,获取ip地址,这里没啥。
  2. arp协议,解析ip地址到物理地址,这里也没啥。
  3. dns协议,从域名到ip,这里有进行dns劫持的机会。
  4. http协议,请求了api的服务,这里有进行中间人攻击的机会。
  5. 之后就是连接建立后的正常通信了,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连接的时候,握手的域名正是上面获得的地址。

image-20240308122743655

那梳理一下逻辑,在音箱开机的时候,完成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
2
192.168.137.1 api.xiaoyastar.com
192.168.137.1 xvstc.xiaoyastar.com

image-20240310235407004

反向代理

将流量转发到fiddler中做进一步篡改,请求涉及到的端口是80和443,所以将这两个端口上的流量劫持的fiddler即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const httpProxy = require("http-proxy")

// 设置中间人代理
const transponder = httpProxy.createProxyServer()
const middle = "http://127.0.0.1:8888" // Fiddler端口

function printCurrentTime() {
const now = new Date(); // 创建一个新的Date对象
console.log(now.toString()); // 打印当前时间
}

// 发送到fiddler
function transpose (req: any, res: any, head?: Buffer) {
printCurrentTime();
console.log(req.method, "http(s)://"+req.headers.host+req.url, "HTTP/"+req.httpVersion)
if (head === undefined) {
transponder.web(req, res, {
target: middle,
})
} else {
transponder.ws(req, res, head, {
target: middle,
})
}
}

// http 代理
import * as http from "http"
const http_proxy = http.createServer()
http_proxy.on("request", transpose)
http_proxy.on("upgrade", transpose)
http_proxy.listen(80, "0.0.0.0", function() {
console.log('HTTP proxy server is running')
})

// https 代理
import * as fs from "fs"
import * as https from "https"
const https_proxy = https.createServer({
key: fs.readFileSync('./cert/private_key.pem', 'utf-8'),
cert: fs.readFileSync('./cert/certificate.crt', 'utf-8'),
})
https_proxy.on("request", transpose)
https_proxy.on("upgrade", transpose)
https_proxy.listen(443, "0.0.0.0", function() {
console.log('HTTPS proxy server is running')
})

在进行https代理的时候,使用到了自签名证书,直接用openssl生成一份即可。

同时这份脚本使用的语言是typescript,可以直接运行也可以转成js的运行,运行需要下载对应的库文件啥的,按着报错走就行。

在运行时,可能会遇到报错80端口或者443端口占用,网上搜一下就有解决方法。

流量篡改

在fiddler中使用free http插件对请求的response body进行修改,start with参数是http://api.xiaoyastar.com/smart-os-ws-register/register/service/getbody modific参数是将wss://替换为ws://,最后记得在response rule中启用规则,ID那里一定要打勾。

free http插件网上随便找一个下载了放在fiddler的scripts文件夹下即可

最终效果

在进行攻击前,音箱通过wss进行安全通信,攻击后,音箱使用不安全的ws进行通信,攻击者可以通过监控流量来获取用户敏感信息。

references

记一次智能音箱任意控制漏洞挖掘

聊聊WS和WSS

浅谈WebSocket协议、WS协议和WSS协议原理及关系

你需要知道的“DNS劫持”–web安全篇(1)

本地dns服务器到底是什么?有没有精确的概念?

评论