智能手環的漏洞挖掘

在一個悠閒的陽光午後,拿出一個未知品牌的藍色小藥……,哦,小手環。用力撕扯半張衛生紙,將擱置已久的手環表面擦拭。

既然是藍牙版的智能手環,那必不可少的要介紹一下通信協議啦。低功耗藍牙(BLE)是藍牙技術聯盟設計和銷售的一種魯棒性無線技術,旨在用於醫療保健、運動健身、信標、安防、家庭娛樂等領域的新興應用。相較經典藍牙,低功耗藍牙旨在保持低成本、短距離、可互操作。

  1. 生平介紹
  • 安卓的 BLE 標準在 2013 年 7 月發佈,一般搭配Android 4.3 及以上系統的手機都是支持藍牙 BLE 的。
  • IOS的 BLE 標準在 2013 年9月更新推出,一般搭配IOS 7.0及以上系統的手機都是開始支持藍牙 BLE 的。
  1. 協議內容

要使安卓設備連接上智能穿戴設備(如智能手錶),通過經典藍牙的socket連接一般是連接不上的(爲什麼說一般呢,因爲有些不良廠家和雜牌智能手環用的不是低功耗藍牙,這個可以使用經典藍牙連接上),必須要使用BLE的 GATT連接才能連接上。

GATT連接涉及到四個比較陌生的名詞:服務(service)、特徵值(Characteristic)、描述(discript)、UUID

  • service服務是包含了若干個數據包(特徵值)的集合,一個智能設備可能包含多個服務,使用之恩那個設備生產廠商提供的UUID碼來識別。比如之恩那個手環中有測心率的服務、步數的服務,心率和步數的數據包(特徵值)都包含在服務中,通過指定的UUID來辨別到底是心率的服務還是步數的服務。
  • characteristic特徵值包含在服務裏面,顧名思義就是一種數據值,特徵值包含一個或者多個描述。如心率是多少,今天走了多少步都可以放進特徵值裏面,服務中有多個特徵值,也是通過UUID來識別
  • discript描述一般是對特徵值的值進行描述,比如單位等等的描述,開發中一般用不到(我用不到)
  • UUID由藍牙設備廠商提供的UUIDUUID是在硬件編程裏已經確定了的,想要草所特定的服務、特徵值都需要通過UUID來找。

手機是通過app控制的藍牙手環,那麼由想而知,apk內肯定有控制藍牙手環命令的功能代碼,那麼這些藍牙的命令是如果構造通過藍牙發出去的?我們首先逆向藍牙手環的控制APP,找找藍牙命令構造的代碼片段。

  1. Apk逆向

apk逆向工具有很多,比較成熟有名氣的例如:JEB、APKTOOL、AFE、DEX2JAR、ENJARIFY、JD-GUI等等,安卓安全測試這篇文章就不在累述了,下次專門寫一個安卓安全的系列。迴歸正傳,本次通過JEB反編譯該APK,通過搜索我們確定了該APP中藍牙命令構造的類BleUtile:

通過對代碼進行分析,我們確定了APP與智能手環藍牙通信的命令構造方式:操作頭(126)+操作數(不同方法不同)+CRC(消息鑑別碼)。下圖爲手環震動命令(函數setRemindCmd)的構造方法:

下圖爲CRC(消息鑑別碼)在該APK中的構造方式:

雖然看起來很簡單的定位到了我們所需的功能實現代碼,但從開始到成功定位,代碼分析和查找的工作量確是最大的,在整個漏洞挖掘過程中所耗時間也是最多的。但慶幸的是,本次apk並未進行代碼加固,很容易就成功逆向出代碼,並且未做代碼混淆,方便了我們分析,而且省下很多時間,否則可能會耗費更多。

分析出藍牙命令的結構了,來點實際的驗證一下。

  1. 分析手環藍牙信息

分析手環藍牙信息首先得獲取手環的藍牙屬性,可以使用python腳本(利用python bluepy模塊)對智能手環進行掃描,

掃描得到手環藍牙信息:

如圖,該手環低功耗藍牙handle爲3和14的屬性存在WRITE方法,其中handle爲3的屬性同時具有讀和寫的屬性,讀出的值爲“Lem_S9P”,我們猜測此屬性用於讀或修改設備名稱,下面數據包分析中我們將重點關注handle爲14的屬性。

可採用藍牙模塊(CC2540)或手機藍牙數據包記錄功能抓取APP與智能手環藍牙通信數據包,本次採用的是手機藍牙日誌,通常智能手機可以點擊5下版本號打開開發者選項,勾選一下藍牙hci日誌,重啓手機後手機就會自動保存手機藍牙通信的所有數據包啦,每款手機生成的藍牙數據包名不一樣,可以去各家網站搜一下,將這個數據包上傳到電腦後用wireshark打開進行分析。

下面爲抓取到的藍牙通信數據包(主要關注handle爲14及0x000e的通信數據包,篇幅有限給出兩個示例):

與apk內的命令構造模塊進行對比,格式完全匹配。開始寫腳本嘗試發送一些我們構造的藍牙指令吧!

  1. 拿下手環

手環震動的命令是由長度爲5的字節數組構成,其中第四字節值可爲(1,2,3,4)中的一個(表示震動類型,如來電爲1)。

以來電爲例,構造低功耗藍牙命令:126=0x7e, 5=0x05, 8=0x08, 1=0x01, CRC=0x82。或者通過藍牙日誌發現的value值重放“7e05080182”,我們使用python腳本實現手環震動命令:

手環成功的不停震動~太邪惡了。

詳細測試過程、截圖請關注“信安攻防”公衆號:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章