c++ mqtt客户端_物联网安全之MQTT协议安全

f441474c6476ec0e38ff96d01da6dbfa.png

大家好,我是银基Tiger Team的BaCde,今天来说说MQTT协议的安全。 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议,由 IBM 发布。由于其轻量、简单、开放和易于实现的特点非常适合需要低功耗和网络带宽有限的IoT场景。比如遥感数据、汽车、智能家居、智慧城市、医疗医护等。  MQTT协议 MQTT协议为大量计算能力有限,低带宽、不可靠网络等环境而设计,其应用非常广泛。目前支持的服务端程序也较丰富,其PHP,JAVA,Python,C,C#等系统语言也都可以向MQTT发送相关消息。目前最新的版本为5.0版本,可以在 https://github.com/mqtt/mqtt.github.io/wiki/servers  这个连接中看到支持MQTT的服务端软件。其中hivemq中提到针对汽车厂商的合作与应用,在研究过程中会发现有汽车行业应用了MQTT协议。 601b0963be92812a261199eb12de2218.png 以下列举我们关心的几项:
  1. 使用发布/订阅的消息模式,支持一对多的消息发布;
  2. 消息是通过TCP/IP协议传输;
  3. 简单的数据包格式;
  4. 默认端口为TCP的1883,websocket端口8083,默认消息不加密。8883端口默认是通过TLS加密的MQTT协议。

发布/订阅模式

MQTT协议中有三种角色和一个主要概念,三种角色分别是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER),还有一个主要的概念为主题(TOPIC)。 消息的发送方被称为发布者,消息的接收方被称为订阅者,发送者和订阅者发布或订阅消息均会连接BROKER,BROKER一般为服务端,BROKER存放消息的容器就是主题。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。每份订阅中,订阅者都可以接收到主题的所有消息。 3dbd29cc68aa7db9229650526102cfbb.png 其MQTT协议流程图如下: 4e629a56cd09c041df7e4d1616627d93.png 这里不对协议进行过多介绍,感兴趣的大家可以结尾处的引用查看。  MQTT的攻击点 根据其特性,可以扩展如下几个攻击点:
  1. 授权:匿名连接问题,匿名访问则代表任何人都可以发布或订阅消息。如果存在敏感数据或指令,将导致信息泄漏或者被恶意攻击者发起恶意指令;
  2. 传输:默认未加密,则可被中间人攻击。可获取其验证的用户名和密码;
  3. 认证:弱口令问题,由于可被爆破,设置了弱口令,同样也会存在安全风险;
  4. 应用:订阅端明文配置导致泄漏其验证的用户名和密码;
  5. 漏洞:服务端软件自身存在缺陷可被利用,或者订阅端或服务端解析内容不当产生安全漏洞,这将导致整个系统。
MQTT的利用 目前已经有针对MQTT的开源利用工具,这里主要以mqtt-pwn这块工具为主。mqtt-pwn这块工具功能强大易用。github地址为 https://github.com/akamai-threat-research/mqtt-pwn ,使用文档地址为 https://mqtt-pwn.readthedocs.io/en/latest/ 。 工具安装
mqtt-pwn的安装很简单。可以直接安装到本机,也可以直接使用docker的方式。
文本直接使用docker方式。首先确保已经安装docker和docker-compose。然后运行如下命令进行安装:
git clone https://github.com/akamai-threat-research/mqtt-pwn.gitcd mqtt-pwndocker-compose up --build --detach
运行:
docker-compose psdocker-compose run cli
即可看到mqtt-pwn的界面。 b66705ebcd19d9934fd06f88bdf2ca13.png MQTT匿名访问 有一些MQTT的服务端软件默认是开启匿名访问,如果管理员没有网络安全意识或懒惰,只要对公网开放,任何人都可以直接访问。 使用mqtt-pwn的connect命令进行连接。 connect -h  显示帮助信息,其他命令也是如此,使用时,多看帮助和文档,很快就可以熟悉使用。
对于开启匿名的服务,直接 connect -o host  即可,当然该命令也支持输入用户名和密码。如果没有显示连接异常,就表示连接成功。连接成功后,可使用 system_info  查看系统信息。 ce8e569372c43c7f1b9998fae7b9f32f.png 接下来就可以查看topic信息等内容。这时先执行 discovery ,等待显示scan #1 has finished,接下来执行 scans -i 序号 ,在执行 topics 命令即可看到topic信息。其中 disconvery 可以使用 -t 参数设置超时时间。 topics 命令可以使用 -l 参数设置查看条数。 37dc02f785926d36af4332eeb5ffb96f.png 可以输入 messages 查看topic的内容。使用 -l 限制条数, -i 参数查看某个单挑消息内容等。 46ec5c97d6037d0a979f64898dc6fa24.png 09be7802b5bae80c447f5c55617aad9e.png MQTT用户名密码爆破 metasploit带有MQTT的爆破模块,经过实际测试,效果并不理想。这里仍然以mqtt-pwn来进行介绍。
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抓包内容。 cd108660906a98a2cc2379f9dceafc3e.png 除此之外,由于目前多种语言实现了mqtt的客户端,web应用中还有webscoket的mqtt。这使得可以通过web的网页源码或网络请求获得验证的信息。 d4fbe7474a911c71ee473544c1380702.png 历史漏洞
这里列举一些历史上MQTT的漏洞,不全仅供参考。 CVE-2017-7296 CVE-2017-7650 CVE-2018-17614 CVE-2019-5432 CVE-2020-13849 Mosquitto漏洞列表  探测与发现 功能强大的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 07e8724b9e11dd1cebd44622f4de7e6e.png nmap也有相关的MQTT lua脚本可以使用,其MQTT版本为3.1.1。脚本地址为 https://svn.nmap.org/nmap/nselib/mqtt.lua 。 如果想要自己编写代码去进行探测,只需要根据MQTT的协议标准,通过socket即可进行收发报文。关于MQTT协议的详细内容可以查看文档,地址为 https://docs.oasis-open.org/mqtt/mqtt/ 现有的网络空间测绘平台基本都实现了对MQTT进行探测。可直接通过这些搜索引擎获取大量对外使用MQTT协议的服务。
  • 知风
    在针对IoT和ICS探测的搜索引擎知风中搜索,直接搜索mqtt关键字,可以发现15万个对外开放的服务。

