java解析mqtt_物联网安全系列 | MQTT协议安全
MQTT 全稱為 Message Queuing Telemetry Transport(消息隊列遙測傳輸)是是ISO 標準(ISO/IEC PRF 20922)下基于發布/訂閱范式的消息協議,由 IBM 發布。由于其輕量、簡單、開放和易于實現的特點非常適合需要低功耗和網絡帶寬有限的IoT場景。比如遙感數據、汽車、智能家居、智慧城市、醫療醫護等。
MQTT協議為大量計算能力有限,低帶寬、不可靠網絡等環境而設計,其應用非常廣泛。目前支持的服務端程序也較豐富,其PHP,JAVA,Python,C,C#等系統語言也都可以向MQTT發送相關消息。?
目前最新的版本為5.0版本,可以在 https://github.com/mqtt/mqtt.github.io/wiki/servers?這個連接中看到支持MQTT的服務端軟件。其中hivemq中提到針對汽車廠商的合作與應用,在研究過程中會發現有汽車行業應用了MQTT協議。
以下列舉我們關心的幾項:
1. 使用發布/訂閱的消息模式,支持一對多的消息發布;
2. 消息是通過TCP/IP協議傳輸;
3. 簡單的數據包格式;
4. 默認端口為TCP的1883,websocket端口8083,默認消息不加密。8883端口默認是通過TLS加密的MQTT協議。
MQTT協議中有三種角色和一個主要概念,三種角色分別是發布者(PUBLISHER)、訂閱者(SUBCRIBER)、代理(BROKER),還有一個主要的概念為主題(TOPIC)。
消息的發送方被稱為發布者,消息的接收方被稱為訂閱者,發送者和訂閱者發布或訂閱消息均會連接BROKER,BROKER一般為服務端,BROKER存放消息的容器就是主題。發布者將消息發送到主題中,訂閱者在接收消息之前需要先“訂閱主題”。每份訂閱中,訂閱者都可以接收到主題的所有消息。
其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.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用戶名密碼爆破?
metasploit帶有MQTT的爆破模塊,經過實際測試,效果并不理想。這里仍然以mqtt-pwn來進行介紹。mqtt-pwn具有bruteforce功能,并帶了一個簡單的字典,可以爆破MQTT的用戶名和密碼。
bruteforce --host host --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的漏洞供參考。
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
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萬個對外開放的服務。
· fofa?
搜索關鍵字為protocol=mqtt,一年內有25萬個對外開放。
· shodan?
搜索關鍵字:??
product:"MQTT" ? ?
product:"Mosquitto"
shodan上搜索后共有超過11萬個對外開放。
通過以上的搜索結果,各引擎各有優劣。shodan和知風針對該協議的探測均會列出topic;而fofa從發現數量上最多,但是僅識別了協議,并未列出topic;除此之外知風系統的地理位置定位精度較高,可以定位百米范圍內。
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/
總結
以上是生活随笔為你收集整理的java解析mqtt_物联网安全系列 | MQTT协议安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线路由器如何设置不限速路由器怎么设置特
- 下一篇: go uint64 转 字符_Go的基本