龙空技术网

Bluetooth初探

安鸾网络安全 29

前言:

如今兄弟们对“pythonphy”可能比较珍视,兄弟们都想要分析一些“pythonphy”的相关资讯。那么小编在网络上搜集了一些有关“pythonphy””的相关文章,希望各位老铁们能喜欢,我们一起来学习一下吧!

“蓝牙”(Bluetooth)原是一位在10世纪统一丹麦的国王,他将当时的瑞典、芬兰与丹麦统一起来。用他的名字来命名这种新的技术标准,含有将四分五裂的局面统一起来的意思。蓝牙技术使用高速跳频(Frequency Hopping)和时分多址(TIme DivesionMuli—access)等先进技术,在近距离内最廉价地将几台数字化设备(各种移动设备、固定通信设备、计算机及其终端设备、各种数字数据系统,如数字照相机、数字摄像机等,甚至各种家用电器、自动化设备)呈网状链接起来。

蓝牙技术在发展至今,衍生出了多个版本,如老的经典蓝牙版本和4.0后的低功耗版本,下面主要讨论蓝牙低功耗也就是BLE。

蓝牙工作过程配对:配对是指两个蓝牙设备首次通讯时,相互确认的过程,在通过配对后的数据传输不需要再重复进行确认。pin:个人识别码,蓝牙使用的pin码长度为1-8个十进制位数。DB_ADDR:蓝牙设备地址。每个蓝牙设备被分配了类似mac地址的唯一的一个48位数的设备地址。用于通讯地址确认.两个蓝牙设备在通讯开始时通过询问的方式获取蓝牙设备地址。

所以蓝牙的工作过程为:

启动 --->> 扫描设备 --->> 设备配对 --->> 数据传输
配对过程:1 ping码配对

在老的蓝牙2.0协议,配对过程需要输入一个pin码。长度为4到16个数字,在配对过程中通过pin码来生成link key(链路密钥)。两个配对后的设备共享一个link key,这个行为叫绑定。绑定之后下次两个设备接近后,用link key进行认证,认证通过后生成加密密钥进行会话通信的加密。认证的过程采用challenge-response(咨询-响应)的模式,以claimant and the verifie的方式来验证linkkey。认证完一方之后交换身份,再认证另一方,若认证失败,蓝牙设备会间隔一段时间后重试,间隔时间会成指数级增长,以避免攻击。

2 密钥交换配对

在蓝牙核心规范中,有三个主要的架构层:控制器,主机和应用程序,在主机层中,有一个名为安全管理器(GM)的模块定了一了配对和密钥分发的方法和协议和相应的安全工具箱,以及定义配对命令帧格式,帧结构和超时限制的安全管理器协议(smp)。

在建立密钥后,使用这些密钥去加密连接,然后进行密钥共享,这些密钥将用于重新连接后的加密链接,验证签名数据后执行随机地址解析,通常分为以下三个阶段:

第一阶段:配对功能交换第二阶段(BLE传统配对):生成短期密钥(STK) (注:蓝牙4.0和4.1规范定义)第二阶段(BLE安全连接):生成长期密钥(LTK) (注:蓝牙4.2及以后规范定义)第三阶段:特定于传输的密钥分发

完整的配对流程图如下:

第一阶段:

配对是安全功能的交换,包括输入/输出(IO)功能,中间人保护的要求等,俩个设备之间的配对信息交换是通过请求和配对响应数据包完成,内容如下表配对请求/响应所示。

第二阶段:

在配对特征交换后,发起方和响应方确定使用密钥生成方法,当密钥生成后,会进入身份验证阶段,用来防止中间人攻击(MITM)攻击,同时根据密钥生成方法去生成用于加密连接链路的密钥,然后进行密钥配对,认证过程如下:

配对由启动设备将其 PKa 发送到响应设备来启动。响应设备会使用自己的 PKb 进行回复。交换公钥后,设备可以开始计算密钥。之后,每个设备选择一个随机的 128 位随机数。此值用于防止重放攻击。Na,起始设备的 128 位随机随机数。Nb,响应设备的 128 位随机随机数。在此之后,响应设备然后计算承诺 Cb,该承诺使用 Nb、PKa、PKb 和 0 进行计算。如步骤 3 中的图 1 所示。步骤4,响应设备在接收到发起设备的Na之前必须共享Cb。步骤5,发起设备在接收响应设备的Nb之前必须共享其Na。步骤6,发起设备在收到响应设备的Nb后,必须检查来自响应设备的Cb。此时,启动或响应设备已经知道对等设备的公钥和随机随机数。发起设备可以从响应设备确认承诺 (Cb)。此时发生故障表示存在攻击者或其他传输错误,应配对进程中止,步骤 6.a。假设承诺检查成功,两个设备将分别计算 6 位数的确认值,这些值将在其各自的设备上向用户显示。用户应检查这些 6 位值是否匹配,并确认是否存在匹配项。如果没有匹配项,则配对将中止第三阶段:身份验证成功后,俩台设备开始计算将用于链路加密的LTK,LTK用于对设备的身份验证,然后建立私密链接,用于传输私密信息。浅析蓝牙协议栈(Bluetooth LE):

蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)。蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;蓝牙应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,百花齐放,定义出各种各样的策略,如FTP、文件传输、局域网等等。

蓝牙协议是由许多层和功能模块组成,有些是必须的,而有些功能和层是可选得。这些部分分布在被称为主机和控制器得两个主要的体系结构块上,而这两个组件的通信方式由他们之间的标准逻辑接口去定义。主机通常是类似于操作系统的东西,而控制器通常是芯片上的一个系统,但蓝牙的规范并不强制此类的实施细节,而主机和控制器作为独立的逻辑,使得架构中的容器可以以某种方式在独立的组件中实现,并为他们之间的通信定义标准接口,从而使得蓝牙可以由不同制造商的主机和控制器的组件组成,如下图所示:

图2是蓝牙协议栈,图三是osi模型协议栈:

Physical Layer

物理层

phy层定义了定义与无线电(RF)使用相关的蓝牙技术的所有方面,包括调制方案、频带、信道使用、发射机和接收机特性。

Link Layer

链路层

ll层定义空中接口包格式、位流处理程序(如错误检查)、状态机以及空中通信和链路控制协议,还定义了几种使用底层无线电实现无连接的不同方式

Isochronous Adaptation Layer

()

同步适应层

ISOAL层允许使用同步通信的设备使用不同的帧持续时间。并且对有框的pdu进行分割和重组,或对未框的pdu进行碎片和重组。

Host Controller Interface (HCI)

主机控制接⼝层

HCI层为主机组件和控制器之间的命令和数据的双向通信提供良好的功能接口(可选)

Logical Link Control and

Adaptation Protocol (L2CAP)

逻辑链路控制与适配协议

L2CAP充当主机内的协议多路复用器,确保协议由适当的主机组件提供服务。

对L2CAP上下两层之间的pdu / dsu进行分割和重组。

Security Manager Protocol

(SMP)

安全管理层

SMP⽤来管理BLE连接的加密和安全

Attribute Protocol (ATT)

属性协议层

ATT层⽤来定义⽤户命令及命令操作的数据,⽐如读取某个数据或者写某个数据。

Generic Attribute Profile

(GATT)

通⽤属性配置⽂件层

GATT⽤来规范attribute中的数据内容,并运⽤group(分组)的概念对attribute进⾏分类管理。

Generic Access Profile (GAP)

通用访问配置文件层

GAP定义在非连接状态下可能使用的操作模式和程序,例如如何使用广告进行无连接通信

以及如何执行设备发现。还定义了定义安全级别和模式和一些用户界面标准

PHY层浅析:

蓝牙LE工作在2400MHz到2483.5MHz范围内的2.4GHz的频段,该频段分为40个通道,每个通道的间距为2MHz,但如何使用这些通道是由链路层和数据传输体系结构去定义的,而在这40个信道中,有3个信道是广播通道,分别是37、38、39,用于发现设备、初始化连接和广播数据;剩下的37个信道为数据通道,用于两个连接的设备间的通讯。

LL层浅析:

LINK LAYER层主要用于控制设备的不同状态,具体状态分为以下几种:

Standby

待机状态

设备既不发送也不接收报文。

Initiating

初始化状态

设备只响应来自特定设备的广播数据包以请求连接

Advertising

通告状态

设备会传输广播报文,并可能处理响应其他设备发送的广播的报文。

Connection

连接状态

正在处于连接状态

Scanning

扫描状态

会监听来自其它设备的报文

Isochronous Broadcast

同步广播状态

设备会广播同步的数据包

Synchronization

同步接收状态

监听同步广播设备的报文

当两个蓝牙设备链接时,他们采用的时面向异步连接的逻辑传输(简称为acl)。

在acl连接上基本包的变换如下:

由c>p知识的两个连接期间,报文传输由中心设备完成,p>c由外..围设备完成

在acl过程中连接过程如下

