![601b0963be92812a261199eb12de2218.png](https://i-blog.csdnimg.cn/blog_migrate/9c9ed1858e4d8c5b34e43bcfe0448c43.png)
- 使用发布/订阅的消息模式,支持一对多的消息发布;
- 消息是通过TCP/IP协议传输;
- 简单的数据包格式;
- 默认端口为TCP的1883,websocket端口8083,默认消息不加密。8883端口默认是通过TLS加密的MQTT协议。
发布/订阅模式
MQTT协议中有三种角色和一个主要概念,三种角色分别是发布者(PUBLISHER)、订阅者(SUBCRIBER)、代理(BROKER),还有一个主要的概念为主题(TOPIC)。 消息的发送方被称为发布者,消息的接收方被称为订阅者,发送者和订阅者发布或订阅消息均会连接BROKER,BROKER一般为服务端,BROKER存放消息的容器就是主题。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。每份订阅中,订阅者都可以接收到主题的所有消息。![3dbd29cc68aa7db9229650526102cfbb.png](https://i-blog.csdnimg.cn/blog_migrate/1dc491cd13577876b36e700c44456aeb.jpeg)
![4e629a56cd09c041df7e4d1616627d93.png](https://i-blog.csdnimg.cn/blog_migrate/5ed77967cb6ff73e7310e4184d374e7b.png)
- 授权:匿名连接问题,匿名访问则代表任何人都可以发布或订阅消息。如果存在敏感数据或指令,将导致信息泄漏或者被恶意攻击者发起恶意指令;
- 传输:默认未加密,则可被中间人攻击。可获取其验证的用户名和密码;
- 认证:弱口令问题,由于可被爆破,设置了弱口令,同样也会存在安全风险;
- 应用:订阅端明文配置导致泄漏其验证的用户名和密码;
- 漏洞:服务端软件自身存在缺陷可被利用,或者订阅端或服务端解析内容不当产生安全漏洞,这将导致整个系统。
mqtt-pwn的安装很简单。可以直接安装到本机,也可以直接使用docker的方式。
文本直接使用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的界面。
![b66705ebcd19d9934fd06f88bdf2ca13.png](https://i-blog.csdnimg.cn/blog_migrate/1d1474bdc60b3d456eb95ad248b8257b.png)
connect -h
显示帮助信息,其他命令也是如此,使用时,多看帮助和文档,很快就可以熟悉使用。对于开启匿名的服务,直接
connect -o host
即可,当然该命令也支持输入用户名和密码。如果没有显示连接异常,就表示连接成功。连接成功后,可使用
system_info
查看系统信息。
![ce8e569372c43c7f1b9998fae7b9f32f.png](https://i-blog.csdnimg.cn/blog_migrate/528128ee425b8f67a78dd433033c5942.png)
discovery
,等待显示scan #1 has finished,接下来执行
scans -i 序号
,在执行
topics
命令即可看到topic信息。其中
disconvery
可以使用
-t
参数设置超时时间。
topics
命令可以使用
-l
参数设置查看条数。
![37dc02f785926d36af4332eeb5ffb96f.png](https://i-blog.csdnimg.cn/blog_migrate/5575a269e508f17be2e8d983df11df26.png)
messages
查看topic的内容。使用
-l
限制条数,
-i
参数查看某个单挑消息内容等。
![46ec5c97d6037d0a979f64898dc6fa24.png](https://i-blog.csdnimg.cn/blog_migrate/64207dabad8b31ca0319f4a4ab982456.png)
![09be7802b5bae80c447f5c55617aad9e.png](https://i-blog.csdnimg.cn/blog_migrate/4eb6e941392deda49502f18b44783ec3.png)
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](https://i-blog.csdnimg.cn/blog_migrate/be54de2c21305bbf794396a7919b16db.png)
![d4fbe7474a911c71ee473544c1380702.png](https://i-blog.csdnimg.cn/blog_migrate/4dc4e40e98fbf51dcd0019eea584c9d6.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](https://i-blog.csdnimg.cn/blog_migrate/c71c2e29f9e5e3634755fba663314ec2.png)
知风
在针对IoT和ICS探测的搜索引擎知风中搜索,直接搜索mqtt
关键字,可以发现15万个对外开放的服务。
![c78e2fe563a5a5e35724486d0f1d27e7.png](https://i-blog.csdnimg.cn/blog_migrate/1675e25cd5b5f815d7bc9cbe8f44f0ef.png)
- fofa
搜索关键字为protocol=mqtt,一年内有25万个对外开放。
- shodan
搜索关键字:
product:”MQTT”
product:”Mosquitto”
![a7ba16a1267e2d9a362d98bdf105f4bd.png](https://i-blog.csdnimg.cn/blog_migrate/da33adb3fe81fbc845fac2c241d4bdfa.png)
mqtt 安全建议
- 请勿启用匿名访问,对服务端(BROKER)设置认证,增加用户名密码验证。
- 根据实际情况,优先使用加密传输数据,防止中间人攻击。
- 加密payload后在进行安全传输。
- 使用最新的服务端程序架设服务。
- 不要将实现的代码上传到github等代码公开平台。
![29c95e0e4e1092ebdfb38d435df9d047.gif](https://i-blog.csdnimg.cn/blog_migrate/6e109f822cb41d9286f7fd7d19821a4d.gif)