藍牙是一種短距的無線通訊技術,可實現固定設備、移動設備之間的數據交換。可以說藍牙是當今世界上,最受歡迎和使用最為廣泛的無線技術之一。隨著物聯網的快速發展,藍牙技術也加速了其發展步伐以適應不斷增長的市場和用戶需求。藍牙特別興趣小組(SIG)正不斷努力提高藍牙的傳輸速度,以讓藍牙技術更好的融合于各種物聯網設備當中。
低功耗藍牙(BLE)是藍牙4.0規范的一部分,其包括傳統藍牙和藍牙高速協議。相較于傳統藍牙,BLE旨在使用更低的功耗,并保持同等距離的通信范圍。BLE只在需要時傳輸少量數據,而除此之外則會保持關閉狀態,這大大降低了其功耗,也使其成為了在低數據速率下需要長久連接使用的理想選擇。BLE非常適合運用于電視遙控器,但對于需要傳輸大量數據的無線媒體流設備則并不適用。
BLE內置于我們今天使用的許多電器或智能設備當中,例如智能手機,智能電視,醫療設備,咖啡機等等。
BLE 受歡迎的原因?
支持多平臺,以下列出的設備和平臺均支持藍牙 4.0和BLE:
iOS5+ (iOS7+ preferred)
Android 4.3+ (numerous bug fixes in 4.4+)
Apple OS X 10.6+
Windows 8 (XP, Vista and 7 only support Bluetooth 2.1)
GNU/Linux Vanilla BlueZ 4.93+
Windows Phone
BLE 聽上去不錯,但真的如此嗎?
從安全的角度來看,這個問題提的非常的好。事實是 – BLE只是一個協議。制造商可以在他們的設備中安全地實施BLE。但如果隨機數生成器無法生成“足夠強壯”的隨機數,那么即使最強的加密協議也可能被破解,這同樣也適用于BLE。因此,換句話來說就是BLE的安全性實際掌握在其實施者手中。
雖然,所有低功耗藍牙設備開發的主要動機都是為了增強用戶體驗。但與此同時,我們需要思考的是安全性是否也已同步?
下面,讓我們看看影響BLE安全性的三個主要漏洞:
1. 竊聽
考慮常規的BLE通信,一端是手機,一端是BLE設備。假如二者沒有進行認證加密,那么在通信開始之前,在附近開啟一個BLE Sniffer,就可以看到手機與BLE設備之間的連接后的通信數據明文。
2. MITM 攻擊
MITM(Man in the Middle)中間人攻擊是指第三方設備混入BLE通信鏈路之間,偽造通信數據迷惑雙方。
假如設備A和設備B在通信之始,設備M注意到二者要進行通信,設備M截取設備A發起的連接請求,偽裝成設備B跟其建立連接進行通信,通信完畢后再偽裝成設備A向設備B發起連接請求,建立連接后重復設備A在前面發送的數據。這樣設備A就一直以為在跟設備B進行通信,設備B也同樣,卻不知中間還藏著一個第三者。
3. 拒絕服務攻擊
由于目前大多數無線設備都使用內置電池組,因此這些設備存在遭受拒絕服務攻擊(DoS)的風險。DoS攻擊會導致系統頻繁崩潰,并耗盡其電池電量。Fuzzing攻擊也會導致系統崩潰,因為攻擊者可能會將格式錯誤或非標準數據,發送到設備的藍牙無線電檢查其響應,并最終擊垮設備。
BLE 的核心概念
BLE有兩個基本概念:
GAP – 通用屬性配置文件
GATT – 通用屬性
GAP
GAP(Generic Access Profile)主要負責控制設備連接和廣播。GAP使你的設備被其他設備可見,并決定了你的設備是否可以或者怎樣與合同設備進行交互。
GAP給設備定義了若干角色,其中主要的兩個是:外圍設備(Peripheral)和中心設備(Central)。
外圍設備:這一般就是非常小或者簡單的低功耗設備,用來提供數據,并連接到一個更加相對強大的中心設備。
中心設備:中心設備相對比較強大,用來連接其他外圍設備。例如手機等。
廣播協議
GAP的廣播工作流程如下圖所示:
在GAP 中外圍設備通過兩種方式向外廣播數據:Advertising Data Payload(廣播數據)和Scan Response Data Payload(掃描回復),每種數據最長可以包含31字節。這里廣播數據是必需的,因為外設必需不停的向外廣播,讓中心設備知道它的存在。掃描回復是可選的,中心設備可以向外設請求掃描回復,這里包含一些設備額外的信息,例如設備的名字。
GATT
GATT(Generic Attribute Profile)定義了兩個BLE設備,通過Service 和Characteristic進行通信。GATT使用了ATT(Attribute Protocol)協議,ATT 協議把 Service,Characteristic對應的數據保存在一個查找表中,次查找表使用 16 bit ID 作為每一項的索引。一旦兩個設備建立起了連接,GATT 就開始起作用了,這也意味著,GATT只有在GAP管理的廣播流程完成后才能啟動。
GATT的兩個主要概念:
Services
Characteristics
Service
Service是把數據分成一個個的獨立邏輯項,它包含一個或者多個 Characteristic。每個 Service 有一個 UUID 唯一標識。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通過認證的,需要花錢購買,128 bit 是自定義的,這個就可以自己隨便設置。
官方通過了一些標準 Service,完整列表在這里。以 Heart Rate Service為例,可以看到它的官方通過 16 bit UUID是0x180D,包含3個Characteristic:Heart Rate Measurement, Body Sensor Location和Heart Rate Control Point,并且定義了只有第一個是必須的,它是可選實現的。
Characteristic
在GATT事務中的最低界別的是Characteristic,Characteristic是最小的邏輯數據單元,當然它可能包含一個組關聯的數據,例如加速度計的 X/Y/Z三軸值。
與Service類似,每個 Characteristic用16 bit或128 bit的UUID唯一標識。你可以免費使用Bluetooth SIG官方定義的標準 Characteristic,使用官方定義的,可以確保 BLE 的軟件和硬件能相互理解。當然,你可以自定義Characteristic,這樣的話就只有你自己的軟件和外設能夠相互理解。
例如,SIG規定的官方TX功耗UUID是0×1804。
利用 BLE 的工具
Linux為BLE提供了最好的支持。想要使用BLE,我們需要安裝blueZ。命令如下:
sudo apt-get install bluez
這里我使用的是Ubuntu系統的電腦,該設備將作為與其他外圍設備通信的中心網關。安裝完成后,我們需要兩個工具來掃描,連接和讀/寫數據。
hcitool
gatttool
在開始之前,我們需要掃描附近的BLE設備。找到后我們需要設法與其建立連接,讀/寫數據,發現其中的漏洞以進行利用。因此,hcitool是我們必不可少的工具。hcitool
hcitool利用了筆記本電腦中的主機控制器接口與BLE設備進行通信以及執行讀/寫/更改操作。因此,hcitool可用于查找廣播的可用受害者BLE設備,然后連接后更改其值。
但要更改值/數據,我們必須首先要知道service和characteristic。因此,我們就需要用到gatttool。
gatttool
gatttool的作用就是找出可用BLE設備的service和characteristic,以執行對受害者數據的讀取/寫入操作。
命令 cheatsheet
命令
功能
hciconfig
用于配置藍牙設備。 我們可以運行此命令列出連接到我們計算機的BLE加密狗及其基本信息。
hciconfig hciX up
打開名為hciX的藍牙設備
有關更多命令請參閱:https://helpmanual.io/man1/hciconfig/
Hcitool 命令
hcitool用于配置藍牙連接并向藍牙設備發送一些指定命令。
命令
功能
hcitool -i hciX
使用hciX接口。如未指定,則默認為第一個可用接口
hcitool scan
掃描處于可發現模式的傳統藍牙設備
hcitool lescan
掃描BLE藍牙設備
有關更多命令請參閱:https://helpmanual.io/man1/hcitool/
Gattool 命令
命令
功能
gatttool -I
以交互模式啟動gatttool
gatttool -t random -b [adr] -I
使用隨機LE地址以交互模式啟動gattool。連接到具有地址adr的遠程藍牙設備。
primary
檢查連接的BLE設備的可用services
characteristic
檢查我們可以從中讀取數據的所連接BLE設備的可用characteristics
char-desc
Characteristics Descriptor發現
char-read-hnd
讀取characteristic
char-write-req
將值寫入handle句柄
有關更多命令請參閱:https://helpmanual.io/man1/gatttool/
使用示例
hciconfig:列出所有連接的BLE適配器。
hciconfig hciX up:啟用名為hciX的BLE適配器。
hciconfig hciX down:禁用名為hciX的BLE適配器。
hcitool lescan:掃描附近的BLE設備。
獲取BLE設備的地址后,我們需要連接它,現在我們就要用到gatttool了。
gatttool -I:以交互REPL模式啟動gatttool,用戶可以在其中發送各種命令,如下所示。
connect :使用指定的地址連接到BLE設備。
如果設備僅使用手機連接而不是電腦,則上述操作步驟可能無效。為了連接這些設備,我們需要使用隨機地址。
gatttool -t random -b -I:使用隨機地址連接到設備。
連接成功后,我們可以使用命令查看設備的services和characteristics。
Primary
Characteristics
在找到services和characteristics之后,我們需要知道我們可以使用char-desc命令讀取/寫入數據的句柄。
我們還可以使用char-desc 01 05之類的命令,將顯示的句柄過濾到特定范圍,該命令將顯示從1到5的5個句柄。
找到句柄后,我們使用char-read-hnd 命令從中讀取數據。
為了寫入特定句柄,我們需要知道哪一個是寫句柄。我們可以嘗試逐個讀取所有句柄,直到出現讀取錯誤提示。讀取錯誤意味著特定句柄是寫句柄(因為寫句柄是無法讀取的)。或者,你也可以使用像nrf connect這樣的應用程序為你自動找出寫句柄。
句柄0x000b有一個UUID,如下圖所示:
使用nRF Connect后我獲取到了以下輸出,這也為我們確認了句柄0x000b確實是一個寫句柄。上圖中句柄0x000b的UUID和nrf連接匹配。
連接到燈泡后,我們可以將隨機值寫入不同的characteristics。在大多數情況下,寫入隨機值將無法按預期工作。要在句柄中寫入正確的值,我們需要解密數據協議,我們可以使用像wireshark和ubertooth之類的嗅探工具找到。
解密數據協議后,我們可以使用命令char-write-req 在句柄中寫入值。
如果char-write-req報錯,我們可以使用char-write-cmd代替。
藍牙 hci snoop log
從Android 4.4開始增加了一個用來記錄從設備進出的所有藍牙數據包的選項。要啟用藍牙流量捕獲,請按照以下步驟操作。請確保Android app已安裝。
第1步:打開手機設置并啟用開發人員選項。
第2步:打開“開發人員選項”并啟用藍牙HCI snoop log。
第3步:運行Android app(magic blue)并向燈泡發送一些更改顏色的指令。多重復操作幾遍。
第4步:我們可以在/sdcard/btsnoop_hci.log 或 /internal Storage/btsnoop_hci.log中找到藍牙流量的捕獲文件。
注 – 在某些設備中,btsnoop_hci.log會被創建在其它位置,例如/sdcard/Android/data/btsnoop_hci.log。
使用電子郵件或Google Drive將捕獲的日志文件傳輸到電腦上,或者你也可以通過USB數據線將Android設備與電腦連接。
第5步:在Wireshark中分析捕獲的數據包。Wireshark是一個免費的開源數據包分析工具,如果你沒有安裝可以通過以下命令進行安裝。
sudo apt install wireshark-qt
有關如何使用Wireshark進行分析的內容,請參閱:https://blog.attify.com/exploiting-iot-enabled-ble-smart-bulb-security/
或者,你也可以在像nano這樣的文本編輯器中打開捕獲文件。
使用 nRF Connect
nRF connect同樣可用于嗅探和寫入數據。
第6步:打開nRF Connect app并連接BLE燈泡。
第7步:連接后,寫入payload值56b0306000f0aa。點擊發送后,燈泡的顏色將會發生改變。
這是因為顏色的RGB值為176,48,96或B03060(十六進制)。 我們發給燈泡的命令是56 b0 30 60 00 f0 aa。第二個,第三個和第四個字節分別對應于十六進制的RGB值。
使用 Bleach 攻擊 BLE
Bleah是一款基于bluepy python庫的BLE藍牙掃描器。
在開始使用它之前,我們需要滿足以下軟硬件條件:
硬件
運行Linux的電腦最好是Ubuntu系統
智能BLE燈泡或任何其他藍牙智能設備
藍牙適配器
軟件
Python 2.7(已在Ubuntu上默認安裝)
Bluepy library
Bleah
首先,我們需要確保Bluepy庫能正常工作。
轉到bluepy目錄,打開終端并輸入:
sudo ./bluepy-helper 0
le on
如下所示:
(注:Bluepy的安裝路徑,只需運行bluepy-helper即可找到)
success表明Bluepy運行正常。下面,讓我們看看如何使用Bleah攻擊BLE。
|