数据包在发送后,设备B会进行crc检查,然后将NESE设置为设备A想要的值,然后设备A会使用SN作为设备B的确认,确认它正确的接收了最后一个发送的数据包,但如果设备B收到SN值错误的报文,它就会认为该报文时错误的,设备B会重传接收到的前一个数据包,然后再确认它,但是不会将他进行下一步的处理。

但是如果设备A在设备B的回复中收到了非预期的NESN值,或者在设备B的回复中没有收到的时候,设备A会使用原来相同的SN的值重新发送数据包,如下图所示:

HCL层浅析:

在HCL中,是通过包的方式来传送数据,命令和事件的,所有在主机和主机控制器之间的通信都以包的形式进行,包括每个命令的返回参数都通过特定的事件包来传输,HCL有数据,命令和事件三种类型的包。命令包COMMAND(0X01)只能从主机发往主机控制器,其中数据包是双向的,分为两类:ACL(0x02)、SCO(0x03),而事件包EVENT(0x04)始终是主机控制器发向主机的。

命令包和数据包发送在主机和控制器交换如下:

主机发出的大多数命令包都会触发主机控制器产生相应的事件包作为响应,在传输过程中会有一个句柄,用于识别主机之间的逻辑通道和控制器,共有三种类型的句柄:连接句柄、逻辑链路句柄和物理链路句柄。

在传送的数据包中我们重点关注ACL数据包:

ACL数据包格式:

Handle

PB flag

BC flag

Data Total Length

12 bit

2 bit

2 bit

16 bit

字段

说明

Handle

Connection_Handle用于在主控制器上传输数据包或段

PB Flag

包边界和适应范围

BC Flag

广播标志

Data Total Length

以八位位组为单位的数据长度,包含高层协议data

L2CAP层浅析:

L2CAP使用通道的概念来分离在堆栈层之间传递的数据包序列。固定通道不需要设置,立即可用,并与特定的高层协议相关联。还可以动态创建通道,并通过指定的协议服务多路复用器(PSM)值与协议关联。

如果将acl理解为ip的话,可以将L2CAP层理解为tcp/udp协议,L2CAP层实现了更为完善的数据传输功能,实现的主要功能如下:

分割和重新组装重传和流量控制封装和调度分片和重组

相关术语:

L2CAP通道

在对等设备中的两个端点之间的逻辑连,其特征在于它们的信道标识符(CID)

SDU或L2CAP SDU

服务数据单元:L2CAP与上层交换的数据包,并使用本文档中规定的过程通过L2CAP通道透明传输

PDU或L2CAP PDU

协议数据单元:包含L2CAP协议信息字段,控制信息和/或上层信息数据的数据包

最大传输单位(MTU)

上层实体可以接受的有效载荷数据的最大大小(以八位字节为单位)(即,MTU对应于最大SDU大小)。

最大PDU有效载荷大小(MPS)

L2CAP层实体可以接受的八位字节中的有效负载数据的最大大小(即,MPS对应于最大PDU有效载荷大小)。

链路层数据包的PDU字段可能包含各种不同的协议数据单元(PDU),这取决于蓝牙LE的使用方式。固定频率扩展信号(CTE)只在使用两种测向方法(AOA或AOD)中的一种时才会出现。

L2CAP数据包格式如下:

LENGTH

CHANNEL

INFORMATION PAYLOAD

16

16

L2CAP HEADER

L2CAP HEADER

ATT层浅析:

ATT由俩台设备使用,一台为客户端,另一台为服务器,服务器会公开一系列称为属性的组合数据,而这些属性由服务器组织在一个被称为属性表的索引列表中。

每个属性包含一个句柄,一个唯一标识符(uuid),一个值和一组权限,而属性可以理解为一个信息,比如温度,湿度,时间等信息,被服务器存储并开放一些方法供客户端读取和去修改这些属性。

GATT层浅析:

GATT基于属性表中的属性定义更高级别的数据类型,这些数据类型被称为服务,特征和描述符。它还定义了通过ATT使用这些数据类型所涉及的一系列过程,应用程序通常使用映射到这些过程的平台api。

服务是一种分组机制,它提供了一个上下文,在该上下文中使用它们包含的特征并具有已定义的类型。服务通常与设备的主要功能或功能相对应。

特征是状态数据的单个项,具有类型、关联值和一组属性,这些属性表明如何根据相关GATT程序集使用数据。例如,可以定义一个连接的对等设备可以读取一个特定特性的值,但不能写入它。

特征属于一个服务。相同的特征类型可以是多个服务的成员,根据这些服务提供的不同上下文,使用特征的规则可能会有所不同。服务规范将提供这些细节。

