低功耗藍芽(BLE)攻擊分析
前言
藍芽是一種短距的無線通訊技術,可實現固定裝置、移動裝置之間的資料交換。可以說藍芽是當今世界上,最受歡迎和使用最為廣泛的無線技術之一。隨著物聯網的快速發展,藍芽技術也加速了其發展步伐以適應不斷增長的市場和使用者需求。藍芽特別興趣小組(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,完整列表在 ofollow,noindex" target="_blank">這裡 。以 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 <addr>:使用指定的地址連線到BLE裝置。
如果裝置僅使用手機連線而不是電腦,則上述操作步驟可能無效。為了連線這些裝置,我們需要使用隨機地址。
gatttool -t random -b <addr> -I:使用隨機地址連線到裝置。
連線成功後,我們可以使用命令檢視裝置的services和characteristics。
Primary
Characteristics
在找到services和characteristics之後,我們需要知道我們可以使用char-desc命令讀取/寫入資料的控制代碼。
我們還可以使用char-desc 01 05之類的命令,將顯示的控制代碼過濾到特定範圍,該命令將顯示從1到5的5個控制代碼。
找到控制代碼後,我們使用char-read-hnd <handle>命令從中讀取資料。
為了寫入特定控制代碼,我們需要知道哪一個是寫控制代碼。我們可以嘗試逐個讀取所有控制代碼,直到出現讀取錯誤提示。讀取錯誤意味著特定控制代碼是寫控制代碼(因為寫控制代碼是無法讀取的)。或者,你也可以使用像nrf connect這樣的應用程式為你自動找出寫控制代碼。
控制代碼0x000b有一個UUID,如下圖所示:
使用nRF Connect後我獲取到了以下輸出,這也為我們確認了控制代碼0x000b確實是一個寫控制代碼。上圖中控制代碼0x000b的UUID和nrf連線匹配。
連線到燈泡後,我們可以將隨機值寫入不同的characteristics。在大多數情況下,寫入隨機值將無法按預期工作。要在控制代碼中寫入正確的值,我們需要解密資料協議,我們可以使用像wireshark和ubertooth之類的嗅探工具找到。
解密資料協議後,我們可以使用命令char-write-req <handle> <value>在控制代碼中寫入值。
如果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/">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。
第1步:在相同終端內輸入Scan命令掃描附近的BLE裝置。
我們的BLE裝置地址是:F81D78607184
第2步:開啟一個新終端並輸入命令sudo bleah -t0,其中t0表示連續掃描。
第3步:我們可以連線到特定裝置並列舉所有Services和Characterstics。
sudo bleah -b "aa:bb:cc:dd:ee:ff" -e
aa:bb:cc:dd:ee:ff 為裝置地址
-b 按裝置地址過濾
-e 連線到裝置並執行列舉
第4步:將資料寫入到一個特定characteristics執行。
sudo bleah -b "aa:bb:cc:dd:ee:ff" -u "0000ffe9-0000-1000-8000-00805f9b34fb" -d "data"
Bleah是一款非常強大的用於對BLE裝置進行攻擊的工具,它會自動為我們執行許多操作,這為我們免去了重複執行繁雜操作的過程。
以上是我所為大家介紹的一些,用於對BLE裝置進行攻擊的工具和技術。希望通過本文的學習,能讓大家對BLE及其相關攻擊技術有更進一步的瞭解。
*參考來源: attify ,FB小編secist編譯,轉載請註明來自FreeBuf.COM