基于 MQTT 協(xié)議的 IoT 物聯(lián)網(wǎng)設(shè)備已成為黑客攻擊的頭號載體和目標(biāo)
根據(jù)Forrester的最新報告《2023 年物聯(lián)網(wǎng)安全狀況》,基于 MQTT 協(xié)議的 IoT 物聯(lián)網(wǎng)設(shè)備正在成為黑客攻擊的頭號載體和目標(biāo)。
物聯(lián)網(wǎng)設(shè)備的安全性存在設(shè)計上的“先天缺陷”,長期使用默認(rèn)密碼,極容易遭到黑客攻擊。此外,隨著 IoT 關(guān)鍵任務(wù)系統(tǒng)分配給與之緊密關(guān)聯(lián)的物聯(lián)網(wǎng)設(shè)備的角色和身份迅速增加,這些 IoT 設(shè)備正在成為黑客最青睞的高價值目標(biāo)。
在2022年下半年,工業(yè)領(lǐng)域計算機中有34.3%受到攻擊影響,僅2021年上半年,針對物聯(lián)網(wǎng)設(shè)備的攻擊就高達15億次。超過40%的 IoT 系統(tǒng)曾阻止過惡意對象。
1.MQTT 協(xié)議應(yīng)用場景
MQTT協(xié)議為大量計算能力有限,低帶寬、不可靠網(wǎng)絡(luò)等環(huán)境而設(shè)計,其應(yīng)用非常廣泛。目前支持的服務(wù)端程序也較豐富,其PHP,JAVA,Python,C,C#等系統(tǒng)語言也都可以向MQTT發(fā)送相關(guān)消息。
以下列舉我們關(guān)心的幾項:
- 使用發(fā)布/訂閱的消息模式,支持一對多的消息發(fā)布;
- 消息是通過TCP/IP協(xié)議傳輸;
- 簡單的數(shù)據(jù)包格式;
- 默認(rèn)端口為 TCP 的1883 ; WebSocket 端口 8083,默認(rèn)消息不加密; 8883 端口默認(rèn)是通過 TLS 加密的MQTT協(xié)議。
MQTT協(xié)議中有三種角色和一個主要概念,三種角色分別是發(fā)布者(PUBLISHER)、訂閱者(SUBCRIBER)、代理(BROKER),還有一個主要的概念為主題(TOPIC)。
消息的發(fā)送方被稱為發(fā)布者,消息的接收方被稱為訂閱者,發(fā)送者和訂閱者發(fā)布或訂閱消息均會連接BROKER,BROKER一般為服務(wù)端,BROKER存放消息的容器就是主題。發(fā)布者將消息發(fā)送到主題中,訂閱者在接收消息之前需要先“訂閱主題”。每份訂閱中,訂閱者都可以接收到主題的所有消息。
其 MQTT 協(xié)議流程圖如下:
2.MQTT 協(xié)議的攻擊點
根據(jù) MQTT 協(xié)議和物聯(lián)網(wǎng)全鏈路特性,可以擴展如下幾個攻擊點:
- 授權(quán):匿名連接問題,匿名訪問則代表任何人都可以發(fā)布或訂閱消息。如果存在敏感數(shù)據(jù)或指令,將導(dǎo)致信息泄漏或者被惡意攻擊者發(fā)起惡意指令;
- 傳輸:默認(rèn)未加密,則可被中間人攻擊。可獲取其驗證的用戶名和密碼;
- 認(rèn)證:弱口令問題,由于可被爆破,設(shè)置了弱口令,同樣也會存在安全風(fēng)險;
- 應(yīng)用:訂閱端明文配置導(dǎo)致泄漏其驗證的用戶名和密碼;
- 漏洞:服務(wù)端軟件自身存在缺陷可被利用,或者訂閱端或服務(wù)端解析內(nèi)容不當(dāng)產(chǎn)生安全漏洞,這將導(dǎo)致整個系統(tǒng)。
MQTT 協(xié)議攻擊點的利用
目前已經(jīng)有針對 MQTT 的開源利用工具,這里主要以功能強大易用的 mqtt-pwn 工具為主。
Github地址為 https://github.com/akamai-threat-research/mqtt-pwn。
(1) MQTT匿名訪問
有一些MQTT的服務(wù)端軟件默認(rèn)是開啟匿名訪問,如果管理員沒有網(wǎng)絡(luò)安全意識或懶惰,只要對公網(wǎng)開放,任何人都可以直接訪問。
使用mqtt-pwn的connect命令進行連接。connect -h 顯示幫助信息,其他命令也是如此,使用時,多看幫助和文檔,很快就可以熟悉使用。對于開啟匿名的服務(wù),直接connect -o host 即可,當(dāng)然該命令也支持輸入用戶名和密碼。如果沒有顯示連接異常,就表示連接成功。連接成功后,可使用system_info 查看系統(tǒng)信息。
接下來就可以查看topic信息等內(nèi)容。這時先執(zhí)行discovery,等待顯示scan #1 has finished,接下來執(zhí)行scans -i 序號,在執(zhí)行topics命令即可看到topic信息。其中disconvery可以使用-t參數(shù)設(shè)置超時時間。topics命令可以使用-l參數(shù)設(shè)置查看條數(shù)。
可以輸入messages查看topic的內(nèi)容。使用-l限制條數(shù),-i參數(shù)查看某個單挑消息內(nèi)容等。
(2) MQTT用戶名密碼爆破
metasploit帶有MQTT的爆破模塊,經(jīng)過實際測試,效果并不理想。這里仍然以mqtt-pwn來進行介紹。mqtt-pwn具有bruteforce功能,并帶了一個簡單的字典,可以爆
破MQTT的用戶名和密碼:
bruteforce --host host --port -uf user_dic -pf pass_dic
端口默認(rèn)是1883,用戶和密碼字典默認(rèn)會在 mqtt-pwn 的 resources/wordlists 文件夾下。
例如執(zhí)行 bruteforce --host 127.0.0.1 爆破。爆破成功后就可以使用上面將到的內(nèi)容進行連接進行操作,在連接時加上用戶名和密碼選項即可。
mqtt-pwn還支持更多功能,如Owntracks (GPS Tracker)、Sonoff Exploiter等。感興趣的大家自己去看下文檔去進行測試。
在實際的使用場景我們可以通過中間人劫持從流量中捕獲驗證信息。以下為wireshark抓包內(nèi)容。
除此之外,由于目前多種語言實現(xiàn)了mqtt的客戶端,web應(yīng)用中還有webscoket的mqtt。這使得可以通過web的網(wǎng)頁源碼或網(wǎng)絡(luò)請求獲得驗證的信息。
3.MQTT 協(xié)議的安全建議
(1) 請勿開啟匿名訪問。對服務(wù)端(BROKER)設(shè)置身份認(rèn)證,增加用戶名密碼驗證。
(2) 根據(jù)實際情況,優(yōu)先使用 TLS/DTLS 加密傳輸數(shù)據(jù),防止中間人攻擊。
(3) 加密 Payload 后在進行安全傳輸。
(4) 使用最新的服務(wù)端程序架設(shè) MQTT 云服務(wù)。
(5) 不要將實現(xiàn)的代碼上傳到 Github 等代碼公開平臺。