热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

你千辛万苦搭建的IoT物联网平台真的安全吗?

大家好,我是银基TigerTeam的BaCde,今天来说说MQTT协议的安全。MQTT协议MQTT协议为大量计算能力有限,低带宽、不可靠网

大家好,我是银基Tiger Team的BaCde,今天来说说MQTT协议的安全。

MQTT协议

MQTT协议为大量计算能力有限,低带宽、不可靠网络等环境而设计,其应用非常广泛。目前支持的服务端程序也较丰富,其PHP,JAVA,Python,C,C#等系统语言也都可以向MQTT发送相关消息。

以下列举我们关心的几项:

  • 使用发布/订阅的消息模式,支持一对多的消息发布;

  • 消息是通过TCP/IP协议传输;

  • 简单的数据包格式;

  • 默认端口为TCP的1883,websocket端口8083,默认消息不加密。8883端口默认是通过TLS加密的MQTT协议。

发布/订阅模式


MQTT协议中有三种角色和一个主要概念,三种角色分别是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER),还有一个主要的概念为主题(TOPIC)

消息的发送方被称为发布者,消息的接收方被称为订阅者,发送者和订阅者发布或订阅消息均会连接BROKER,BROKER对外提供MQTT服务,BROKER存放消息的容器就是主题。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。每份订阅中,订阅者都可以接收到主题的所有消息。

3a320126f63571e0f7348a697d51af36.png

其MQTT协议流程图如下:
167ef50770f40c123c9d406a9bb50a6b.png

这里不对协议进行过多介绍,感兴趣的大家可以结尾处的引用查看。

MQTT的攻击点

根据其特性,可以扩展如下几个攻击点:

  • 授权:匿名连接问题,匿名访问则代表任何人都可以发布或订阅消息。如果存在敏感数据或指令,将导致信息泄漏或者被恶意攻击者发起恶意指令;

  • 传输:默认未加密,则可被中间人攻击。可获取其验证的用户名和密码;

  • 认证:弱口令问题,由于可被爆破,设置了弱口令,同样也会存在安全风险;

  • 应用:订阅端明文配置导致泄漏其验证的用户名和密码;

  • 漏洞:服务端软件自身存在缺陷可被利用,或者订阅端或服务端解析内容不当产生安全漏洞,这将导致整个系统。

MQTT-PWN探测工具

MQTT-PWN是针对MQTT的开源探测工具,功能强大易用。github地址为https://github.com/akamai-threat-research/mqtt-pwn

工具安装
mqtt-pwn的安装很简单,可以直接使用docker的方式。

首先确保已经安装docker和docker-compose。

然后运行如下命令进行安装:

git clone https://github.com/akamai-threat-research/mqtt-pwn.git
cd mqtt-pwn
docker-compose up --build --detach

运行:

docker-compose ps
docker-compose run cli

即可看到mqtt-pwn的界面。

209d8edc8ec79fe718f6dbf26e56b0ec.png

MQTT匿名访问

有一些MQTT的服务端软件默认是开启匿名访问,如果管理员没有网络安全意识或懒惰,只要对公网开放,任何人都可以直接访问。

使用mqtt-pwn的connect命令进行连接。connect -h 显示帮助信息,其他命令也是如此,使用时,多看帮助和文档,很快就可以熟悉使用。


对于开启匿名的服务,直接connect -o host 即可,当然该命令也支持输入用户名和密码。如果没有显示连接异常,就表示连接成功。连接成功后,可使用system_info 查看系统信息。

327004b754fc5cd44932190b7d76cc4e.png

接下来就可以查看topic信息等内容。这时先执行discovery,等待显示scan #1 has finished,接下来执行scans -i 序号,在执行topics命令即可看到topic信息。其中disconvery可以使用-t参数设置超时时间。topics命令可以使用-l参数设置查看条数。

ea8cf53539f82178c9a652b8aa1406bc.png

可以输入messages查看topic的内容。使用-l限制条数,-i参数查看某个单挑消息内容等。

f8d2f27179deeb523622cf151a208ecb.png

789b63dd3e813354be4ed87b18f28ee0.png

MQTT用户名密码爆破


mqtt-pwn具有bruteforce功能,并带了一个简单的字典,可以爆破MQTT的用户名和密码。

bruteforce --host host --port port -uf user_dic -pf pass_dic

端口默认是1883,用户和密码字典默认会在mqtt-pwn的resources/wordlists 文件夹下。

