一枪孩、涉及的基本原理
藍牙信道
有兩種通信信道:廣播信道和數(shù)據(jù)信道(advertising channels and data channels),對應(yīng)的通道如下圖,其中廣播信道只使用37傀缩,38,39這三個通道。數(shù)據(jù)信道共包含37個信道餐茵。
廣播通道作用
設(shè)備發(fā)現(xiàn)
連接建立
傳輸廣播
數(shù)據(jù)通道作用
自適應(yīng)跳頻以及設(shè)備間數(shù)據(jù)傳輸
自適應(yīng)跳頻
在數(shù)據(jù)傳輸時炬转,設(shè)備間會使用跳頻算法在數(shù)據(jù)通道間跳頻辆苔。常見的CC2540不具備捕獲數(shù)據(jù)通道中的數(shù)據(jù)的能力,需使用昂貴的專業(yè)藍牙設(shè)備(數(shù)萬元)或Ubertooth進行捕獲(幾百元返吻,但是不穩(wěn)定)姑子。
藍牙地址(bdaddr)
藍牙地址也有多種類型,有設(shè)備使用固定的藍牙地址测僵,也有設(shè)備使用隨機的藍牙地址街佑。類型如下,具體的定義參考末尾的參考連接
BLE安全模式
藍牙有兩種安全模式和4個安全等級,Level 1 ~ Level 4對應(yīng)的安全強度由若到強捍靠,分別為:
- Security Level 1 supports communication without security at all, and applies to any Bluetooth communication, but think of it as applying to unpaired communications.
- Security Level 2 supports AES-CMAC encryption (aka AES-128 via RFC 4493, which is FIPS-compliant) during communications when the devices are unpaired.
- Security Level 3 supports encryption and requires pairing.
- Security Level 4 supports all the bells and whistles, and instead of AES-CMAC for encryption, ECDHE (aka Elliptic Curve Diffie-Hellman aka P-256, which is also FIPS-compliant) is used instead.
二沐旨、準備抓包所需的軟件和硬件
所需硬件
Ubertooth 一個 (配合ubertooth-btle使用)
CSR模組 一個 (配合bluetoothctl使用,也可使用樹莓派等設(shè)備替代)
Linux PC 一臺
ESP32模組 一個 (作為ble server使用)
ESP32模組的長相
所需軟件
ubertooth-btle (抓取數(shù)據(jù)信道數(shù)據(jù))
bluetoothctl (監(jiān)聽廣播數(shù)據(jù))
esp-idf (燒錄ble server)
crackle (分析加密情況)
wireshark
LightBlue (手機APP)
三榨婆、動手做
燒錄BLE Server
首先從樂鑫GitHub獲取esp-idf工具鏈和demo磁携,具體的esp-idf下載和配置的方法可按官方教程操作。
當配置好esp-idf后良风,連接ESP32模組和PC谊迄。
燒錄不安全的demo:gatts_demo
該demo位于該路徑下
esp-idf/examples/bluetooth/bluedroid/ble/gatt_server
燒錄方法
cd ~/esp-idf/examples/bluetooth/bluedroid/ble/gatt_server
make menuconfig
make flash //燒錄時可能需按住ESP32模組上的boot鍵
掃描附近的BLE設(shè)備
將CSR模組插入Linux PC,也可直接使用樹莓派烟央。安裝并啟動bluetoothctl(可能需要sudo權(quán)限)统诺。執(zhí)行如下命令。
sudo bluetoothctl
[bluetooth]# scan on //啟動掃描疑俭,等待一會
[bluetooth]# scan off //關(guān)閉掃描
[bluetooth]# devices //查看附近的設(shè)備
找到ESP_GATTS_DEMO對應(yīng)的地址并記住粮呢。
開始捕獲數(shù)據(jù)包
將Ubertooth插入Linux PC,安裝ubertooth-btle并刷入最新的固件钞艇,操作流程參考如下鏈接:
https://github.com/greatscottgadgets/ubertooth/wiki/Build-Guide
https://github.com/greatscottgadgets/ubertooth/wiki/Firmware
準備完成后啄寡,輸入如下命令進行捕獲
touch /tmp/pipe
ubertooth-btle -t aa:bb:cc:dd:ee:ff -f -c /tmp/pipe //aa:bb:cc:dd:ee:ff為之前獲取到的ESP_GATTS_DEMO對應(yīng)的地址
啟動wireshark 并獲取/tmp/pipe中的數(shù)據(jù)
手機端使用LightBlue連接設(shè)備,由于藍牙跳頻哩照,有時Ubertooth會抓不到包挺物,或者卡住,可以反復(fù)在LightBlue中“返回-進入”來抓取ble通訊包葡秒。
查看明文數(shù)據(jù)
由于我們使用的是未加密的demo姻乓,可直接在wireshark中看到明文傳輸?shù)臄?shù)據(jù)嵌溢,如下圖。
可以在圖片下方看到deedbeef數(shù)據(jù)值蹋岩,該數(shù)據(jù)值由gatts_demo.c中如下代碼產(chǎn)生赖草。
case ESP_GATTS_READ_EVT: {
ESP_LOGI(GATTS_TAG, "GATT_READ_EVT, conn_id %d, trans_id %d, handle %d\n", param->read.conn_id, param->read.trans_id, param->read.handle);
esp_gatt_rsp_t rsp;
memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
rsp.attr_value.handle = param->read.handle;
rsp.attr_value.len = 4;
rsp.attr_value.value[0] = 0xde;
rsp.attr_value.value[1] = 0xed;
rsp.attr_value.value[2] = 0xbe;
rsp.attr_value.value[3] = 0xef;
esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
ESP_GATT_OK, &rsp);
break;
}
再來分析下安全的BLE連接
在esp-idf目錄下,找到如下demo剪个,按照之前燒錄不安全demo的方式燒錄該demo秧骑。
examples/bluetooth/bluedroid/ble/gatt_security_server
燒錄完成后,使用Ubertooth捕獲手機與ESP32模組間的通訊扣囊。捕獲到的數(shù)據(jù)片段如下乎折。
可以看到Random、DHKey侵歇、LL_ENC_REQ等信息骂澄,說明該連接使用到密鑰交換,接下來我們可以借助另一個工具判斷這兩個連接是否安全惕虑。
破解工具上場--crackle
工具下載地址
https://github.com/mikeryan/crackle
該工具可以用來破解BLE通訊中的TK坟冲,或者配合LTK對BLE通訊進行解密。
我們分別使用該工具讀取兩次通訊的PCAP文件溃蔫。
讀取不安全的BLE通訊
可以看到該通訊PCAP中不包含加密通訊健提。
讀取安全的BLE通訊
能看到crackle提示找到了加密的數(shù)據(jù)包,但是由于沒有LTK伟叛,無法解密數(shù)據(jù)包私痹。在讓我們回到demo的代碼中,那么可以看到在example_ble_sec_gatts_demo.c中有如下代碼片段统刮。
case ESP_GATTS_CONNECT_EVT:
ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_CONNECT_EVT");
/* start security connect with peer device when receive the connect event sent by the master */
esp_ble_set_encryption(param->connect.remote_bda, ESP_BLE_SEC_ENCRYPT_MITM);
break;
代碼片段中用到了ESP_BLE_SEC_ENCRYPT_MITM來指明連接的安全等級紊遵。除了該安全選項,還有另外三個侥蒙,分別是:
- ESP_BLE_SEC_NONE
- ESP_BLE_SEC_ENCRYPT
- ESP_BLE_SEC_ENCRYPT_NO_MITM
- ESP_BLE_SEC_ENCRYPT_MITM
四癞蚕、總結(jié)
- 藍牙提供了完善的安全機制和抗干擾機制
- 由于自適應(yīng)跳頻機制的存在,捕獲數(shù)據(jù)通道中的數(shù)據(jù)較為困難
- 不是所有的設(shè)備都會選擇安全的BLE藍牙配對和連接模式辉哥,可能存在數(shù)據(jù)明文傳輸?shù)那闆r
五、參考鏈接
https://microchipdeveloper.com/wireless:ble-link-layer-channels
https://www.rfwireless-world.com/Terminology/BLE-Advertising-channels-and-Data-channels-list.html
https://www.novelbits.io/bluetooth-address-privacy-ble/
https://duo.com/decipher/understanding-bluetooth-security