探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

責(zé)任編輯:editor004

作者:Covfefe

2017-09-01 11:36:06

摘自:黑客與極客

現(xiàn)在我將使用Kali linux,如果你的電腦中有一個(gè)集成的藍(lán)牙,或者你可以使用支持BLE(LE v4)的USB藍(lán)牙適配器,則可以控制燈泡。如果沒(méi)找到,請(qǐng)檢查燈泡是否打開(kāi),且不要將燈泡連接你的手機(jī),因?yàn)樗荘2P通信。

作為一個(gè)IoT發(fā)燒友和夜貓子安全研究員,IoT一直吸引著我,因?yàn)槲覀兠刻焓褂玫腎oT應(yīng)用程序都在讓生活變得更加輕松便利。從使用一個(gè)應(yīng)用程序到監(jiān)視,控制設(shè)備,這是我一直以來(lái)想深入的部分,而這一切都在成為可能。

我最近在亞馬遜上為我的書(shū)桌買了一個(gè)智能LED燈泡,這是一個(gè)7瓦的Syska Smartlight Rainbow LED燈,還可以通過(guò)應(yīng)用程序,在安卓移動(dòng)設(shè)備上用藍(lán)牙來(lái)控制,玩這個(gè)燈的時(shí)候發(fā)現(xiàn)它很有趣,如果whatsapp有新的通知,這個(gè)燈就會(huì)閃爍。它還能在早上叫醒我,總之我可以用很多方式和它進(jìn)行交互,但是只能從它自帶的應(yīng)用程序上操作。

不像市場(chǎng)上其他著名的智能燈泡(比如Philips Hue,LIFX),這款燈泡由印度的一家公司生產(chǎn),它使用低功耗藍(lán)牙(BLE)而不是Wifi,而且沒(méi)有API來(lái)與定制應(yīng)用程序交互,我當(dāng)時(shí)還是決定買了它,因?yàn)閮r(jià)格便宜(約135人民幣)。

在用了幾個(gè)星期后,我決定看看這個(gè)外殼底下是什么樣的,我研究藍(lán)牙和低功耗藍(lán)牙協(xié)議已經(jīng)有一段時(shí)間了,所以對(duì)這方面有所了解(這得感謝Cypress Semiconductor去年送了我一個(gè)PSoC4 BLE 開(kāi)發(fā)板)。BLE(低功耗藍(lán)牙,Bluetooth Low energy的縮寫)基本上在通信層上提供了進(jìn)行用戶定義服務(wù)的方法,為生產(chǎn)商在他們正在制造的設(shè)備上定義特有的協(xié)議配置文件,盡管BLE協(xié)議已經(jīng)有一些已經(jīng)定義好的配置文件,比如舊版的UART,BLE心率監(jiān)測(cè)器等等,生產(chǎn)商還是可以自由使用所謂的GATT,Generic Attribute Profile,然后創(chuàng)建他們自己的自定義配置文件,這些配置文件決定了它們要如何在主設(shè)備和從設(shè)備之間發(fā)生通信。

事實(shí)上,這個(gè)燈泡沒(méi)有使用基于TCP/IP協(xié)議的通信,這就使得逆向變得有點(diǎn)困難了,我的意思是:如果這個(gè)燈是在家庭網(wǎng)絡(luò)中,事情不就變得更加容易了嗎?我可以用WireShark通過(guò)它的MAC或IP來(lái)嗅探數(shù)據(jù)包,然后保存在PCAP文件中方便之后的分析,數(shù)據(jù)包是很容易嗅探的,基本上類似于中間人這種東西,甚至一個(gè)簡(jiǎn)單的CLI tcpdump也有用,但是現(xiàn)實(shí)是這是使用對(duì)等網(wǎng)絡(luò)的藍(lán)牙,在同一時(shí)間內(nèi),一個(gè)BLE設(shè)備只能與一個(gè)中心設(shè)備通信。

