本環境是蛇矛實驗室基于"火天網演攻防演訓靶場"進行搭建,通過火天網演中的環境構建模塊,可以靈活的對目標網絡進行設計和配置,并且可以快速進行場景搭建和復現驗證工作。
自 2005年國際電信聯盟正式提出“物聯網(IoT)”這一概念以來,物聯網在全球范圍內迅速獲得認可,并成為信息產業革命第三次浪潮和第四次工業革命的核心支撐。
同時,數以億計的設備接入物聯網,這些設備如今已滲透到我們生活的方方面面,從家居到工廠無處不在。一方面物聯網設備使我們的生活更加便捷,而另一方面物聯網安全事件頻發,全球物聯網安全支出不斷增加。
當前,大量物聯網設備及云服務端直接暴露于互聯網,這些設備和云服務端存在的漏洞一旦被利用,可導致設備被控制、用戶隱私泄露、云服務端數據被竊取等安全風險,甚至會對基礎通信網絡造成嚴重影響。
從2018年全球統計數據來看,路由器、視頻監控設備暴漏數量占比較高。路由器暴漏數量超過3000萬臺,視頻監控設備暴露數量超過1700萬臺,并且這些設備往后幾年會一年比一年多,物聯網安全的事件也會越來越多。由此,物聯網安全行業需要大力發展,物聯網安全人才的培養也刻不容緩。
蛇矛實驗室在后續將利用火天網境系列靶場中的相關目標仿真和環境構建的特性,將持續發布關于“物聯網安全-CVE實戰分析”系列的文章來幫助大家入門物聯網安全。
關于MQTT
MQTT是一個基于客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。
在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。
MQTT介紹
MQTT的幾個要素:
1
1. 客戶端(Client):使用MQTT的程序或設備,一般分為發布者和訂閱者 2. 服務端(Server):發布者和訂閱者之間的Broker 3. 主題(Topic):附加在消息上的一個標簽,Broker會將該消息發送給所有訂閱該主題的訂閱者 4. 主題過濾器(Topic Filter):訂閱者訂閱時可使用通配符同時訂閱一個或多個主題
MQTT基于發布和訂閱模型,MQTT 協議的訂閱與發布是基于主題的(Topic),MQTT工作在 TCP/IP協議族上。一個典型的 MQTT 消息發送與接收的流程如下:
1. Publisher 連接 Broker; 2. Suscriber連接 Broker,并訂閱主題 Topic; 3. Publisher 發送一條消息給 Broker,主題為 Topic; 4. Broker 收到 Publisher 的消息,查出 Suscriber 訂閱了 Topic,然后將消息轉發到 Suscriber;
我們可以簡單理解,將MQTT理解為微博工作模式,當你(Suscriber)點擊關注一個博主(Publisher)后,你就訂閱了博主(連接到了Broker),當博主發微博消息時(Publish message),微博的服務器(Broker)會將你訂閱博主的微博消息轉發給你(Subcribe message),這樣就完成了消息傳遞。
MQTT服務器搭建
Eclipse Mosquitto是一個開源消息代理,實現了MQTT協議版本3.1和3.1.1。Mosquitto輕量,適用于低功耗單板計算機到完整服務器的所有設備。Mosquitto項目還提供了用于實現MQTT客戶端的C庫,以及非常受歡迎的mosquitto_pub和mosquitto_sub命令行的MQTT客戶端(來自于翻譯)。
安裝Mosquitto的過程,首先添加mosquitto的ppa源:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
安裝mosquitto程序和mosquitto-clients客戶端程序
sudo apt installmosquitto sudo apt installmosquitto-clients
我們接下來就可以啟動mosquitto服務了,啟動可以查看一下mosquitto進程是否啟動。這里可以看到mosquitto -c參數后運行配置文件的路徑
sudo service mosquitto start ps -aux | grep mosquitto 或者 sudo service mosquitto status
接下來,我們就可以測試mqtt協議的工作流程了,首先啟動一個終端
mosquitto_sub-t "topic_name"
然后再起一個終端,使用
mosquitto_pub-t "topic_name"-m "this is a test"
這時,客戶端就會接受到訂閱的消息,服務器再次發送后,客戶端將又會接受到訂閱消息
我們可以添加一個用戶,這里我創建了一個example用戶,密碼為example
sudomosquitto_password -c /etc/mosquitto/example example
進入到"/etc/mosquitto"目錄下,可以看到剛剛創建example用戶名和密碼的配置文件
接下來我們可以添加一個用戶的配置文件,使用用戶的配置文件進行運行,我們先停止"mosquitto"服務,然后在"/etc/mosquitto/conf.d"目錄下創建一個default.conf(這里也可以拷貝"/usr/share/doc/mosquitto/example/mosquitto.conf"文件根據需求進行修改),然后重新啟動mosquitto服務,查看一下服務是否啟動。
此時重復上面的信息發送過程,使用-u參數指定用戶名,-P參數輸入密碼
以上操作均在linux終端下運行,在Windows上可以使用MQTT X工具,MQTTX 是EMQ 開源的一款跨平臺 MQTT 5.0 桌面客戶端,它能運行在 macOS,Linux,Windows上。
MQTT X 的用戶界面借助聊天軟件的形式簡化了頁面的操作邏輯,用戶可以快速創建連接保存并同時建立多個連接客戶端,方便用戶快速測試 MQTT/TCP、MQTT/TLS 的連接、發布/訂閱功能及其他特性。
打開MQTT X官網下載好以后,我們可以使用wireshark進行抓包進行分析整個的流程。
首先啟動wireshark進行監聽,然后打開MQTTX軟件新建一個鏈接,如下圖,這里名稱我設置的"mqtt_test",Client ID我使用默認分配的,服務器地址協議為"mqtt://",后面填"broker.emqx.io"。這里的EMQ X Cloud 提供的公共 MQTT 服務器,可以供我們免費使用。
下面的端口號為1883,可以進行修改,賬號和密碼隨意設置。設置好以后,就可以點擊連接了。
修改下面msg的值為我們要發送的內容,點擊小飛機進行發送。就可以看到消息的發布和訂閱過程了。
整個流程完畢后,點擊MQTTX上面的關閉連接按鈕。然后wireshark輸入"mqtt"進行過濾。
按時間排序,可以看到MQTT協議給Broker發送了一個Connect登錄請求,然后,服務器回應一個ACK,表示登錄成功。再雙擊Connect Command這條數據包,我們可以從下面窗口中看到數據包詳細的十六進制字節內容。
接下來,查看Connect Ack數據包可以看到到服務器回應了"20 02 00 00",這里表示登錄成功。
接下來看MQTT協議的 Subcribe和Publish數據包。可以看到客戶端Subcribe一個topic("test_topic/1111")
Broker返回了"90 03 99 47 00",其中"90"為 Subscribe ACK 報文固定報頭,"03" 為剩余長度,后面倆字節為id號,"00"結束。
當Publisher往這個topic 推送 Payload 時,Broker 就會把 Payload 轉發給定閱這個topic的Subcriber。這樣就完成了整個流程。
MQTT相關漏洞
授權和認證漏洞
1
MQTT 是一種機器對機器連接協議,被設計為一種極其輕量級的發布/訂閱消息傳輸,并被全球數百萬的物聯網設備廣泛使用。
MQTT-PWN 旨在成為 IoT Broker 滲透測試和安全評估操作的一站式商店,因為它結合了枚舉、支持功能和開發模塊,同時將其全部打包在命令行界面中,并易于使用和可擴展的類殼環境(來自翻譯)。
接下來,我們使用mqtt-pwn做一些mqtt授權和認證漏洞的演示,首先安裝mqtt-pwn
git clone https://github.com/akamai-threat-research/mqtt-pwn.git cdmqtt-pwn sudo docker-compose up--build --detach
然后就可以啟動MQTT-PWN了
sudo docker-compose ps sudo docker-compose run cli
下圖為MQTT-PWN運行時狀態
有一些公網開放的MQTT服務端軟件默認是開啟匿名訪問,我們可以在shodan、fofa、zoomeye等,搜索MQTT,可以看到"MQTT Connection Code: 0"。
這里如果連接某個Broker,返回結果中"MQTT Connection Code"為0就代表成功連接,如果返回值為4說明賬號密碼錯誤,如果返回值為5說明該Broker不支持用戶密碼登陸。
我們接下來使用mqtt-pwn進行連接,help 顯示幫助信息,可以使用connect命令進行連接。對于開啟匿名登錄的服務端,直接使用"connect -o host"命令就可連接,如果沒有報錯,就表示連接成功。
連接成功后,可使用system_info 查看系統信息。接下來使用discovery建立掃描,等待Scans完成才可進行下一步,否則會報錯。
使用"scans -i id",id為建立discovery的線程id。然后就可以使用"topics"查看所有topic了。
可以輸入`messages`查看topic的內容
我們可以用MQTT-PWN使用弱口令爆破某個MQTT Broker,得到其賬號密碼,然后接入Broker。
bruteforce --host host --port port
這里的暴力破解,主要還是看自己收藏的字典是否強大,另一方面就是網速的快慢。我們可以使用如下命令進行爆破,爆破成功后會顯示用戶名和密碼。"mqtt-pwn/resources/wordlists"目錄下存放了mqtt-pwn的爆破的用戶名和密碼字典,這里可以添加我們自己收藏的字典。
傳輸漏洞
2
MQTT可造成XSS攻擊,這里測試CVE-2020-13821漏洞,本次測試搭建的版本為hivemq 4.3.2。我們使用docker搭建環境進行復現,比較方便。
sudodockerpullhivemq/hivemq4:4.3.2 sudodockerrun-p8080:8080-p1883:1883hivemq/hivemq4:4.3.2
環境搭建好以后,使用瀏覽器訪問ip地址,發現運行正常。
使用上面提到的MQTTX工具進行連接。創建一個新的連接,名稱隨意填寫,Client ID為漏洞點,payload為"",然后端口填寫docker映射出的相對端口。
設置完畢后,點擊connect進行連接和發送。
連接成功后,去瀏覽器進行驗證。
點擊Clients,然后點擊“Refresh Snaphot”即可觸發執行payload
應用漏洞
3
以EMQX為例,EMQX 是一款大規模可彈性伸縮的云原生分布式物聯網 MQTT 消息服務器。作為全球最具擴展性的 MQTT 消息服務器,EMQX 提供了高效可靠海量物聯網設備連接,能夠高性能實時移動與處理消息和事件流數據,幫助您快速構建關鍵業務的物聯網平臺與應用。
我們可以搜索EMQX的相關文檔信息,獲取有用信息。
以默認用戶名和密碼為例,我們在fofa或者shodan等搜索18083端口,并且title有dashboard,就可以搜索出EMQX的相關站點,我們使用默認用戶名和密碼即可進行登錄查看。
其他漏洞
4
對于無法通過一般途徑獲取賬號密碼的客戶端,我們可以通過提取設備的固件,對其逆向分析,然后把文件系統中的證書或是賬號密碼提取出來。亦或者MQTT使用加密通信,通過提取固件分析其加密流程進行解密,并進行后續攻擊操作。
總結
這一小節我們本文簡單介紹MQTT安全相關內容,使用mosquito和mqttx完成了整個mqtt信息傳輸流程,然后復現了幾個分類中常見的MQTT漏洞。最后提醒一下大家,自己在學習過程中最好自己搭建服務進行測試,請勿對網絡上的機器目標進行測試和破壞。
審核編輯:劉清
-
傳感器
+關注
關注
2553文章
51467瀏覽量
756964 -
過濾器
+關注
關注
1文章
433瀏覽量
19760 -
MQTT協議
+關注
關注
0文章
98瀏覽量
5496
原文標題:物聯網安全實戰從零開始-MQTT協議分析
文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論