標籤:
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的環境搭建,我認為已經有了一個很友好的文章。所以,如果你在看完這篇文章後想買一個或者買了一個不知道怎麼去配置你可以參考這篇文章。
如果上面的文章被一股神秘的力量攔截了,你可以直接參照下面的內容。
首先,你需要擁有一個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.gztar xf libbtbb-2015-09-R2.tar.gzcd libbtbb-2015-09-R2mkdir buildcd buildcmake ..makesudo 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.xztar xf ubertooth-2015-09-R2.tar.xzcd ubertooth-2015-09-R2/hostmkdir buildcd buildcmake ..makesudo make installsudo 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-devwget https://kismetwireless.net/code/kismet-2013-03-R1b.tar.xztar xf kismet-2013-03-R1b.tar.xzcd kismet-2013-03-R1bln -s ../ubertooth-2015-09-R2/host/kismet/plugin-ubertooth ../configuremake && make pluginssudo make suidinstallsudo make plugins-install
將"pcapbtbb"加入到kismet.conf的logtypes= 當中。
安裝wireshark
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmakecd libbtbb-2015-09-R2/wireshark/plugins/btbbmkdir buildcd buildcmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..makesudo make install
安裝BR/EDR外掛程式
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmakecd libbtbb-2015-09-R2/wireshark/plugins/btbredrmkdir buildcd buildcmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..makesudo make install
最後千萬不要忘記更新你的firmware
跳到剛才解壓過的 ubertooth-2015-09-R2目錄。
Cd ubertooth-one-firmware-bin$ ubertooth-dfu -d bluetooth_rxtx.dfu -rChecking firmware signatureNo 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 -Vubertooth 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 addresscrcinittime slot lengthhop 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 works6 digit pinOOB
其中的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 requestpairing responsepairing confirmpairing confirmpairing randompairing 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.gitcd cracklemakemake install
安裝完成後,開始藉助cracle和我們抓到的包依次破解tk和ltk
從中我們可以看到我們不但破解了tk,還利用利用tk和其它一些資料成功的還原出了ltk。
接下來我們再來試試利用擷取的ltk來破解其他的加密包。假設我們在配對過程中已經拿到了
ltk=7f62c053f104a5bbe68b1d896a2ed49ccrackle -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 oneWarning: found multiple LL_ENC_REQ, only using latest oneWarning: found multiple connects, only using the latest oneWarning: found multiple pairing requests, only using the latest oneWarning: found multiple connects, only using the latest oneWarning: found multiple pairing requests, only using the latest oneWarning: already saw two random values, skippingWarning: found multiple LL_ENC_REQ, only using latest oneTK not found, the connection is probably using OOB pairingSorry d00d :(
等待支援bluetooth4.2的裝置的出現(通過ECDH解決)
0x07 總結
其實第一次發現通過這個裝置加上一些軟體可以破解btle嗅探到的包時,我是很興奮的。因為我之前一直都沒有見過這樣的文章。不過後來和小夥伴們聊了一下,才意識到這一切的前提條件是你得在第一次匹配的時候抓到所有的關鍵包(如果你只有1個ubertooth意味著你只有1/3的機會)。不過遺憾的是很多裝置在完成第一次的匹配之後就會記憶彼此。下次通訊時不會再重新進行匹配。所以為了讓這種攻擊更現實一些,也許研究如何unpairing會是一個方向。最後感謝索馬里的海賊贊助的Ubertooth One。
參考:
- https://lacklustre.net/
- http://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
Bluetooth Low Energy 嗅探