0x00 前言


如果你打開這篇文章時期望看到一些新的東西,那么很抱歉這篇文章不是你在找的那篇文章。因為嚴格的來說這只是一篇整理文。里面沒有任何我的發現,也沒有我的實際案例。因為我手頭上暫時還沒有一個有趣的藍牙低功耗設備。整篇文章的基礎都建立在mike ryan這幾年公布的演講內容之上。

0x01 BLE


BLE是什么?BLE全稱bluetooth low energy中文又稱藍牙低功耗。最早被人們所知道是在2010年的時候出現在了bluetooth4的spec當中。由于它比傳統的藍牙更能控制功耗和成本,所以在公布之后開始被廣泛地應用了起來。

比如:運動手表,藍牙智能鼠標,一些超昂貴的智能滑板又或者是一些醫療器材上。bluetooth smart的字樣幾乎隨處可見。由于用戶喜歡低功耗,廠家喜歡低成本它便成為了很受歡迎的一樣東西。

BLE和傳統的藍牙有著許多不同之處。它們使用不同的modulation參數,使用不同的頻道(但仍然是2.4GHz),使用不同的頻率跳變,使用不同的包格式,即使是數據白化方面也有著諸多不同。當然了,它們也存在一些共同之處。它們還是會使用傳統的主控設備-從屬設備模式。雖然它的ph層 link layer 層和傳統的藍牙不相同但l2cap層att層還是相同的。

0x02 環境搭建


因為它是無線通訊,所以這很容易讓我們聯想到我們可以實施的一些攻擊手段。如果可能的話,我們想去嗅探,想去進行包注入,在有必要的時候進行jamming來完成我們余下的攻擊。聽上去好像沒有那么難,也沒有那么新鮮。但實際上藍牙嗅探實現起來卻并沒有想象的那么簡單。對于wifi我們可以購買一張支持監聽模式的網卡。但對于藍牙根本就存在這么歡快的模式。這意味著我們需要一個這樣的設備。兩個選擇,造一個或買一個。幸運的是已經有人做出來了,雖然在功能上還有許多問題(多在于控制成本,我覺得mike應該不會遇到技術上的困難。。),但對于ble嗅探來說還是可以勝任的。so 它就是ubertooth one。

對于ubertooth one的環境搭建,我認為已經有了一個很友好的文章。所以,如果你在看完這篇文章后想買一個或者買了一個不知道怎么去配置你可以參考的下面這個鏈接中的文章。

www.security-sleuth.com/sleuth-blog/2015/9/6/now-i-wanna-sniff-some-bluetooth-sniffing-and-cracking-bluetooth-with-the-ubertoothone

如果上面的鏈接被一股神秘的力量攔截了,你可以直接參照下面的內容。

首先,你需要擁有一個ubertooth one。從某寶入手又或者是從烏云集市購入。為了方便測試還需準備一個buletooth dongle。你的操作系統可以是win,linux或者是mac。本文將以kali linux為例進行安裝步驟的講述。

先安裝這些

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掉,因為版本太舊)

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掉系統自帶的)

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= 當中。

安裝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

最后千萬不要忘記更新你的firmware

跳到剛才解壓過的 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):

按下回車。完成firmware的更新。如果失敗了或出現了莫名其妙的usb錯誤。不要慌張。試試

ubertooth-util -v

如果出現

Firmware revision: 2014-02-R1
$ ubertooth-util -V
ubertooth 2014-02-R1 ([email protected]) Wed Jan 29 23:10:46 GMT 2014

就意味著應該沒有什么太大的問題。折騰到這里你的環境搭建問題就差不多都解決了。

0x03 嗅探的基礎理論概念


讓我們繼續回到技術之上。我們想要的應該不是坐享其成。所以讓我們試著了解一下ble,先看看ble棧長什么模樣(如圖1 所示)。

圖1 BLE棧

ble棧應該和你看過的ip包很像。最上面綠色的部分是應用層,主要是gatt和att我們可以把它看作是同一層。sm是安全管理層,負責管理安全。最下面link layer層和phy層基本上就是一些rf的處理。因為這次的內容主要是集中在sm,link layer和phy層上,所以對于應用層不會有相關的敘述和解釋。讓我們試著從下往上看起。