描述符属于某些特征,可以包含元数据,比如特征的文本描述,或者可能提供控制特征行为的一些方法。

服务,特征和描述符的层次结构如图所示:

GAP层浅析:

GAP层定义了四种设备角色,分别如下:

Broadcaster

广播者

发送数据

Observer

观察者

接收报文等数据包,不连接到其他设备,观察者能够以无连接的方式接收广播数据

Peripheral

外设

外设可以和主机连接。它包含一个发射机和一个接收器。

Central

主机

主机能够发起连接与外设建立连接。它包含一个发射机和一个接收器

BLE报文类型:

链路层定义了两种报文类型。第一个是由未编码的PHY使用,LE 1M和LE 2M,第二个是由LE编码的PHY使用。

这俩种报文类型中,都包含了字段“preamble”,“Access Address”和“crc”

Preamble

用于接收时精确地同步信号的频率,执行自动增益控制和估计数据速率同步,固定为01010101或者10101010序列

Access Address

4个字节长度,广播报文接入地址为:0x8E89BED6,数据报文接入地址为:32bits随机数

crc

3字节长度,循环冗余校验码

真实的Bluetooth

在大致了解了蓝牙BLE各层协议的特点和功能后,还是对蓝牙数据包结构朦朦胧胧,所以去买了NRF52832并且配好环境后去看看真实的蓝牙数据包

环境配置如下:

1.wireshark:下载wireshark的时候要标选USBPcap选项

2.nrf_sniffer_for_bluetooth_le_4.1.0下载:

(根据自己wireshark的版本去选择对应的版本)

3.将解压文件中的extcap中的文件全部复制到wireshark的extcap文件中

4.将Profile_nRF_Sniffer_Bluetooth_LE文件复制到个人配置文件夹中的profiles中(可在帮助栏中的关于Wireshark中查看个人文件夹的配置)

5.安装python库pyserial

pip install pyserial>=3.4

最后运行extcap中的nrf_sniffer_ble.sh确认nrf sniffer可以正常运行。

nrf_sniffer_ble.bat --extcap-interfaces

出现这些内容则说明插件安装成功

6.此时重启电脑打开wireshark的时候过滤器会出现usbcap的选项

选择该选项即可进行蓝牙数据包的抓取

下面是抓取的我的电脑和蓝牙耳机的通信协议包:

HCL层数据包:

可以看到HCL层分为了HCL_CMD(命令包)和HCL_EVT(事件包),具体在上文有所说明

随机选取一个HCL_CMD,数据包如下:

本HCL_CMD的功能是发送本地设备名称,也就是数据包中的Device Name: DESKTOP-QU1G395这个值,应该是处于建立蓝牙链接过程中的特征交换

这是本机接收到的蓝牙耳机的设备名称

标准的含有data的HCL_ENV数据报如下(随机选取):

HCL_ACL数据包

这是配对过程中发送的hcl_acl数据包,可以很明显的看到acl的数据包特征,data内容如下

L2CAP层数据包

依旧是随机选取一个:

通过这个数据包我们可以同时间看到HCL的ACL包和L2CAP的数据包。

ACL数据包非常明显的Handle和PB FLAG还有BC FLAG的格式和L2CAP数据包的格式,HCL的数据包被包裹在了L2cap中,响应的数据我们就可以通过不同层去查看响应的值。

在流量包中还获取到了如RFCOMM,SDP,A2DP,aptx这些用于处理蓝牙音频传输的协议,音频的信息数据交换可能是再这些协议之间。

因为蓝牙耳机涉及协议复杂,所以我通过文件传输去学习蓝牙通信,为了方便确认某协议层是传输数据层,所以我使用了web中常见的图片的形式去传输。

图片如下:

抓取到蓝牙数据包如下:

依旧是HCL的发送和接收,猜测是特征交换过程,比如前面的pin值确认等。

然后再L2CAP看到了我的手机标识,猜测是已经建立了链接。

文件的数据传输是通过RFCOMM协议去完成的,如下图所示:

data内容如下:

可以看到很明显的我起的kfc.jpg的名称,同时再后面的数据中看到我预先存放的一句话木马。

小结:

在蓝牙ble学习中,蓝牙协议栈的每个层都有着自己的功能和特定的数据传输,下层的协议不会只对上层数据进行简单的包裹,也有可能会进行编码解码等操作,所有从不同层抓取的数据包可能会不一样。且因为蓝牙协议层的应用面广泛,所有可能在不同应用上会出现新的协议层,从安全角度去思考的话可以根据不同应用去重点关注某些协议层。

标签: #pythonphy