從之前的BLE項(xiàng)目中我了解到Nordic Semiconductor的一款在安卓或IOS上運(yùn)行的一個(gè)神奇的應(yīng)用程序,它叫nrf connect,可以用來(lái)探索設(shè)備暴露出的GATT service和characteristic,我可以用它來(lái)連接我的燈泡,然后就能知道它的唯一地址(某種MAC地址)還能找到GATT service和響應(yīng)的characteristic,這是個(gè)很好的起點(diǎn)不是嗎?我迅速在我的安卓手機(jī)上安裝并打開(kāi)了nrf connect,打開(kāi)藍(lán)牙并掃描設(shè)備,結(jié)果迅速出現(xiàn)在屏幕上,名叫“Cnlign”。

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

  連接之后顯示三個(gè)GATT service,如下圖所示:

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

燈泡暴露的三個(gè)GATT service中 ,有兩個(gè)在大多數(shù)BLE設(shè)備上通用,它們分別是UUID為01800的Generic access和UUID為01801的Generic Attribute,你可以查看Bluetooth GATT website來(lái)查找更多,這些service定義了設(shè)備名,設(shè)備種類和狀態(tài),如下圖所示:

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

 

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

 

除了那兩個(gè),還有一個(gè)是用戶定義的service,看到128位的UUID,我可以說(shuō)這是生產(chǎn)商定義的BLE GATT profile。

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

現(xiàn)在看service,我當(dāng)時(shí)很確定其中一個(gè)characteristic就是控制燈泡顏色的,但是之后我非常失望,因?yàn)槲耶?dāng)時(shí)期待能有個(gè)叫RGB color或者其他什么的,但是所有service都被標(biāo)記為unknown characteristic,如果我找到了service的名字,UUID,我就能發(fā)送一些數(shù)據(jù)包看看是什么反應(yīng),但事實(shí)并非如此,因此下一步只能嗅探BLE應(yīng)用程序發(fā)給燈泡的數(shù)據(jù)包,我在這次的搜索中知道了設(shè)備地址,GATT service和讀取的或?qū)懭氲腸haracteristic,這對(duì)之后的步驟是很有幫助的。

我聽(tīng)說(shuō)過(guò)Great Scott的一個(gè)叫Ubertooth One的設(shè)備,它能嗅探藍(lán)牙數(shù)據(jù)包,但是看到價(jià)格和產(chǎn)地,我決定尋找替代方案,經(jīng)過(guò)查找,我發(fā)現(xiàn)還有其他Nordic和Cypress Semiconductor的一些硬件,不過(guò)研究一個(gè)燈泡,卻花費(fèi)多于一個(gè)燈泡的錢,這沒(méi)有意義不是嗎?

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

進(jìn)一步的谷歌搜索之后,我在StackOverFlow上找到了替代方法,Android 4.4(katkat)可以將藍(lán)牙數(shù)據(jù)包記錄在一個(gè)文件中,我深入了解了一下,發(fā)現(xiàn)需要啟用開(kāi)發(fā)者模式,連接藍(lán)牙設(shè)備然后交互,所有記錄將會(huì)被記錄到SD卡中的“btsnoop_hci”文件中。

如果你使用的是安卓4.4(kitkat)或更高版本的手機(jī),那么就可以通過(guò)設(shè)置 –開(kāi)發(fā)人員選項(xiàng) –啟用藍(lán)牙HCI監(jiān)聽(tīng)日志來(lái)啟用此功能,這是藍(lán)牙調(diào)試工具的基礎(chǔ),啟用之后,所有藍(lán)牙日志會(huì)被記錄到文件“btsnoop_hci”中,我啟用了這個(gè)功能,并且運(yùn)行了控制燈泡的應(yīng)用程序,和往常一樣改變燈泡的顏色,這次我更多地注意在基本顏色上,比如紅色,藍(lán)色和綠色,這將幫助我在分析包時(shí)過(guò)濾數(shù)據(jù)流。關(guān)掉程序,文件果然生成了!一個(gè)不到20Kb的日志文件就能控制燈泡,而不需要拆開(kāi)它:P

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

下一步就是將文件拷貝到電腦上,用Wireshark將其可視化,說(shuō)真的,Wireshark真是個(gè)超級(jí)棒的工具,通過(guò)了解基本的教程,然后動(dòng)手實(shí)踐,就能找到很多有趣的東西。

