前言
在這篇文章中,我們將為讀者介紹如何對物聯(lián)網(wǎng)設(shè)備進行安全評估。這里將會詳細介紹進行評估所需的基本方法:對于不同的任務(wù)需要使用哪些工具,以及如何解決在分析過程中可能出現(xiàn)的問題。本文的目標(biāo)讀者對為對物聯(lián)網(wǎng)設(shè)備安全分析感興趣的朋友,對逆向工程感興趣的讀者,或者只想了解如何通過技術(shù)手段來處理未知設(shè)備的讀者。
本文的重點不在于揭示某種設(shè)備的某種漏洞,而在于闡釋影響各種IoT設(shè)備的安全弱點,因此,本文介紹的內(nèi)容同樣適用于其他的設(shè)備和場景。
分析對象
本文的分析對象是來自eQ-3公司的 MAX! Cube LAN Gateway (以下稱為“Cube”)。實際上,許多產(chǎn)品都捆綁了該設(shè)備,比如我的加熱控制系統(tǒng)中就帶有該設(shè)備。通過該設(shè)備名稱中的“Cube”不難猜出,它只是一個LAN網(wǎng)關(guān),通過RF技術(shù)實現(xiàn)真正的“物聯(lián)網(wǎng)設(shè)備”或“智能設(shè)備”之間的通信。在本文中,我們將重點介紹以太網(wǎng)通信,因為它是管理軟件的主要通信方式。
搭建中間人攻擊場景
為了全面地了解該設(shè)備的通信狀況,我搭建了一個簡單的中間人攻擊場景。我在自己的系統(tǒng)上使用了一個USB網(wǎng)卡,并將其直接連接到Cube。首先,打開Cube,但是不要使用任何管理客戶端或其他需要通信的軟件,這樣就能了解Cube自身發(fā)送了什么數(shù)據(jù)包。我們發(fā)現(xiàn),它只是試圖通過DHCP獲得IP,然后開始解析ntp.homematic.com。
為了讓Cube可以訪問互聯(lián)網(wǎng),我已將自己的USB網(wǎng)卡配置為Cube的路由器。為了在不使用DHCP的時候可以通過192.168.0.222訪問Cube,我把設(shè)備的IP地址設(shè)為192.168.0.1/24,并進行了如下所示的配置,以允許通過USB網(wǎng)卡的NAT訪問互聯(lián)網(wǎng):
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o enp0s25 -j MASQUERADE
iptables -A FORWARD -i enp0s20u9u3 -o enp0s25 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
注意:設(shè)備enp0s20u9u3是連接到Cube的USB網(wǎng)卡,enp0s25是系統(tǒng)上的另一個網(wǎng)卡,該網(wǎng)卡連接到具有互聯(lián)網(wǎng)連接的路由器上。
因為Cube會向默認的路由器發(fā)送DNS查詢,所以,我們可以在機器上設(shè)置一個DNS服務(wù)器,或者直接將DNS查詢轉(zhuǎn)發(fā)給相應(yīng)的域名服務(wù)器(例如OpenDNS服務(wù)器):
iptables -t nat -A PREROUTING -i enp0s20u9u3 -p udp --dport 53 -j DNAT --to 208.67.222.222:53
iptables -t nat -A PREROUTING -i enp0s20u9u3 -p tcp --dport 53 -j DNAT --to 208.67.222.222:53
這樣一來,我們就能設(shè)法觀察Cube發(fā)送的所有的數(shù)據(jù)了,例如使用Wireshark或tcpdump等工具來嗅探連接到Cube的NIC上通信數(shù)據(jù)。
發(fā)現(xiàn)網(wǎng)絡(luò)中的Cube設(shè)備
為了方便管理員自動識別本地網(wǎng)絡(luò)上的Cube設(shè)備,Cube提供了相應(yīng)的網(wǎng)絡(luò)發(fā)現(xiàn)功能。下面的Wireshark屏幕截圖展示了由本地管理軟件發(fā)送的數(shù)據(jù)包:
該軟件會向23272端口上的多播組地址224.0.01發(fā)送UDP數(shù)據(jù)包。在右下方,標(biāo)記出來的hexdump部分是有效載荷(eQ3Max * x00 ********** I)。這是一個所謂的身份消息,用來命令Cube向數(shù)據(jù)包的源主機報告其序列號。下面的截圖顯示了Cube的響應(yīng):
同樣,這里響應(yīng)的有效載荷也在右下側(cè)(eQ3MaxApKMD1016788> I)做了標(biāo)記。 我的設(shè)備的序列號是KMD1016788,所以一切正常?,F(xiàn)在,我們只要發(fā)送這樣的UDP數(shù)據(jù)包,就能輕松找出本地網(wǎng)絡(luò)上所有的Cube設(shè)備。同時,我們也可以檢查某個主機是否是使用單播數(shù)據(jù)包的Cube設(shè)備。
我們自己也可以發(fā)送所有這些數(shù)據(jù)包,甚至單播數(shù)據(jù)包。對于這些任務(wù),我更喜歡使用Scapy來完成。因為有了它,我們就可以在交互式Python shell中創(chuàng)建、發(fā)送/接收和操作數(shù)據(jù)包,這樣做是很方便的,因為這樣可以同時進行其他任務(wù),如進行計算或數(shù)據(jù)轉(zhuǎn)換。Cube使用的UDP端口是23272。我們可以從前面的示例中獲取相應(yīng)字符串(這是一個“身份消息(identity message)”,由有效載荷末尾的“I”表示),并將其發(fā)送到目標(biāo)主機:
>>> p = Ether()/IP(src="192.168.0.1", dst="192.168.0.222")/UDP(sport=23272, dport=23272)/Raw("eQ3Max*