大家好,我是银基Tiger Team的BaCde,今天来说说MQTT协议的安全。
MQTT协议
MQTT协议为大量计算能力有限,低带宽、不可靠网络等环境而设计,其应用非常广泛。目前支持的服务端程序也较丰富,其PHP,JAVA,Python,C,C#等系统语言也都可以向MQTT发送相关消息。
以下列举我们关心的几项:
发布/订阅模式
MQTT协议中有三种角色和一个主要概念,三种角色分别是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER),还有一个主要的概念为主题(TOPIC)。
消息的发送方被称为发布者,消息的接收方被称为订阅者,发送者和订阅者发布或订阅消息均会连接BROKER,BROKER对外提供MQTT服务,BROKER存放消息的容器就是主题。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。每份订阅中,订阅者都可以接收到主题的所有消息。
其MQTT协议流程图如下:
这里不对协议进行过多介绍,感兴趣的大家可以结尾处的引用查看。
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的界面。
MQTT匿名访问
有一些MQTT的服务端软件默认是开启匿名访问,如果管理员没有网络安全意识或懒惰,只要对公网开放,任何人都可以直接访问。
使用mqtt-pwn的connect命令进行连接。connect -h 显示帮助信息,其他命令也是如此,使用时,多看帮助和文档,很快就可以熟悉使用。
对于开启匿名的服务,直接connect -o host 即可,当然该命令也支持输入用户名和密码。如果没有显示连接异常,就表示连接成功。连接成功后,可使用system_info 查看系统信息。
接下来就可以查看topic信息等内容。这时先执行discovery,等待显示scan #1 has finished,接下来执行scans -i 序号,在执行topics命令即可看到topic信息。其中disconvery可以使用-t参数设置超时时间。topics命令可以使用-l参数设置查看条数。
可以输入messages查看topic的内容。使用-l限制条数,-i参数查看某个单挑消息内容等。
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抓包内容。
除此之外,由于目前多种语言实现了mqtt的客户端,web应用中还有webscoket的mqtt。这使得可以通过web的网页源码或网络请求获得验证的信息。
史上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
nmap也有相关的MQTT lua脚本可以使用,其MQTT版本为3.1.1。脚本地址为https://svn.nmap.org/nmap/nselib/mqtt.lua
第三方安全网站
现有的网络空间测绘平台基本都实现了对MQTT进行探测。可直接通过这些搜索引擎获取大量对外使用MQTT协议的服务。
知风
在针对IoT和ICS探测的搜索引擎知风中搜索,直接搜索mqtt关键字,可以发现15万个对外开放的服务。
SHODAN
搜索关键字:
product:"MQTT"
product:"Mosquitto"
搜索后共有超过11万个对外开放。
通过以上的搜索结果,各引擎各有优劣。shodan和知风针对该协议的探测均会列出topic;除此之外知风系统的地理位置定位精度较高,可以定位百米范围内。
MQTT安全建议
基于以上分析,我们给出MQTT协议使用的安全建议。
请勿启用匿名访问,对服务端(BROKER)设置认证,增加用户名密码验证。
根据实际情况,优先使用加密传输数据,防止中间人攻击。
加密payload后在进行安全传输。
使用最新的服务端程序架设服务。
不要将实现的代码上传到github等代码公开平台。
小结
写这篇文章时,网络上关于MQTT安全的文章并不多,但是通过对其了解,仍然有不少内容可以探索。比如在工业上有MQTT网关,以及众多支持MQTT的服务端软件、加上广泛的应用场景。本文简单介绍MQTT安全的内容,还有更多的内容等待探索。
感兴趣的朋友也欢迎大家多多交流讨论。
最后,提醒一下大家,在学习和研究过程中自己搭建服务进行学习。请勿对网络上的目标进行测试、破坏等活动。
来源: https://www.anquanke.com/post/id/212335
往期推荐
☞ 云厂商的「物联网平台」不香了吗?
☞ 2021国内四大IoT平台性能对比
☞ 国内MCU行业发展研究报告
☞ 2021年4G通信模组企业排行
☞ 艾瑞 2021中国 IoT物联网平台研究
☞ 动图|带你了解PCB板制作过程?