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