我爱编程

用MQTT攻击物联网

2018-06-11  本文已影响0人  dkive

1、介绍

MQTT是Andy Stanford-Clark和Arlen Nipper创建的M2M协议。

(MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。)百度百科

MQTT

一些协议的主要特点:

1、发布和订阅模式

2、简单数据包格式:二进制有效载荷

3、该协议通过TCP运行

4、默认端口:1883 / TCP(未加密!)

2、发布/订阅模式

发布/订阅模型由以下部分组成:

出版商:向经纪商中的一个(或多个)主题发布消息。

订阅者:订阅代理中的一个(或多个)主题并接收发布者发送的所有消息。

经纪人:将所有消息从发布者路由到订阅者。

主题:由一个或多个由正斜线分隔的级别组成(图01)

图01:发布/订阅模型

3.数据包格式

每个MQTT数据包都包含一个固定标题(图02)。

图02:固定标题

固定标头的第一个字段表示MQTT包的类型。所有数据包类型在表1中列出。

表01:MQTT数据包类型

4. MQTT安全性

MQTT关于安全性的官方说明

您可以在协议的V3.1中将MQTT数据包传递给用户名和密码。可以使用SSL处理整个网络的加密,而不依赖于MQTT协议本身(值得注意的是,SSL不是最轻的协议,并且会增加大量的网络开销)。应用程序可以通过加密发送和接收的数据来添加额外的安全性,但这不是协议内置的内容,为了保持简单和轻量级。

客户端可以通过CONNECT数据包向MQTT Broker发送用户名和密码进行身份验证。

图03:身份验证消息(连接命令)

CONNACK数据包是MQTT代理响应从客户端收到的CONNECT数据包而发送的数据包。CONNACK数据包头包含一个表示验证结果的“返回码”字段(例如,连接接受)。所有返回代码值列于表02中。

表02:返回码值(CONNACK数据包)

需要考虑的两点:

第一:认证是完全可选的

第二:即使正在执行身份验证,默认情况下也不会使用加密(凭证以明文传输)。MITM攻击仍然可以被执行来窃取密码。

5.shodan统计

我们通过Shodan来查看在互联网中可以找到多少个MQTT服务器。使用port:1883进行简短搜索会返回超过15万台主机。大多数MQTT服务器都在中国和美国找到(中国几乎占总数的60%)

图04:Shodan找到的MQTT服务器

但是这些MQTT服务器是否真的实现了安全性?

创建一个Python脚本来连接Shodan发现的主机,并验证是否(至少)正在使用身份验证。我们可以检查CONNACK包中的“返回码”字段来确认。图05显示了从总共800个MQTT服务器的python脚本获得的连接结果。

图05:MQTT身份验证结果

6.外部连接

你可以连接到服务器并使用简单的脚本来订阅所有主题:

python脚本

发现开放MQTT服务器的总结:

1、不同种类的物联网设备

2、传感器:光照和温度值

3、健身器材:Fitbit

4、健康设备:血压监视器

5、位置服务:Owntracks

6、家庭自动化套件:SmartThings(三星)

图06和07中可以看到开放MQTT服务器的例子:

图06:MQTT服务器(传感器数据) 图07:MQTT服务器(Owntracks)

当攻击者能够通过向MQTT主题发布命令(例如关闭灯并打开车库门)来控制物联网设备时,会出现可怕的安全风险。这里显示了一个简单的python脚本来打开一个虚构的车库门(图08):

图08虚构的车库门

7.总结

    未来安全对于物联网与嵌入式设备来说是一个巨大的挑战,攻击将减少现实与虚拟世界之间的差距(列如,攻击者能够远程控制医疗、家庭、工控等一切智能设备),安全从业者须更加了解智能设备的新技术与协议。我想我会对MQTT的物联网中看到更多的攻击。

上一篇下一篇

猜你喜欢

热点阅读