大家好,我是银基Tiger Team的BaCde。上一篇 物联网安全之MQTT协议安全 主要介绍了MQTT安全的一些基础知识。今天将在上一篇基础上来说说实战中MQTT的利用。
在整个物联网或车联网架构中,MQTT的部分通常应用在移动端、管理端、Web端、设备端。而MQTT协议中的三种角色是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER)。发布者(PUBLISHER)和订阅者(SUBCRIBER)通过代理(BROKER)来发布和订阅消息。这两个角色在实际场景中主要应用是移动端、Web端、设备端;代理(BROKER)一般是服务器,可以由activemq、hivemq、emqx等许多软件来搭建。在开发过程中,不同的设备,技术特点也有所不同。其使用的协议除了mqtt外,Web端通常使用websocket的方式来进行收发消息。
0x00 获取MQTT认证信息
目前对于MQTT的开发中的安全还尚未受到广泛关注,这使得有多种方式在移动端、Web端、设备端获取到MQTT的认证与连接信息。通过获取的信息来进一步实现越权访问、发布恶意内容等攻击。
由于设备方面暂未找到案例,这里将以Web端和移动端案例来进行说明。
开发的一点知识
通过查阅一些开发资料,可以发现常见的几个MQTT的javascript库:Paho.js、MQTT.js、mqtt-elements、MQTT.DART
在实际的研究过程中发现尤其以paho.js居多。在实际的渗透过程中需要多留意,使用本库基本可以确定Web端应用了MQTT的。以下我就介绍几个获取MQTT的几个小技巧。
实战工具
* Chrome 浏览器
* Burp Suite
* source detecotor
好了,有了这几个就够了。开始我们的实战之旅。
获取方法
1、web应用中直接捕获
在浏览目标时我一般会打开Chrome浏览器的开发者调试工具,通过查看请求信息或这直接搜索mqtt的字样来确定是否使用MQTT的javascript文件。另外一个就是可以查看websockets请求看是否有进行mqtt的连接操作等。
一旦发现使用MQTT后,就可以继续查看javascript文件来找到连接的host、端口、用户名以及密码信息。对于目前流行的云厂商,一般还会开启tls。或者这些信息后,我们就可以进行深入的分析或利用。
除此之外,我也喜欢开启Brup suite记录通信流量,而且Brup suite支持websockets的记录。通过对历史记录的搜索功能可以快速发现MQTT相关内容。也可以根据个人习惯来快速确定。值得一提的是,一些内容在访问主页时就可以发现,有一些则会在一些其他页面,对于一些比较多的页面,可以使用爬虫的方式来提高效率,如通过headless的方式或者使用一些开源的2.0爬虫也可以。所有爬虫的流量经过Burp suite即可。对于流量比较大的,可以使用burp的loggeer++插件将流量记录到elasticsearch中。当然这里使用其他的代理也可以,如mitmproxy、goproxy等。
除此之外,还可以通过分析javascript文件中的连接信息,进行批量爬取来发现mqtt信息。
2、 通过.map文件获取源代码来获取
在实际的过程中可能会遇到只有一个登录页面,登录页面只有引用mqtt库的js文件,并没有发起请求。爬虫也无法访问到页面时怎么办呢?目前的许多网站喜欢使用webpack打包javascript文件,其中包括了vue开发的站点。在这种情况时,可以试试是否存在.map文件,一旦在实战中探测到这类文件,那么就可以下载目标网站的javascript的源代码文件。这里我比较喜欢使用source detecotor来实现。关于source detecotor的安装与使用可以看https://bacde.me/post/unpack-webpack-via-sourcemap/
下图是通过下载源代码来发现其中的配置信息。
3、 爆破js文件,从js文件中获取
在上述方法都失效的情况下,还可以通过爆破js文件的路径来尝试获取信息。观察目标的js存放路径,结合常见的js文件路径生成字典进行探测。
这里列举几个常见js文件名,大家可以收集自己的:
mqtt.js
config.js
main.js
mqtt.class.js
app.js
env.js
default.js
index.js
url.js
可以多试试,或许有意想不到的效果。可以看看如下两个例子:
4、 android应用各种获取配置信息
除web端之外,移动端可以通过反编译apk源代码搜索mqtt等关键字、查看xml配置文件来发现。除此之外,在研究中发现一些车企的移动端也使用了MQTT,但是他们将内容放在了so文件中,由于时间关系,本次还没来得及对其进行深入的分析。
以下这个例子就是反编译app源码后,发现嵌入了一些页面文件,其中可以看到mqtt的配置信息。
5、 一些关键字
paho-mqtt/1.0.1/mqttws31.min.js
paho-mqtt.js
mqtt.aliyuncs.com
mqtt.js
iotdevicegateway
一旦发现上述内容,基本上可以确定使用了mqtt。
0x01 连接MQTT
1、 连接发现的mqtt
web端中的mqtt一般通过websockets进行连接,使用mqtt-pwn是无法连接成功的。这里可以通过websockets的客户端进行连接。将发现的mqtt内容填写如工具中即可进行连接。连接成功后可以发布和订阅内容,订阅的topic一般也写在代码中。
推荐一个在线工具http://tools.emqx.io/。界面如下图:
2、 带来的风险
获取了这些信息除了跟web代码中的存在什么样的安全问题呢?
敏感信息泄漏
在实际的研究过程中可以发现,通过获取的信息连接后,我们可以查看到其他用户的信息,其中会包含敏感信息。这就导致了敏感信息泄漏。下图中的系统使用了阿里云的MQTT,由于泄漏了mqtt配置信息,通过连接并订阅topic,可以看到泄漏了不该我们应该看到的信息,如用户手机号码、昵称、以及管理员与用户对话内容。
存储型xss漏洞
连接成功后我们可以直接发布消息到队列中,这里我们可以直接绕过web端的防御,通过fuzz构造恶意的数据,比如植入xss攻击代码来实现攻击web端或移动端的用户。
另外,网络上公开的一些管理平台同样因为过滤不严,导致存在xss。这可以使我们直接攻击管理员。这里介绍两个漏洞,CVE-2020-13821和CVE-2020-13932。编号CVE-2020-13821漏洞的产品是HiveMQ Broker management console中,攻击者可以通过恶意的clientid来攻击admin的控制台;编号CVE-2020-13932漏洞的产品是Apache ActiveMQ Artemis,攻击者可通过构造恶意的clientid或topics名字来攻击admin的控制台。
这里测试CVE-2020-13821漏洞,该漏洞在hivemq4.4.0版本中已经修复,本地搭建的版本为hivemq 4.3.2。
docker命令:docker run -p 8080:8080 -p 1883:1883 hivemq/hivemq4:4.3.2
以上映射的端口可以自己定义,我这里环境使用的是8990和2883。docker启动后,即可打开http://127.0.0.1:8990
(可改为自己的端口,默认是8080),用户名和密码为admin和hivemq。
我们可以使用mqttfx进行连接,在clientid中加入xss payload <img/src=x onerror=alert(1)>
,ip和端口填入自己环境或目标信息,点击连接即可,当然在实战中如果需要用户名和密码,填入即可。
回到hivemq的管理平台,点击clients
菜单,点击Refresh Snaphot
即可触发执行payload,这就是一个存储型的XSS。
可获取其他更多信息
通过连接上mqtt,可以尝试枚举其他topic的,来后去更多的内容,以此来检查是否存在更加敏感的信息,如gps位置、用户数据等。这里推荐一个工具mqttfx,跨平台软件。下面举一个例子。
首先从web页面中获取到相关信息。
接下来可以获取web扫描全部端口或nmap来识别mqtt协议。找到mqtt端口。通常端口都为默认的1883。
可以通过获取的连接信息来添加到软件中或者使用mqtt-pwn进行操作,下图为使用mqttfx进行连接。接下来可以尝试后去更多信息来进行渗透。
也可以使用mqtt-pwn进行连接,mqtt-pwn列出了系统的topics。
0x02 MQTT管理平台
对于MQTT应用之外,还可以关注管理平台。目前EMQ X是其中比较流行的一个。
EMQ X全称 Erlang/Enterprise/Elastic MQTT Broker,它是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的百万级开源 MQTT 消息服务器。EMQ X常见端口和默认密码为:
TCP 端口: 1883
Websocket 端口: 8083
TCP/TLS 端口: 8883
Websocket/TLS 端口: 8084
管理平台端口:18083
默认用户名密码:admin/public
FOFA Dork:(port="18083" && title="dashboard") || body="href=/static/emq.ico"
通过登录平台,可以很方便的看到客户端连接、主题、订阅信息等,还可以通过添加规则来过滤数据。本地搭建的效果如下:
除此之外rabbitmq、hivemq等也都有管理的平台,这里可以参考网络上的内容即可,这里不做赘述。
0x03 总结
本文主要研究在实际的应用中如何获取mqtt信息,以及获取的信息带来的潜在风险。MQTT方面的安全还有很多内容等待着我们去挖掘。我也在研究中,希望以此抛砖引玉,能够更多的大佬一起交流和研究。
最后的重点,建议搭建本地搭建环境或者在授权情况下进行测试,不要对外网目标进行非法测试和破坏。否则造成的一切后果与本人无关。
0x04 引用
https://docs.aws.amazon.com/iot/latest/developerguide/mqtt-ws.html
https://www.hivemq.com/blog/mqtt-over-websockets-with-hivemq/
https://www.eclipse.org/paho/files/jsdoc/Paho.MQTT.Client.html
https://bacde.me/post/unpack-webpack-via-sourcemap/
https://payatu.com/advisory/hivemq-mqtt-broker—-xss-over-mqtt
发表评论
您还未登录,请先登录。
登录