前言
最近在做安全测试,在测试的过程中遇到MQTT的测试项目,以前没了解过emmm学一波~
项目背景:
某项目的设备端有MQTT消息转发服务
端口:1883 / 8883 端口 (QMTT over TCP)
版本:eclipse mosquitto 1.6.8, MQTT v3.1.1版本协议
MQTT简介
MQTT消息队列遥测传输(英语:Message Queuing Telemetry Transport)是ISO 标准(ISO/IEC PRF 20922)下基于发布 (Publish)/订阅 (Subscribe)范式的消息协议,可视为“数据传递的桥梁”它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件,以解决当前繁重的数据传输协议,如:HTTP。
MQTT 相较于HTTP, 能节省更多的资源,带来较多的传输负担,也因为这样,在制造业中,让更多人发现 IoT 在设备、厂房的无限可能,发现原来要取机台的温度这么容易,要了解厂区的产量这么方便…
MQTT的特点
- 使用发布/订阅的消息模式,支持一对多的消息发布;
- 消息是通过TCP/IP协议传输;
- 简单的数据包格式;
- 默认端口为TCP的1883,websocket端口8083,默认消息不加密。8883端口默认是通过TLS加密的MQTT协议。
MQTT安全测试
MQTT的攻击点
授权:匿名连接问题,匿名访问则代表任何人都可以发布或订阅消息。如果存在敏感数据或指令,将导致信息泄漏或者被恶意攻击者发起恶意指令;
传输:默认未加密,则可被中间人攻击。可获取其验证的用户名和密码;
认证:弱口令问题,由于可被爆破,设置了弱口令,同样也会存在安全风险;
应用:订阅端明文配置导致泄漏其验证的用户名和密码;
漏洞:服务端软件自身存在缺陷可被利用,或者订阅端或服务端解析内容不当产生安全漏洞,这将导致整个系统。历史漏洞汇总如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
141、Eclipse Mosquitto 1.0~1.5.5 存在授权问题漏洞
漏洞公告:https://www.anquanke.com/vul/id/1514742
1、Eclipse Mosquitto <= 1.4.15 存在拒绝服务漏洞
漏洞公告:http://www.nsfocus.net/vulndb/40015
2、 Eclipse Mosquitto 1.0~1.5.5存在访问控制漏洞
漏洞公告:https://www.anquanke.com/vul/id/1514740
3、 MQTT 3.4.6之前版本和4.0.5之前的4.0.x版本存在拒绝服务漏洞
漏洞公告:https://www.anquanke.com/vul/id/1132531
4、 MQTT protocol 3.1.1版本中存在安全漏洞
漏洞公告:https://www.anquanke.com/vul/id/2051251
MQTT的利用
目前已经有针对MQTT的开源利用工具,这里主要以mqtt-pwn这块工具为主。mqtt-pwn这块工具功能强大易用。
github地址为https://github.com/akamai-threat-research/mqtt-pwn
使用文档地址为https://mqtt-pwn.readthedocs.io/en/latest/
MQTT匿名访问
有一些MQTT的服务端软件默认是开启匿名访问,只要对公网开放,任何人都可以直接访问。
对于开启匿名的服务,使用MQTT-pwn测试:connect -o host
如果没有显示连接异常,就表示连接成功。连接成功后,可使用system_info 查看系统信息
MQTT用户名密码爆破
metasploit带有MQTT的爆破模块,但效果不理想
mqtt-pwn具有bruteforce功能,并带了一个简单的字典,可以爆破MQTT的用户名和密码。
1 | bruteforce --host host --port -uf user_dic -pf pass_dic |
端口默认是1883,用户和密码字典默认会在mqtt-pwn的resources/wordlists 文件夹下。
例如执行bruteforce –host 127.0.0.1爆破。爆破成功后就可以使用上面将到的内容进行连接进行操作,在连接时加上用户名和密码选项即可。
MQTT防御
- 请勿启用匿名访问,对服务端(BROKER)设置认证,增加用户名密码验证。
- 根据实际情况,优先使用加密传输数据,防止中间人攻击。
- 加密payload后在进行安全传输。
- 使用最新的服务端程序架设服务。
- 不要将实现的代码上传到github等代码公开平台。