一、簡(jiǎn)介
MQTT 全稱為 Message Queuing Telemetry Transport(消息隊(duì)列遙測(cè)傳輸)是ISO 標(biāo)準(zhǔn)(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協(xié)議,由 IBM 發(fā)布。由于其輕量、簡(jiǎn)單、開(kāi)放和易于實(shí)現(xiàn)的特點(diǎn)非常適合需要低功耗和網(wǎng)絡(luò)帶寬有限的IoT場(chǎng)景。比如遙感數(shù)據(jù)、汽車(chē)、智能家居、智慧城市、醫(yī)療醫(yī)護(hù)等。
二、MQTT協(xié)議
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)消息。
目前最新的版本為5.0版本,可以在https://github.com/mqtt/mqtt.github.io/wiki/servers 這個(gè)連接中看到支持MQTT的服務(wù)端軟件。其中hivemq中提到針對(duì)汽車(chē)廠商的合作與應(yīng)用,在研究過(guò)程中會(huì)發(fā)現(xiàn)有汽車(chē)行業(yè)應(yīng)用了MQTT協(xié)議。
以下列舉我們關(guān)心的幾項(xiàng):
1. 使用發(fā)布/訂閱的消息模式,支持一對(duì)多的消息發(fā)布;
2. 消息是通過(guò)TCP/IP協(xié)議傳輸;
3. 簡(jiǎn)單的數(shù)據(jù)包格式;
4. 默認(rèn)端口為T(mén)CP的1883,websocket端口8083,默認(rèn)消息不加密。8883端口默認(rèn)是通過(guò)TLS加密的MQTT協(xié)議。
三、發(fā)布/訂閱模式
MQTT協(xié)議中有三種角色和一個(gè)主要概念,三種角色分別是發(fā)布者(PUBLISHER)、訂閱者(SUBCRIBER)、代理(BROKER),還有一個(gè)主要的概念為主題(TOPIC)。
消息的發(fā)送方被稱為發(fā)布者,消息的接收方被稱為訂閱者,發(fā)送者和訂閱者發(fā)布或訂閱消息均會(huì)連接BROKER,BROKER一般為服務(wù)端,BROKER存放消息的容器就是主題。發(fā)布者將消息發(fā)送到主題中,訂閱者在接收消息之前需要先“訂閱主題”。每份訂閱中,訂閱者都可以接收到主題的所有消息。
其MQTT協(xié)議流程圖如下:
這里不對(duì)協(xié)議進(jìn)行過(guò)多介紹,感興趣的大家可以結(jié)尾處的引用查看。
四、MQTT的攻擊點(diǎn)
根據(jù)其特性,可以擴(kuò)展如下幾個(gè)攻擊點(diǎn):
1. 授權(quán):匿名連接問(wèn)題,匿名訪問(wèn)則代表任何人都可以發(fā)布或訂閱消息。如果存在敏感數(shù)據(jù)或指令,將導(dǎo)致信息泄漏或者被惡意攻擊者發(fā)起惡意指令;
2. 傳輸:默認(rèn)未加密,則可被中間人攻擊??色@取其驗(yàn)證的用戶名和密碼;
3. 認(rèn)證:弱口令問(wèn)題,由于可被爆破,設(shè)置了弱口令,同樣也會(huì)存在安全風(fēng)險(xiǎn);
4. 應(yīng)用:訂閱端明文配置導(dǎo)致泄漏其驗(yàn)證的用戶名和密碼;
5. 漏洞:服務(wù)端軟件自身存在缺陷可被利用,或者訂閱端或服務(wù)端解析內(nèi)容不當(dāng)產(chǎn)生安全漏洞,這將導(dǎo)致整個(gè)系統(tǒng)。
MQTT的利用
目前已經(jīng)有針對(duì)MQTT的開(kāi)源利用工具,這里主要以mqtt-pwn這塊工具為主。mqtt-pwn這塊工具功能強(qiáng)大易用。github地址為
https://github.com/akamai-threat-research/mqtt-pwn,使用文檔地址為
https://mqtt-pwn.readthedocs.io/en/latest/。
工具安裝
mqtt-pwn的安裝很簡(jiǎn)單??梢灾苯影惭b到本機(jī),也可以直接使用docker的方式。文本直接使用docker方式。首先確保已經(jīng)安裝docker和docker-compose,然后運(yùn)行如下命令進(jìn)行安裝:
git clone https://github.com/akamai-threat-research/mqtt-pwn.git
cd mqtt-pwn
docker-compose up --build --detach
運(yùn)行:
docker-compose ps
docker-compose run cli
即可看到mqtt-pwn的界面。
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)然該命令也支持輸入用戶名和密碼。如果沒(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)容等。
MQTT用戶名密碼爆破
metasploit帶有MQTT的爆破模塊,經(jīng)過(guò)實(shí)際測(cè)試,效果并不理想。這里仍然以mqtt-pwn來(lái)進(jìn)行介紹。mqtt-pwn具有bruteforce功能,并帶了一個(gè)簡(jiǎn)單的字典,可以爆破MQTT的用戶名和密碼。
bruteforce --host host --port -uf user_dic -pf pass_dic
端口默認(rèn)是1883,用戶和密碼字典默認(rèn)會(huì)在mqtt-pwn的resources/wordlists 文件夾下。
例如執(zhí)行bruteforce --host 127.0.0.1爆破。爆破成功后就可以使用上面將到的內(nèi)容進(jìn)行連接進(jìn)行操作,在連接時(shí)加上用戶名和密碼選項(xiàng)即可。
mqtt-pwn還支持更多功能,如Owntracks (GPS Tracker)、Sonoff Exploiter等。感興趣的大家自己去看下文檔去進(jìn)行測(cè)試。
應(yīng)用中發(fā)現(xiàn)
在實(shí)際的使用場(chǎng)景我們可以通過(guò)中間人劫持從流量中捕獲驗(yàn)證信息。以下為wireshark抓包內(nèi)容。
除此之外,由于目前多種語(yǔ)言實(shí)現(xiàn)了mqtt的客戶端,web應(yīng)用中還有webscoket的mqtt。這使得可以通過(guò)web的網(wǎng)頁(yè)源碼或網(wǎng)絡(luò)請(qǐng)求獲得驗(yàn)證的信息。
服務(wù)端漏洞
這里列舉一些歷史上MQTT的漏洞供參考。
CVE-2017-7296
CVE-2017-7650
CVE-2018-17614
CVE-2019-5432
CVE-2020-13849
Mosquitto漏洞列表
五、探測(cè)與發(fā)現(xiàn)
功能強(qiáng)大的nmap是支持MQTT協(xié)議的識(shí)別的,可以直接通過(guò)nmap進(jìn)行識(shí)別MQTT協(xié)議。另外,除上面提到的默認(rèn)端口外,有的管理員會(huì)修改默認(rèn)端口,這時(shí)也可以嘗試1884,8084,8884等臨近端口以進(jìn)行快速探測(cè),或前面增加數(shù)字等作為組合,如果針對(duì)單個(gè)目標(biāo),則可以探測(cè)全部端口。如果進(jìn)行大規(guī)模的掃描或者提升掃描效率,則可以使用masscan、zmap、RustScan等先進(jìn)性端口掃描,在使用nmap進(jìn)行協(xié)議識(shí)別即可。nmap舉例命令如下:
sudo nmap -p1883,8083,8883 -sS -sV --version-intensity 9 -Pn --open target_ip
nmap也有相關(guān)的MQTT lua腳本可以使用,其MQTT版本為3.1.1。腳本地址為
https://svn.nmap.org/nmap/nselib/mqtt.lua。
如果想要自己編寫(xiě)代碼去進(jìn)行探測(cè),只需要根據(jù)MQTT的協(xié)議標(biāo)準(zhǔn),通過(guò)socket即可進(jìn)行收發(fā)報(bào)文。關(guān)于MQTT協(xié)議的詳細(xì)內(nèi)容可以查看文檔,地址為https://docs.oasis-open.org/mqtt/mqtt/
現(xiàn)有的網(wǎng)絡(luò)空間測(cè)繪平臺(tái)基本都實(shí)現(xiàn)了對(duì)MQTT進(jìn)行探測(cè)??芍苯油ㄟ^(guò)這些搜索引擎獲取大量對(duì)外使用MQTT協(xié)議的服務(wù)。
· 知風(fēng)
在針對(duì)IoT和ICS探測(cè)的搜索引擎知風(fēng)中搜索,直接搜索mqtt關(guān)鍵字,可以發(fā)現(xiàn)15萬(wàn)個(gè)對(duì)外開(kāi)放的服務(wù)。
· fofa
搜索關(guān)鍵字為protocol=mqtt,一年內(nèi)有25萬(wàn)個(gè)對(duì)外開(kāi)放。
· shodan
搜索關(guān)鍵字:
product:"MQTT"
product:"Mosquitto"
shodan上搜索后共有超過(guò)11萬(wàn)個(gè)對(duì)外開(kāi)放。
通過(guò)以上的搜索結(jié)果,各引擎各有優(yōu)劣。shodan和知風(fēng)針對(duì)該協(xié)議的探測(cè)均會(huì)列出topic;而fofa從發(fā)現(xiàn)數(shù)量上最多,但是僅識(shí)別了協(xié)議,并未列出topic;除此之外知風(fēng)系統(tǒng)的地理位置定位精度較高,可以定位百米范圍內(nèi)。
六、MQTT安全建議
1. 請(qǐng)勿啟用匿名訪問(wèn),對(duì)服務(wù)端(BROKER)設(shè)置認(rèn)證,增加用戶名密碼驗(yàn)證。
2. 根據(jù)實(shí)際情況,優(yōu)先使用加密傳輸數(shù)據(jù),防止中間人攻擊。
3. 加密payload后在進(jìn)行安全傳輸。
4. 使用最新的服務(wù)端程序架設(shè)服務(wù)。
5. 不要將實(shí)現(xiàn)的代碼上傳到github等代碼公開(kāi)平臺(tái)。
七、小結(jié)
寫(xiě)這篇文章時(shí),網(wǎng)絡(luò)上關(guān)于MQTT安全的文章并不多,但是通過(guò)對(duì)其了解,仍然有不少內(nèi)容可以探索,比如在工業(yè)上有MQTT網(wǎng)關(guān),以及眾多支持MQTT的服務(wù)端軟件、加上廣泛的應(yīng)用場(chǎng)景。本文簡(jiǎn)單介紹MQTT安全的內(nèi)容,還有更多的內(nèi)容等待探索。感興趣的朋友也歡迎大家多多交流討論。
最后,提醒一下大家,在學(xué)習(xí)和研究過(guò)程中自己搭建服務(wù)進(jìn)行學(xué)習(xí)。請(qǐng)勿對(duì)網(wǎng)絡(luò)上的目標(biāo)進(jìn)行測(cè)試、破壞等活動(dòng)。
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/
原文來(lái)源:銀基安全(如有侵權(quán),通知?jiǎng)h帖)