燈泡工作的方式可能是通過(guò)從應(yīng)用程序中獲取紅,綠,藍(lán)或所謂的RGB值,然后通過(guò)更改燈炮中相應(yīng)的LED顏色來(lái)響應(yīng),也有可能直接使用顏色名稱,然后通過(guò)EEPROM中的查找表來(lái)映射強(qiáng)度,從幾個(gè)過(guò)去的RGB LED項(xiàng)目中,我知道任何顏色可以都映射為紅色綠色和藍(lán)色強(qiáng)度的值,通常是8位(0-255),0表示關(guān)閉,255表示來(lái)自RGB的特定顏色的全部強(qiáng)度,這些強(qiáng)度使用來(lái)自定時(shí)器IC或微控制器的脈寬調(diào)制信號(hào)(PWM)來(lái)改變。我過(guò)去已經(jīng)做過(guò)這樣的項(xiàng)目,如果有興趣去查看我的項(xiàng)目IoT Holicay Lights和OpenHAB RGB控制器,這些使用的都是相同的概念。

如果仔細(xì)看下面的截圖,你會(huì)發(fā)現(xiàn)一些有趣的事情,destination有兩個(gè)標(biāo)簽/值:localhost,也就是我們的安卓手機(jī),另一種是“Texas Instruments”,具有特定的唯一地址,谷歌了一下,我發(fā)現(xiàn)它是Texas Instruments的基于BLE的芯片“CC2540“,而燈泡用的可能就是這個(gè),我們之前從GATT service收集的UUID也表明是相同的芯片:D 所以現(xiàn)在就算不打開(kāi)燈泡,我們也知道里面是什么了;)

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

進(jìn)一步研究之后,我發(fā)現(xiàn)整體通信中涉及的協(xié)議種類較少,在Wireshark中可以看到:HCI_E, HCI_C, ATT等等,ATT看起來(lái)很有趣,應(yīng)用ATT過(guò)濾器可以只顯示ATT數(shù)據(jù)包,然后我應(yīng)用了藍(lán)牙邏輯鏈路控制和適配協(xié)議(btl2cap)的過(guò)濾器,并嘗試分析從本地主機(jī)發(fā)送到燈泡的數(shù)據(jù)包。

研究了20-40個(gè)數(shù)據(jù)包之后,我發(fā)現(xiàn)了輕微變化的字符串,看下面:

Value: 00100006000a03000101000025ff00000000

Value: 00110006000a030001010049ff0000000000

Value: 00120006000a0300010100ff000000000000

Value: 00130006000a030001010049ff0000000000

Value: 00140006000a03000101000025ff00000000

發(fā)現(xiàn)了嗎?再弄個(gè)再簡(jiǎn)單一點(diǎn)的:

Value: 0010000 6000a0300010100 0025ff 00000000

Value: 0011000 6000a0300010100 49ff00 00000000

Value: 0012000 6000a0300010100 ff0000 00000000

Value: 0013000 6000a0300010100 49ff00 00000000

Value: 0014000 6000a0300010100 0025ff 00000000

第一組顯然是遞增的字符串,可能是某種數(shù)據(jù)包的序列號(hào)(可以是寫指令操作碼或只是數(shù)據(jù)包號(hào)),后一組只是8個(gè)零的字符串。 中間的字符串才是重點(diǎn),和我猜的差不多,6字節(jié)的字符串,紅色藍(lán)色和綠色各兩個(gè)字節(jié)。

0025ff –> 00 25 ff (紅色關(guān)閉 藍(lán)色25 綠色滿密度)

9ff00

ff0000

49ff00

0025ff 等等 ………

探索低功耗藍(lán)牙之看我如何逆向物聯(lián)網(wǎng)燈泡并控制它

通過(guò)這種方式,如果你想要產(chǎn)生藍(lán)色,可以在8個(gè)0和UUID之間加上00ff00,如“00140006000a030001010000ff0000000000”,把這個(gè)通過(guò)BLE發(fā)給燈泡,地址已經(jīng)從暴露的GATT中知道。理論上很簡(jiǎn)單,實(shí)際操作中,可能是反轉(zhuǎn)的字符串,比如不是RGB而是BGR(另一種常見(jiàn)的顏色表示方式),其中0表示全亮度,255表示關(guān)閉。

