蓝牙安全初探

传统蓝牙设备的攻击

蓝牙可能用来传输一些隐私的数据,有时候还需要在两个设备靠近时自动连接,因此引入了配对和绑定。

蓝牙配对模式

Numeric Comparison:配对双方都显示一个6位的数字,由用户来核对数字是否一致,一致即可配对。例如手机之间的配对。
Just Works:用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程。例如连接蓝牙耳机。
Passkey Entry:要求配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对。例如连接蓝牙键盘。
Out of Band:两设备的通过别的途径交换配对信息,例如NFC等。例如一些NFC蓝牙音箱。

在老的蓝牙2.0协议中,配对过程需要输入一个PIN码,长度可以从4到16个数字。(很多设备默认0000或者1234)

在配对的过程中通过PIN码来生成Linkkey。两个配对后的设备共享一个Linkkey,这个行为叫绑定。绑定之后下次两个设备接近后,用Linkkey进行认证,认证通过后生成EncryptionKey进行session的加密。认证的过程采用challenge-response的模式,以claimant and the verifier的方式来验证linkkey。认证完一方之后交换身份,再认证另一方。

攻击方式

由于设备绑定后通信是内容默认经过加密的,因此很难嗅探到敏感的信息。常用的攻击方式有如下几种。

嗅探配对过程获取PIN

配对的过程会用PIN生成随机数进行互相认证,而PIN只有很小的范围,可以通过爆破PIN来获取真正的PIN,以及通过中间计算的值得到Linkkey以及EncryptionKey,用于以后的配对和通信解密。
破解PIN用到的工具叫crackle

重放攻击

蓝牙没有时间戳,可以重放流量。对于蓝牙键盘通过频率可以大致猜测流量对应什么按键。当然也可以实施其他攻击。

在获取Linkkey前提下模拟设备

如果能获取到Linkkey,则可以更改蓝牙mac地址模拟成一方的设备,与另一方连接。如果模拟成设备与手机连接,能获取到通话记录,说不定还能获取到整个通讯录。

linkkey位置

注意在有的平台上linkkey显示是反的

安卓

/data/misc/bluetoothd/XX:XX:XX:XX:XX:XX/linkkeys
/date/misc/bluedroid/bt_config.xml

windows

psexec -s -i regedit.exe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys

linux

/var/lib/Bluetooth/[BD_ADDR]/linkkeys
其他文件可以参考http://manpages.ubuntu.com/manpages/precise/man8/bluetoothd.8.html

osx

sudo defaults read /private/var/root/Library/Preferences/blued.plist

其他攻击

其他攻击如蓝牙中间人、mac地址爆破、PIN爆破等暂时不提及。
蓝牙中间人可参考https://github.com/securing/gattackerhttps://github.com/DigitalSecurity/btlejuice

BLE设备GATT协议的攻击

GATT协议可以在蓝牙设备不完成配对的情况下进行访问,因此,通信流量明文传输,如果应用层没有加密或者校验,则可以被轻易地嗅探和伪造数据。

GATT中一般有多个Service,一个Service中有多个Characteristic。Service和Characteristic都有一个唯一的UUID。一般一个Service对应一个功能,蓝牙标准里预先定义了一些UUID用作固定的用途,比如电量、心率等。Characteristic相当于Service的一个项,有read、write、indicate、notify几种属性,可以对这项的值进行读写和通知的功能。厂商也可能实现一些私有的Service,用私有的协议进行通信。如果这些通信协议没有加密或者校验,则很有可能受到攻击。

蓝牙嗅探我用的是NRF51822,不过只支持windows平台,只支持BLE。该方案被动嗅探数据包,为了防止丢包,需要在不busy的USB bus上,并避免在虚拟机里使用。

当然,攻击蓝牙设备是一方面,还可以伪造成蓝牙设备来对客户端做一些欺骗。比如可以用一个usb蓝牙接收器伪装成一个蓝牙运动手环,来欺骗微信运动。

参考文献

https://linuxtoy.org/archives/ubuntu-bluetooth-guide.html
http://www.race604.com/gatt-profile-intro/
https://www.bluetooth.com/specifications/generic-attributes-overview
http://www.tuicool.com/articles/ayaYfmU
https://github.com/adafruit/Adafruit_BLESniffer_Python

分享到 评论