使用btproxy對藍牙設備進行安全分析
最近我比較熱衷調(diào)查新技術(shù)的安全性能,尤其是“IoT”領(lǐng)域的新設備,比如使用藍牙進行連接的設備。熟悉藍牙連接方式之后,我就想用明文的方式來看看它的通信數(shù)據(jù),有可能的話最好還能修改下其中的數(shù)據(jù)。類似于現(xiàn)有的網(wǎng)絡流量工具,這里并沒有方便快捷的辦法實現(xiàn)它。
我寫的這個工具需要1個或者2個藍牙適配器作為其他兩個設備之間連接的代理,代理連接可以查探明文數(shù)據(jù)流量,以及實時修改的能力。
安裝
我已經(jīng)將該項目發(fā)布到github上,目前該工具僅僅只能在Linux 或者 OS X下進行運行,且其依賴于BlueZ。
安裝依賴包:
sudo apt-get install bluez bluez-utils bluez-tools libbluetooth-dev python-dev
安裝btproxy:
git clone https://github.com/conorpp/btproxy cd btproxy sudo python setup.py install
在Pebble Watch上運行
為了運行它,你需要兩個藍牙設備進行作為代理(藍牙電量低,不會運行)
為此,我選擇使用我的手機(Nexus 6)以及Pebble Watch。
接著我打開所有設備的可發(fā)現(xiàn)藍牙設備。我的Nexus 6跑的是Android L,這需要到設置中去打開藍牙選項。同樣的Pebble watch,也需要到設置菜單中去打開藍牙。設置完成之后,我們就可以運行代理了。
我使用hcitool來掃描設備,因此我獲取到設備的MAC地址
$ hcitool scan
Scanning ... 77:88:99:AA:BB:CC Pebble 9FAA 11:22:33:44:55:66 conorpp's Nexus 6
接著,運行藍牙代理:
sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC
注意,我先輸入的是手機的MAC地址。這一點十分重要,因為手機是作為連接中的主設備,手表作為其從屬設備。主/從設備都會使用藍牙協(xié)議,直到主設備發(fā)出請求,從屬設備通常保持待機狀態(tài)。并且主設備可以連接到多臺設備,而從屬設備僅僅智能連接一臺設備。
M=Master(主設備) S=Slave(從屬設備)
現(xiàn)在我們就來看看代理的輸出信息
$ sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC
Running proxy on master 11:22:33:44:55:66 and slave 77:88:99:AA:BB:CC Using shared adapter Slave adapter: hci0 Master adapter: hci0 Looking up info on slave (77:88:99:AA:BB:CC) Looking up info on master (11:22:33:44:55:66) Spoofing master name as Pebble 9FAA_bt proxy Running inquiry scan paired Spoofing master name as Pebble 9FAA_btproxy Proxy listening for connections for "Serial Port Server Port 1" Proxy listening for connections for "Audio/Video Remote Control" Attempting connections with 2 services on slave Connected to service "Audio/Video Remote Control" Connected to service "Serial Port Server Port 1" Now you're free to connect to "Pebble 9FAA_btproxy" from master device.
代理會搜尋設備名稱和類,所以其可以將設備名稱和類復制到使用的藍牙適配器中。在本例中,因為只有一個藍牙適配器,所以只會復制從屬設備的屬性。
途中,它會向我的Pebble watch發(fā)出一個藍牙適配請求。接受請求之后,代理會打開每個手表設備的藍牙接口,然后連接到手機。代理連接到手表中的藍牙之后,我將主設備(Nexus 6)連接到代理設備(Pebble 9FAA_btproxy)
btproxy輸出
這里有使用到兩個協(xié)議:SPP 和 Pebble,發(fā)送一個明文通知。
我給自己發(fā)送一條明文通知之后獲取到的日志記錄:
<< b'\x00F\x0b\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K_\xecU\x01\x02\x03\x01\x0e\x00(123) 456-6789\x03\x0c\x00Hello Pebble\xff\x05\x00\xfe\x05\x00\x01\x03\x01\x01\x05\x00Reply'
你可以看到電話號碼,以及通知內(nèi)容,"Hello Pebble".
我發(fā)送一條谷歌環(huán)聊信息后截獲的包:
<< b'\x00b\x0b\xc2\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xf2_\xecU\x01\x02\x02\x01\r\x00Conor Patrick\x03\x1a\x00Sent a message on Hangouts\x01\x02\x01\x01\r\x00Open on phone\x02\x04\x01\x01\x07\x00Dismiss'
你可以看到其發(fā)送了兩個選項:"Open on phone" 以及 "Dismiss".
使用Python內(nèi)聯(lián)腳本可以實時修改包中的任何內(nèi)容。
例如:
# replace.py # This replaces the options in a Pebble notification packet def master_cb(req): req = req.replace(b'Open on phone', b'Hi welcome to') req = req.replace(b'Dismiss', b'Btproxy') print( '<< ', repr(req)) return req def slave_cb(res): print('>> ', repr(res)) return res
當主設備(Nexus 6)向從屬設備(Pebble Watch)發(fā)送一個數(shù)據(jù)包時,會調(diào)用master_cb,反之則調(diào)用slave_cb.
重啟btproxy:
sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC -s replace.py
然后發(fā)送一個通知:
結(jié)論
使用該工具的目的是為了分析,同時也可用于如今越來越流行的物聯(lián)網(wǎng)設備安全檢測。到目前為止,我使用其更新固件、證書/憑證以及改變標識符,除非有方法實現(xiàn)設備強制藍牙進行適配,并連接上代理,否則它不適合應用在實際的攻擊中?;蛟S在未來會有大牛攻破這個難題,但是現(xiàn)在這種攻擊還僅僅屬于理想狀態(tài)的測試。