現(xiàn)在我將使用Kali linux,如果你的電腦中有一個(gè)集成的藍(lán)牙,或者你可以使用支持BLE(LE v4)的USB藍(lán)牙適配器,則可以控制燈泡。我很確定我的Macbook Air有一個(gè)。 我設(shè)置了虛擬機(jī),通過(guò)虛擬機(jī)的USB傳輸使用主機(jī)(Macbook Air)的內(nèi)置藍(lán)牙硬件, 在這一點(diǎn)上,我不知道Kali是否支持驅(qū)動(dòng)。賭一把,我雖然有一個(gè)支持藍(lán)牙的樹(shù)莓派,但是還是想先試一下前者。

在linux虛擬機(jī)上,我打開(kāi)終端檢查設(shè)備是否運(yùn)行:

root@kali:~# hciconfig

hci0: Type: Primary Bus: USB

BD Address: E0:AC:CB:81:CE:37 ACL MTU: 1021:8 SCO MTU: 64:1

UP RUNNING

RX bytes:1859 acl:2 sco:0 events:106 errors:0

TX bytes:3059 acl:3 sco:0 commands:94 errors:0

開(kāi)心!設(shè)備被檢測(cè)到了!現(xiàn)在就要安裝所需要的包了。

root@kali:~# apt-get install bluez bluez-hcidump, bluez-tools

運(yùn)行下面的命令掃描BLE設(shè)備:

root@kali:~# hcitool lescan

LE Scan ...

88:C2:55:CA:F0:36 (unknown)

88:C2:55:CA:F0:36 Cnligh

注意:設(shè)備Cnligh是我們的燈泡,另一個(gè)設(shè)備可能是我的智能健身追蹤器。

如果沒(méi)找到,請(qǐng)檢查燈泡是否打開(kāi),且不要將燈泡連接你的手機(jī),因?yàn)樗荘2P通信。

接下來(lái)我們連接設(shè)備:

root@kali:~# gatttool -I

[ ][LE]> connect 88:C2:55:CA:F0:36

Attempting to connect to 88:C2:55:CA:F0:36

Connection successful

[88:C2:55:CA:F0:36][LE]>

在這里,我使用gatttool Bluez程序通過(guò)地址連接到燈泡。

注意:如果出現(xiàn)任何錯(cuò)誤,在/etc/bluetooth/main.conf中添加以下內(nèi)容:

EnableLE = true // Enable Low Energy support. Default is false.

AttributeServer = true // Enable the GATT attribute server. Default is false.

然后重啟:

root@kali:~# etc/init.d/bluetooth restart

再次嘗試,應(yīng)該就能成功了。

一旦你連上了燈泡,你就能發(fā)現(xiàn)更多:

[88:C2:55:CA:F0:36][LE]> help

help Show this help

exit Exit interactive mode

quit Exit interactive mode

connect [address [address type]] Connect to a remote device

disconnect Disconnect from a remote device

primary [UUID] Primary Service Discovery

included [start hnd [end hnd]] Find Included Services

characteristics [start hnd [end hnd [UUID]]] Characteristics Discovery

char-desc [start hnd] [end hnd] Characteristics Descriptor Discovery

char-read-hnd Characteristics Value/Descriptor Read by handle

char-read-uuid [start hnd] [end hnd] Characteristics Value/Descriptor Read by UUID

char-write-req Characteristic Value Write (Write Request)

char-write-cmd Characteristic Value Write (No response)

sec-level [low | medium | high] Set security level. Default: low

mtu Exchange MTU for GATT/ATT

[88:C2:55:CA:F0:36][LE]> primary

attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb

attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb

attr handle: 0x0010, end grp handle: 0xffff uuid: 0000f371-0000-1000-8000-00805f9b34fb

[88:C2:55:CA:F0:36][LE]> characteristics

handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb

handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb

handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb

handle: 0x0008, char properties: 0x08, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb

handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb

handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb

handle: 0x0011, char properties: 0x0a, char value handle: 0x0012, uuid: 0000fff1-0000-1000-8000-00805f9b34fb

handle: 0x0014, char properties: 0x0a, char value handle: 0x0015, uuid: 0000fff2-0000-1000-8000-00805f9b34fb

handle: 0x0017, char properties: 0x0a, char value handle: 0x0018, uuid: 0000fff3-0000-1000-8000-00805f9b34fb

handle: 0x001a, char properties: 0x0a, char value handle: 0x001b, uuid: 0000fff4-0000-1000-8000-00805f9b34fb

