物联网安全之MQTT渗透实战

上一篇 物联网安全之MQTT协议安全 主要介绍了MQTT安全的一些基础知识。今天将在上一篇基础上来说说实战中MQTT的利用。

在整个物联网或车联网架构中,MQTT的部分通常应用在移动端、管理端、Web端、设备端。而MQTT协议中的三种角色是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER)。发布者(PUBLISHER)和订阅者(SUBCRIBER)通过代理(BROKER)来发布和订阅消息。这两个角色在实际场景中主要应用是移动端、Web端、设备端;代理(BROKER)一般是服务器,可以由activemq、hivemq、emqx等许多软件来搭建。在开发过程中,不同的设备,技术特点也有所不同。其使用的协议除了mqtt外,Web端通常使用websocket的方式来进行收发消息。

mqtt应用场景
EMQ X Broker 场景

0x00 获取MQTT认证信息

目前对于MQTT的开发中的安全还尚未受到广泛关注,这使得有多种方式在移动端、Web端、设备端获取到MQTT的认证与连接信息。通过获取的信息来进一步实现越权访问、发布恶意内容等攻击。

由于设备方面暂未找到案例,这里将以Web端和移动端案例来进行说明。

开发的一点知识

通过查阅一些开发资料,可以发现常见的几个MQTT的javascript库:

在实际的研究过程中发现尤其以paho.js居多。在实际的渗透过程中需要多留意,使用本库基本可以确定Web端应用了MQTT的。以下我就介绍几个获取MQTT的几个小技巧。

实战工具

  • Chrome 浏览器
  • Burp Suite
  • source detecotor

好了,有了这几个就够了。开始我们的实战之旅。

获取方法

  1. web应用中直接捕获
    在浏览目标时我一般会打开Chrome浏览器的开发者调试工具,通过查看请求信息或这直接搜索mqtt的字样来确定是否使用MQTT的javascript文件。另外一个就是可以查看websockets请求看是否有进行mqtt的连接操作等。

    一旦发现使用MQTT后,就可以继续查看javascript文件来找到连接的host、端口、用户名以及密码信息。对于目前流行的云厂商,一般还会开启tls。或者这些信息后,我们就可以进行深入的分析或利用。

web应用中获取

除此之外,我也喜欢开启Brup suite记录通信流量,而且Brup suite支持websockets的记录。通过对历史记录的搜索功能可以快速发现MQTT相关内容。也可以根据个人习惯来快速确定。值得一提的是,一些内容在访问主页时就可以发现,有一些则会在一些其他页面,对于一些比较多的页面,可以使用爬虫的方式来提高效率,如通过headless的方式或者使用一些开源的2.0爬虫也可以。所有爬虫的流量经过Burp suite即可。对于流量比较大的,可以使用burp的loggeer++插件将流量记录到elasticsearch中。当然这里使用其他的代理也可以,如mitmproxy、goproxy等。

burpsuite获取mqtt信息

除此之外,还可以通过分析javascript文件中的连接信息,进行批量爬取来发现mqtt信息。

  1. 通过.map文件获取源代码来获取
    在实际的过程中可能会遇到只有一个登录页面,登录页面只有引用mqtt库的js文件,并没有发起请求。爬虫也无法访问到页面时怎么办呢?目前的许多网站喜欢使用webpack打包javascript文件,其中包括了vue开发的站点。在这种情况时,可以试试是否存在.map文件,一旦在实战中探测到这类文件,那么就可以下载目标网站的javascript的源代码文件。这里我比较喜欢使用source detecotor来实现。关于source detecotor的安装与使用可以看https://bacde.me/post/unpack-webpack-via-sourcemap/

    下图是通过下载源代码来发现其中的配置信息。

通过源代码获取mqtt信息
  1. 爆破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

    可以多试试,或许有意想不到的效果。可以看看如下两个例子:

爆破js文件1
爆破js文件2
  1. android应用各种获取配置信息

    除web端之外,移动端可以通过反编译apk源代码搜索mqtt等关键字、查看xml配置文件来发现。除此之外,在研究中发现一些车企的移动端也使用了MQTT,但是他们将内容放在了so文件中,由于时间关系,本次还没来得及对其进行深入的分析。

    以下这个例子就是反编译app源码后,发现嵌入了一些页面文件,其中可以看到mqtt的配置信息。

android反编译源码获取mqtt信息
  1. 一些关键字
    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/。界面如下图:
emqx连接mqtt
  1. 带来的风险

    获取了这些信息除了跟web代码中的存在什么样的安全问题呢?

    敏感信息泄漏

    在实际的研究过程中可以发现,通过获取的信息连接后,我们可以查看到其他用户的信息,其中会包含敏感信息。这就导致了敏感信息泄漏。下图中的系统使用了阿里云的MQTT,由于泄漏了mqtt配置信息,通过连接并订阅topic,可以看到泄漏了不该我们应该看到的信息,如用户手机号码、昵称、以及管理员与用户对话内容。

mqtt敏感信息泄露

发布恶意内容的

连接成功后我们可以直接发布消息到队列中,这里我们可以直接绕过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和端口填入自己环境或目标信息,点击连接即可,当然在实战中如果需要用户名和密码,填入即可。

mqtt管理平台xss

回到hivemq的管理平台,点击clients菜单,点击Refresh Snaphot即可触发执行payload,这就是一个存储型的XSS。

mqtt管理平台xss

可获取其他更多信息

通过连接上mqtt,可以尝试枚举其他topic的,来后去更多的内容,以此来检查是否存在更加敏感的信息,如gps位置、用户数据等。这里推荐一个工具mqttfx,跨平台软件。下面举一个例子。

首先从web页面中获取到相关信息。

获取更多信息

接下来可以获取web扫描全部端口或nmap来识别mqtt协议。找到mqtt端口。通常端口都为默认的1883。

nmap扫描mqtt端口

可以通过获取的连接信息来添加到软件中或者使用mqtt-pwn进行操作,下图为使用mqttfx进行连接。接下来可以尝试后去更多信息来进行渗透。

也可以使用mqtt-pwn进行连接,mqtt-pwn列出了系统的topics。

mqtt-pwn 连接mqtt获取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

http://tools.emqx.io/

https://bacde.me/post/unpack-webpack-via-sourcemap/

https://payatu.com/advisory/hivemq-mqtt-broker---xss-over-mqtt

https://nvd.nist.gov/vuln/detail/CVE-2020-13932