作者:Light & Yimi Hu @ PwnMonkeyLabs
原文鏈接:https://mp.weixin.qq.com/s/ezVtYoMXzwt7sIUUOMiWwA
背景
在2019年的某個月份,筆者的朋友給筆者送來了一個手環,讓筆者搞一搞。詳細詢問之后,筆者理清了具體情況:這個手環會收集佩戴者的步數并上報給公司,公司認為步數不夠的員工顯然是沒有業績的。好一個奇怪判斷依據。
這個BLE智能手環就是本篇中的研究目標,由于當時的原版手環并不方便透露給大家,而且早已還給了朋友,所以我們選用了另一款手環。該手環是我們研究原版手環之后,根據其功能,專門訂制開發的一款手環,可以實現相同的效果,非常合適在這里進行展示。如下圖所示:

上圖即為我們定制的BLE智能手環(沒錯,我們也是DC0086的成員)。在本篇的結尾部分,我們會給一個小小的題目,感興趣的讀者可以嘗試解答并發到我們的郵箱中,我們會挑選3個愿意動手的讀者,送出上圖中的BLE智能手環。不要太在意手環上面的時間,因為長時間放置在貨架中,充電并開機之后,發現時間戳歸零了。
理論分析
拿到手環之時,我們以為是手環可以連接WiFi,通過WiFi實時上傳步數等信息,也可能是通過4G/3G上傳數據。但是我們并沒有發現任何關于WiFi或者4G相關的設置選項,反而有很多關于BLE通信的設置,所以我們判斷這個智能手環應該是靠BLE進行數據通信。
既然已經確定了手環的通信方式,那么下一步就是確定每個佩戴者的步數是如何上報給服務器的。這里,我們做了兩種假設:1. 每個手環不停地廣播自身的數據信息,某個設備只要掃描一下附近的廣播數據就可以獲得所有附近佩戴者的步數;2.某個設備會以輪詢的方式和每個BLE智能手環建立連接,收集相關信息之后,斷開連接。
上文所述的某個收集信息的設備,與我們所了解的路由器有些類似。我們嘗試著以“藍牙路由器”為關鍵詞進行搜索,發現確實有一些類似的產品。原本我們打算買一個藍牙路由器回來研究,但仔細思考之后,其實不用買設備回來也能驗證我們上文中提到的兩個假設。如果是第一種上傳方法,我們直接抓一下手環的廣播包就可以了;如果是第二種上傳方法,用nRF connect連接手環,觀察所有的characteristic,看看是否有可疑數據即可完成分析。
理論驗證
在本專題的第四篇中,我們提到了一個用于嗅探BLE通信的小設備,在本篇中我們將繼續使用這個BLE dongle進行分析。根據上一章的分析結論,我們先考察一下“假設一”是否正確。
首先,我們在SmartRF Packet Sniffer工具中,以通信包的類型為判斷依據設置過濾,然后開始抓包10秒鐘,如下圖:

記錄下這次抓包中出現的藍牙MAC地址,如圖中的右側紅框部分。
然后,我們拿著手環和電腦,換一個其他較遠的位置,重新抓包。對比兩次不同位置的抓包結果,即可發現某個設備的MAC地址在兩次抓包中都有出現,那么可以判斷該MAC地址即為BLE智能手環的MAC地址。
最后,我們以該MAC地址為依據進行過濾,進行第三次抓包,其結果如下圖所示:

上圖中的右側紅框部分即為廣播的數據。此時,手環中顯示的實際步數如下圖所示:

結合兩圖的情況,可以判斷出廣播的第9字節應該就是步數,一邊抓包,一邊走路,即可發現該字節在同步變化。
除了Dongle監聽之外,我們在nRF connect中也可以看到該手環的廣播數據,某次nRF Connect掃描的結果如下圖所示,圖中我們可以看到Service UUID列表里有0x86DC,這并不是手環真實的Service,只是我們在定制手環時留下的DC0086的標志。

偽造廣播數據
現在我們知道了手環如何上報自己統計的步數,接下來我們要嘗試發送偽造的廣播數據。
在本專題之前的篇章中,曾介紹過nRF connect可以發送BLE通信的廣播包。但受限于Android系統本身,在nRF connect發送的BLE廣播包中,可以設置的各種廣播內容并不多,尤其是不能設置廣播時使用的MAC地址。這里我們需要一個自由度更高的設備,用于定制我們想要發出的廣播內容,并修改發送廣播時使用的MAC地址。
截至目前,我們只是使用了USB dongle用作BLE通信的嗅探設備,其實這個USB dongle也是可以刷寫固件的。在進行開發之前,先要確定USB dongle使用的芯片,并選擇相應的開發工具。在本專題第四篇中,我們介紹過USB dongle的核心是CC2540芯片,該芯片的工作原理圖如下:

上圖中可以看到CC2540芯片選用了8051系列的CPU內核,所以我們選用了IAR For 8051作為IDE,由于我們不是專業的嵌入式開發工程師,相關知識就不多做介紹了。
在CC2540芯片開發包中,可以找到包含各種樣例的工程文件夾,如下圖:

其中,就有一個滿足我們需求的藍牙廣播樣例程序。打開此工程,根據第3節的分析結果調整代碼,并編譯工程,如下圖,紅框中的內容就是我們需要廣播的數據。

待編譯結束之后,我們需要將其刷寫覆蓋原本USB dongle的固件。在刷寫時,需要用cc debugger連接USB dongle和計算機,如下圖:

接下來使用SmartRF Flash Programmer刷寫固件(該軟件與上文中的抓包軟件是同一系列的),并在刷寫時設置MAC地址,如下圖所示:

注意Location選擇Secondary,如上圖中紅框位置。芯片在生產時設置的MAC地址是保存在Primary中,我們無法更改此MAC地址。程序開發者設置的MAC地址保存在Secondary中,當存在Secondary Address時,Dongle優先使用Secondary Address。固件刷寫完成之后,會按照廣播我們在程序中設置的步數。
最后,還有一個小說明:原本的USB dongle固件在Packet Sniffer \bin \general \firmware文件夾中,所以不用擔心固件被刷壞而變磚的情況。
小結
本篇中,我們對一款BLE智能手環進行了分析,研究了手環如何實時上傳佩戴者步數,還修改了CC2540的樣例工程,實現了我們需要的廣播內容,由此對藍牙廣播數據有了更深入的認識。
在這里我們留下一個小問題:寫一個掃描并收集附近藍牙廣播的安卓小應用,展示MAC地址和廣播內容。
期待著各位讀者把自己的應用發送到我們的郵箱:pwn@pwnmonkey.org
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1531/
暫無評論