handle: 0x001d, char properties: 0x0a, char value handle: 0x001e, uuid: 0000fff5-0000-1000-8000-00805f9b34fb

handle: 0x0020, char properties: 0x0a, char value handle: 0x0021, uuid: 0000fff6-0000-1000-8000-00805f9b34fb

handle: 0x0023, char properties: 0x0a, char value handle: 0x0024, uuid: 0000fff7-0000-1000-8000-00805f9b34fb

handle: 0x0026, char properties: 0x0a, char value handle: 0x0027, uuid: 0000fff8-0000-1000-8000-00805f9b34fb

handle: 0x0029, char properties: 0x10, char value handle: 0x002a, uuid: 0000fff9-0000-1000-8000-00805f9b34fb

[88:C2:55:CA:F0:36][LE]>

現(xiàn)在我們嘗試通過(guò)發(fā)送下方字符串來(lái)改變燈泡顏色:

[88:C2:55:CA:F0:36][LE]> char-write-cmd 0x0012 00140006000a0300010100ff000000000000

然后果然變成紅色了!?。∫曨l在下面。

再試試藍(lán)色:

[88:C2:55:CA:F0:36][LE]> char-write-cmd 0x0012 00140006000a030001010000ff0000000000`

再試試綠色:

[88:C2:55:CA:F0:36][LE]> char-write-cmd 0x0012 00140006000a03000101000000ff00000000`

一切都在按預(yù)期發(fā)生。

演示

為了演示工作,我準(zhǔn)備了一個(gè)小的bash腳本,將燈泡的顏色循環(huán)到紅色 –>綠色 –>藍(lán)色 –>白色 –>關(guān)閉

#!/bin/bash

echo"Controlling SYSKA Smart light bulb"

sleep 3

echo"Look Mah! No App "

sleep 3

while true;

do

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a030001010000000000000000 >/dev/null

sleep 3

echo"RED"

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a0300010100ff000000000000 >/dev/null

sleep 3

echo"GREEN"

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a030001010000ff0000000000 >/dev/null

sleep 3

echo"BLUE"

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a03000101000000ff00000000 >/dev/null

sleep 3

echo"WHITE"

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a0300010100ffffff00000000 >/dev/null

sleep 3

echo"OFF"

gatttool -i hci0 -b 88:C2:55:CA:F0:36 --char-write-req -a 0x0012 -n 00100006000a030001010000000000000000 >/dev/null

done

exit 0

GitHub上也有。

您可以使用顏色選擇器(如HTML顏色選擇器)中的RGB值來(lái)模擬任何顏色。

視頻

思考

雖然這是一個(gè)有趣的逆向IoT設(shè)備的功能的項(xiàng)目,但看到數(shù)據(jù)包不是加密的,我仍然很傷心,很多公司專注于縮短他們的物聯(lián)網(wǎng)產(chǎn)品的上市時(shí)間,但在這個(gè)過(guò)程中,他們并沒(méi)有采取最大的措施來(lái)確保設(shè)備的安全,這只是一個(gè)藍(lán)牙智能電燈泡,不會(huì)搞出大新聞,黑客最多也只能改變你家里的燈泡顏色,但是如果智能鎖也是這樣,那么麻煩就大了,你的車庫(kù)和家門就會(huì)受到很大威脅?;蛘咭粋€(gè)基于tcp的設(shè)備,可以在DDoS攻擊時(shí)充當(dāng)僵尸網(wǎng)絡(luò)的一員,令人失望的是生產(chǎn)商只是簡(jiǎn)單地參照了示例代碼, 甚至不改變藍(lán)牙協(xié)議本身提供的128位UUID靈活性。

下一步

我現(xiàn)在有了API,正在計(jì)劃一個(gè)小型項(xiàng)目,從Yahoo Weather或Weather Underground等在線服務(wù)中獲取我的位置的天氣數(shù)據(jù),并使我的燈泡天氣變化實(shí)時(shí)反應(yīng),例如雨天呼吸藍(lán)色,陽(yáng)光充足就用白色,溫暖的一天用橙色。 我可以使用Python Bluez API(pyBlue或其他)。請(qǐng)保持關(guān)注,另外,感謝閱讀:)

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)