c78e2fe563a5a5e35724486d0f1d27e7.png
  • fofa
    搜索关键字为protocol=mqtt,一年内有25万个对外开放。

e87f3744fe7a52a3b1bf0eea2ffc46bd.png

  • shodan
    搜索关键字:
    product:”MQTT”
    product:”Mosquitto”
shodan上搜索后共有超过11万个对外开放。 a7ba16a1267e2d9a362d98bdf105f4bd.png 通过以上的搜索结果,各引擎各有优劣。shodan和知风针对该协议的探测均会列出topic;而fofa从发现数量上最多,但是仅识别了协议,并未列出topic;除此之外知风系统的地理位置定位精度较高,可以定位百米范围内。

mqtt 安全建议

  1. 请勿启用匿名访问,对服务端(BROKER)设置认证,增加用户名密码验证。
  2. 根据实际情况,优先使用加密传输数据,防止中间人攻击。
  3. 加密payload后在进行安全传输。
  4. 使用最新的服务端程序架设服务。
  5. 不要将实现的代码上传到github等代码公开平台。
 小结 写这篇文章时,网络上关于MQTT安全的文章并不多,但是通过对其了解,仍然有不少内容可以探索,比如在工业上有MQTT网关,以及众多支持MQTT的服务端软件、加上广泛的应用场景。本文简单介绍MQTT安全的内容,还有更多的内容等待探索。感兴趣的朋友也欢迎大家多多交流讨论。 最后,提醒一下大家,在学习和研究过程中自己搭建服务进行学习。请勿对网络上的目标进行测试、破坏等活动。  引用 https://dzone.com/articles/exploiting-mqtt-using-lua https://www.hindawi.com/journals/wcmc/2018/8261746/ https://github.com/akamai-threat-research/mqtt-pwn https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b https://book.hacktricks.xyz/pentesting/1883-pentesting-mqtt-mosquitto https://hackmd.io/@QwmL8PAwTx-bYDnry-ONpA/H1nm2tHzb?type=view https://ttm4175.iik.ntnu.no/prep-iot-mqtt.html https://mobilebit.wordpress.com/tag/mqtt/ https://www.hivemq.com/blog/seven-best-mqtt-client-tools/ https://nmap.org/nsedoc/lib/mqtt.html http://mqtt.p2hp.com/ 29c95e0e4e1092ebdfb38d435df9d047.gif 戳“阅读原文”查看更多内容
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MQTT客户端是一种轻量级的消息传输协议实现,用于在物联网设备之间或设备与服务器之间进行通信。它被设计用于在网络带宽有限或网络连接不稳定的环境下,提供高效且可靠的消息传递服务。 MQTT客户端可以运行在各种硬件平台上,如嵌入式系统、传感器和智能手机等,并提供了灵活的API,使开发人员可以轻松地集成MQTT客户端到他们的应用程序中。 MQTT客户端通过订阅和发布两种消息模式来实现数据的传输和通知。在订阅模式下,客户端可以订阅一个或多个主题,当有新的消息发布到这些主题时,客户端会接收到相应的消息。在发布模式下,客户端可以将消息发布到一个或多个主题,然后订阅了这些主题的其他客户端将会接收到这些消息MQTT客户端具有许多特性,例如可靠性、即时性、可扩展性和易于集成等。它支持基于QoS(服务质量)级别的消息传递,包括至多一次、至少一次和仅一次投递保证。此外,MQTT客户端还支持会话保持、权限管理、断线重连、持久性消息消息持久化等高级特性。 总之,MQTT客户端是一种非常有用的工具,可以简化物联网设备之间的通信,并提供高效、可靠的消息传递服务。通过使用MQTT客户端,我们可以构建出更可靠和实用的物联网应用程序。 ### 回答2: C mqtt客户端是一种轻量级的消息传输协议,用于互联网上的物联网设备和应用程序之间的通信。它是一种发布-订阅模式的协议,它将消息传递分为两个主要角色:MQTT发布者和MQTT订阅者。 MQTT客户端可以连接到MQTT代理服务器,这个代理服务器负责消息的分发。客户端可以发送消息到代理服务器的特定主题(topic),同时可以订阅一个或多个主题来接收其他客户端发送消息。这种方式实现了实时的、异步的消息传递。 与传统的HTTP协议相比,MQTT客户端具有以下优势: 1. 轻量级:MQTT协议是设计用于低带宽、不稳定网络环境,它的通信开销非常小,适合于低功耗设备或带宽有限的环境。 2. 实时性强:MQTT采用发布-订阅模式,消息的传递是实时的,能够满足对实时性要求较高的应用场景。 3. 网络友好:MQTT使用TCP/IP协议作为传输层,支持多种网络连接方式,如Wi-Fi、3G、4G等。 4. 灵活性:MQTT协议支持多种QoS级别,可以根据应用场景要求选择消息的可靠性和传输效率。 5. 安全性:MQTT支持基于TLS/SSL的加密传输,确保消息安全性和数据的保密性。 综上所述,C mqtt客户端是一种非常适合物联网设备和应用程序之间通信的轻量级协议,它能够提供实时性强、网络友好、灵活性高和安全性保障的消息传递机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值