例如执行 bruteforce --host 127.0.0.1 爆破。爆破成功后就可以使用上面将到的方式进行连接进行操作,在连接时加上用户名和密码选项即可。

mqtt-pwn还支持更多功能,如Owntracks (GPS Tracker)、Sonoff Exploiter等。感兴趣的大家自己去看下文档去进行测试。

中间人劫持

在实际的使用场景我们可以通过中间人劫持从流量中捕获验证信息。以下为wireshark抓包内容。
87ee07e222a4f69c94d074706122b6b7.png

除此之外,由于目前多种语言实现了mqtt的客户端,web应用中还有webscoket的mqtt。这使得可以通过web的网页源码或网络请求获得验证的信息。

59dd0f7fa6155db450209887baf34958.png

史上MQTT的漏洞

这里列举一些历史上MQTT的漏洞,不全仅供参考。

CVE-2017-7296

CVE-2017-7650

CVE-2018-17614

CVE-2019-5432

CVE-2020-13849

NMAP探测与发现

功能强大的nmap是支持MQTT协议的识别的,可以直接通过nmap进行识别MQTT协议。

另外,除上面提到的默认端口外,有的管理员会修改默认端口,这时也可以尝试1884,8084,8884等临近端口以进行快速探测,或前面增加数字等作为组合,如果针对单个目标,则可以探测全部端口。

如果进行大规模的扫描或者提升扫描效率,则可以使用masscan、zmap、RustScan等先进性端口扫描,在使用nmap进行协议识别即可。


nmap举例命令如下:

sudo nmap -p1883,8083,8883 -sS -sV --version-intensity 9 -Pn --open target_ip

14365d2b4ff20bc2c2b3c439496de1cc.png

nmap也有相关的MQTT lua脚本可以使用,其MQTT版本为3.1.1。脚本地址为https://svn.nmap.org/nmap/nselib/mqtt.lua

第三方安全网站

现有的网络空间测绘平台基本都实现了对MQTT进行探测。可直接通过这些搜索引擎获取大量对外使用MQTT协议的服务。

知风
在针对IoT和ICS探测的搜索引擎知风中搜索,直接搜索mqtt关键字,可以发现15万个对外开放的服务。

c10d083c9df44bf66324da66c600f591.png

SHODAN
搜索关键字:

product:"MQTT"
product:"Mosquitto"

搜索后共有超过11万个对外开放。

0051f8ffb7b5f505f107f82160807b2c.png

通过以上的搜索结果,各引擎各有优劣。shodan和知风针对该协议的探测均会列出topic;除此之外知风系统的地理位置定位精度较高,可以定位百米范围内。

MQTT安全建议

基于以上分析,我们给出MQTT协议使用的安全建议。

  • 请勿启用匿名访问,对服务端(BROKER)设置认证,增加用户名密码验证。

  • 根据实际情况,优先使用加密传输数据,防止中间人攻击。

  • 加密payload后在进行安全传输。

  • 使用最新的服务端程序架设服务。

  • 不要将实现的代码上传到github等代码公开平台。

小结

写这篇文章时,网络上关于MQTT安全的文章并不多,但是通过对其了解,仍然有不少内容可以探索。比如在工业上有MQTT网关,以及众多支持MQTT的服务端软件、加上广泛的应用场景。本文简单介绍MQTT安全的内容,还有更多的内容等待探索。

感兴趣的朋友也欢迎大家多多交流讨论。

最后,提醒一下大家,在学习和研究过程中自己搭建服务进行学习。请勿对网络上的目标进行测试、破坏等活动。

8c1608115c2bec03c881c0b7e9f29a70.png

来源: https://www.anquanke.com/post/id/212335

往期推荐

☞ 云厂商的「物联网平台」不香了吗?

☞ 2021国内四大IoT平台性能对比

☞ 国内MCU行业发展研究报告

☞ 2021年4G通信模组企业排行

☞ 艾瑞 2021中国 IoT物联网平台研究

☞ 动图|带你了解PCB板制作过程?

9b33c77fe7fcd80acb6890565c49bb87.gif

96198cb7fb7bc47e7f1ee72fb0e7c2d8.gif

a8aa0f5482da737beafb1a48970259c4.gif

ad9739f3054db8ff6c79c44af8c19986.gif

787b42d92ebea60b4d6dcfeee63918df.gif


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
斌冷无情_869
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有