phy layer使用gfsk進行modulation如果你是rf hacking的愛好者,你應該對這個東西不陌生。和傳統的藍牙不同在ble的世界里只有40個頻道,也就是傳統藍牙的一半。其中有37個頻道用于數據傳輸,不被用到的頻道都會被gap所替代。然后就是hopping 也就是所謂的頻率跳變。和wifi或zigbee等不同。藍牙喜歡打一槍換一個地方。每一個頻道上都只會發生一次數據傳輸。一個request和一個response。在完成之后根據hope increment會跳到下一個頻道。

幸運的是ubertooth one內置的 cc2400可以幫助我們完成這些操作。我們不用去編寫什么程序,我們不用去造一個輪子,我們只需要去配置一下相關的設定。設置完畢后我們就可以借助ubertooth one來獲取我們想要的bits。

讓我們繼續往上看,來看看 link layer。通過查閱ble的spec我們可以獲知link layer的包格式看上去是這樣:

看上去link layer的格式并不復雜。它包含前導碼,訪問地址,PDU和CRC校驗碼。不過似乎有點問題。因為我們前面所提到的都是bits我們需要的是bits,而這里說的都是octets。如何獲取我們想要的bits?首先通過ubertooth one我們可以截獲海量的數據。所以我們有很多數據。但是我們需要區分開什么是什么。怎么做到呢?我們需要的就是等待我們的已知量access address的出現。根據spec加上小學數學功底,推出前后的數據都是什么。這樣一來我們就擁有了整個link later的bits數據。 擁有了這兩層之后我們就可以將RF轉換成數據包了。

So ubertooth負責這兩層我們都搞定了,其它層都可以交給pc去處理,所以問題解決了么?

還沒有。因為btle喜歡打一槍換一個地方。所以我們還需要考慮如何去跟蹤connection(配對的時候會在37,38,39個三個頻道隨機跳,起點位置未知。由于ubertooth one 一次只能監聽一個頻道,所以實戰時可能需要多測試幾次才能抓到我們需要的6個包來破解tk)。跟蹤connection需要知道4樣東西。

  • Access address
  • crcinit
  • time slot length
  • hop increment

但如何才能獲取這些數據呢?對于aa我們可以坐等數據的流過,重點檢查空數據包,因為我們知道空數據包的結構是什么樣的,所以我們只需要在截獲的數據包中往會跳32bit來獲取我們的access address。使用lfsr來還原crcinit.坐等在某個頻道等待兩個連續包的出現來計算time slot length = Δt / 37,最后再通過我們的高中數學功底來計算出hop increment.(原作者怕觀眾無聊就一筆帶過了太過于數學話的部分)。

anyway,經過這一系列的折騰我們現在具備了跟蹤connection的條件。這也就意味著我們可以嗅探ble了。

0x04 BLE通訊的加密


but wait,難道ble就沒有加密么?答案是有,它使用了著名的aes-ccm(不過還是有很多設備的通訊是不加密的 。我不是藍牙開發者,但這應該和采用的security model有關吧。看了下spec里頭說model0和model1沒有加密)也許這讓你想起了wpa-aes因為它們是一樣的加密方式。所以寫了這么多,這是在逗我么?答案是,no。因為俏皮的ble使用了自定義的密鑰交換協議。它的自定義密鑰交換協議又怎么了?讓我們先看看它是怎么匹配的,又或者是它有幾種匹配模式。

  • Just works
  • 6 digit pin
  • OOB

其中的just works 用起來也就是just works。怎么說?因為它永遠用0作為tk來進行配對。6 digit pin。名字和內容差不多,使用0-999999之間的數字來當tk來使用。對于爆破來說,實在是太脆弱。實際測試當中爆破6 digit pin都用不到1s。OOB全稱out off band,會使用很麻煩的方式進行匹配,暫時沒有什么設備在用這種模式。擁有了tk能做什么呢?讓我們看看一個例子。

小明新買了個酷炫狂拽的ble設備。開始和自己的其它設備進行配對。黑客配備好自己的ubertooth觀察整個配對過程。如果配對使用了just works 或 6 digit pin 黑客通過暴力破解秒獲tk。根據tk和配對數據包還原出stk,根據stk和密鑰交換獲得ltk。

但是需要注意的是為了擁有tk,你起碼要在配對進行時抓到下面的6個包:

  • pairing request
  • pairing response
  • pairing confirm
  • pairing confirm
  • pairing random
  • pairing random

由于配對會在37,38,39三個頻道進行,外加ubertooth one一次只能監聽一個頻道,所以最幸運的情況是配對從ubertooth-btle 默認頻道37開始進行,隨后的部分由ubertooth幫你完成余下的connection跟蹤,來完成整個6個包的抓包。如果抓不到你就需要多試幾次。。(便宜貨嘛,將就點啦 )

湊夠了6個包后將你抓到的包交給神器crackle ,crackle將會為你破解tk和我們的日思夜想的ltk。擁有了ltk我們就可以解密我們嗅探的所有的包!那有了ltk我們是不是就可以直接取代原來的從屬設備了呢?還做不到。因為connection還包含一個隨機量。。這就沒得玩了?也不是,我們需要做的就是jam掉已經有的connection拿著我們的ltk和主控設備去做一些羞羞的事情。

0x05 測試


測試設備是否可以在當前環境下正常運作,可以先試試wifi

[email protected]:~/Desktop# ubertooth-specan-ui

手頭上沒有bluetooth smart設備?那咱就模擬一個。分別在ios設備1和ios設備2上從appstore下載并安裝lightblue。設備A模擬主控設備,設備B模擬從屬設備

在這里我們裝扮成了一個心率計算設備。試圖進行匹配。在這個時候攻擊者需要提前準備。你可以選擇使用pipe來實現實施監聽。

[email protected]:~# mkfifo /tmp/pipe

打開wireshark

Capture -> Options -> Manage Interfaces -> New

輸入 /tmp/pipe

點擊start開始監聽。

然后千萬別忘了把ubertooth抓到的內容輸出到pipe

[email protected]:~# ubertooth-btle -f -c /tmp/pipe

最最后,不要忘了這一步。不然你抓到的包根本看不成

Edit → Preferences → Protocols → DLT_USER → Edit → New

在payload protocol中輸入btle

ok → ok

如果你想把抓好的包帶回家慢慢整,你可以簡單的包抓取的內容輸出到某個目錄下

ubertooth-util -r ; ubertooth-btle -f -c /output.pcap

抓到包之后我們最關心的問題是我們有沒有抓到的足夠的包來破解tk。所以在wireshark中你可以在filter處加上btsmp,確保抓到了我們需要的6個包。

確定抓到了包之后我們去下載神器crackle。

Git clone https://github.com/mikeryan/crackle.git
cd crackle
make
make install

安裝完成后,開始借助cracle和我們抓到的包依次破解tk和ltk

從上圖中我們可以看到我們不但破解了tk,還利用利用tk和其它一些數據成功的還原出了ltk。

接下來我們再來試試利用獲取的ltk來破解其他的加密包。假設我們在配對過程中已經拿到了ltk=7f62c053f104a5bbe68b1d896a2ed49c

crackle -l 7f62c053f104a5bbe68b1d896a2ed49c -i test44.pcap -o test66.pcap

可以看到我們成功地破解了7個包。

0x06 解決方案


使用OOB

[email protected]:~/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的設備的出現(通過ECDH解決)

0x07 總結


其實第一次發現通過這個設備加上一些軟件可以破解btle嗅探到的包時,我是很興奮的。因為我之前一直都沒有見過這樣的文章。不過后來和小伙伴們聊了一下,才意識到這一切的前提條件是你得在第一次匹配的時候抓到所有的關鍵包(如果你只有1個ubertooth意味著你只有1/3的機會)。不過遺憾的是很多設備在完成第一次的匹配之后就會記憶彼此。下次通訊時不會再重新進行匹配。所以為了讓這種攻擊更現實一些,也許研究如何unpairing會是一個方向。最后感謝索馬里的海賊贊助的Ubertooth One。

參考:

  • 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

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