蓝牙Bluetooth学习 Bluetooth 蓝牙协议栈技术 “蓝牙”(Bluetooth)原是一位在10世纪统一丹麦的国王,他将当时的瑞典、芬兰与丹麦统一起来。用他的名字来命名这种新的技术标准,含有将四分五裂的局面统一起来的意思。蓝牙技术使用高速跳频
(Frequency Hopping)和时分多址
(TIme DivesionMuli—access)等先进技术,在近距离内最廉价地将几台数字化设备(各种移动设备、固定通信设备、计算机及其终端设备、各种数字数据系统,如数字照相机、数字摄像机等,甚至各种家用电器、自动化设备)呈网状链接起来。
[ ](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2022/11/7-1667537950.png )
蓝牙技术在发展至今,衍生出了多个版本,如老的经典蓝牙版本和4.0后的低功耗版本,下面主要讨论蓝牙低功耗
也就是BLE
。
蓝牙工作过程
配对:配对是指两个蓝牙设备首次通讯时,相互确认的过程,在通过配对后的数据传输不需要再重复进行确认
pin:个人识别码,蓝牙使用的pin码长度为1-8个十进制位数
DB_ADDR:蓝牙设备地址。每个蓝牙设备被分配了类似mac地址的唯一的一个48位数的设备地址。用于通讯地址确认.两个蓝牙设备在通讯开始时通过询问的方式获取蓝牙设备地址
所以蓝牙的工作过程为:
1 启动 --->> 扫描设备 --->> 设备配对 --->> 数据传输
配对过程: 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)攻击,同时根据密钥生成方法去生成用于加密连接链路的密钥,然后进行密钥配对,认证过程如
下:
熊猫杯xbox蓝牙协议题解 题目给了一个xbox.pcapng
的附件,猜测是XBOX手柄的流量。在解题之前不妨先看看XBOX手柄长啥样。 Macos打开流量包以后会报错,大概率尾部有脏数据,发现有一个ZIP压缩包,那肯定带密码了。那这道题的思路无非就是解密手柄的数据,解密压缩包拿到flag,实际结果也大抵如此。 看到l2cap协议有大量的通信,尝试过滤一下。 先过滤一下usb.src
发现数据量比较小,并且没有什么特殊含义,再过滤一下usb.dst
发现这次数据量就非常大了,用tshark全部提取出来分析一下。
1 tshark -r xbox.pcapng -Y "btl2cap.payload and usb.dst == host" -T fields -e btl2cap.payload > data.txt
得到的数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 a10485 a1010b813c849f77a98c00000000000100 a1010b813c849f77a98c00000000000100 a1010b813c849f77a98c00000000000100 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000010000 a1010b813c849f77a98c00000000010000 a1010b813c849f77a98c00000000010000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 …… a1010b813c849f77a98c00000000030000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000030000 a1010b813c849f77a98c00000000030000 a1010b813c849f77a98c00000000030000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000 a1010b813c849f77a98c00000000000000
观察发现前14个字节重复出现,没有什么变化,可以删掉! 经过赛博算命发现最后一个重复出现的00字节也没啥用,删掉!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 0001 0001 0001 0000 0000 0000 0100 0100 0100 0000 0000 0000 0100 0100 0100 0000 0000 0000 0300 0300 0300 0000 0000 0000 0300 0300 0300 0000 0000 0000 0300 0300 0300
继续观察剩下的数据,发现有同一个数据重复出现三次的情况,猜测是手柄按下和抬起的操作,那么继续把连续重复出现三次的数据只保留一次。精简后的所有数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 0001 0000 0100 0000 0100 0000 0300 0000 0300 0000 0300 0000 0500 0000 0008 0000 0008 0000 0004 0000 0001 0000 0100 0000 0300 0000 0500 0000 0002 0000 0001 0000 0100 0000 0500 0000 0008 0000 0004 0000 0300 0000 0300 0000 0300 0000 0300 0000 0100 0000 0500 0000 0008 0000 0008 0000 0004 0000 0002 0000 0001 0000 0300 0000 0300 0000 0100 0000 0100 0000 0100 0000 0500 0000 0008 0000 0002 0000 0100 0000 0300 0000 0300 0000 0300 0000 0300 0000 0500 0000 0008 0000 0008 0000 0001 0000 0300 0000 0300 0000 0100 0000 0100 0000 0100 0000 0500 0000 0002 0000 0300 0000 0100 0000 0100 0000 0100 0000 0100 0000 0500 0000 0008 0000 0008 0000 0004 0000 0001 0000 0300 0000 0300 0000 0300 0000 0100 0000 0100 0000 0500 0000 0002 0000 0001 0000 0300 0000 0300 0000 0300 0000 0300 0000 0100 0000 0500 0000 0008 0000 0001 0000 0100 0000 0100 0000 0100 0000 0100 0000 0100 0000 0500 0000 0008 0000 0008 0000 0004 0000 0002 0000 0001 0000 0100 0000 0100 0000 0100 0000 0100 0000 0100 0000 0500 0000 0100 0000 0100 0000 0100 0000 0100 0000 0300 0000 0500 0000 0100 0000 0300 0000 0300 0000 0300 0000 0300 0000 0500 0000 0100 0000 0300 0000 0300 0000 0300 0000 0300 0000 0500 0000 0100 0000 0300 0000 0300 0000 0300 0000 0300 0000
接下来,继续对脑电波,根本对不上啊哥( 最终发现了规律: 第1个字节有三种情况
0x01 0x02 0x05
第2个字节有四种情况
0x01 0x02 0x04 0x08
那么这几种情况有什么含义呢?找到一篇分析的文章xbox-one-wireless-protocol ,发现对不上,手头也没有XBOX手柄,那只能找游戏大师@seal师傅,让他抓一下XBOX的流量,发现还是对不上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 X: Frame 87: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000080000 Y: Frame 91: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000100000 A: Frame 95: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000010000 B: Frame 99: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000020000 上: Frame 115: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000001000000 下: Frame 131: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000005000000 左: Frame 135: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000007000000 右: Frame 139: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000003000000 rb: Frame 31: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000800000 lb: Frame 35: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 0080ff7f0080ff7f0000000000400000 左摇杆向右:前4个字节变化,猜测表示坐标 Frame 73: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \\.\USBPcap2, id 0 USB URB Bluetooth Bluetooth HCI USB Transport Bluetooth HCI ACL Packet Bluetooth L2CAP Protocol Bluetooth Attribute Protocol Opcode: Handle Value Notification (0x1b) Handle: 0x0007 (Unknown) Value: 49 6a f4 82 0080ff7f0000000000000000 lt与rt存在多组数据,猜测与力度有关(油门)
但是第2个字节1、2、4、8四种情况很像四个按键LT、LB、RT、RB,找一下XBOX的按键分布图。 如果你做到这里会发现,你知道这些也没什么用,嘿嘿,还是得靠脑洞( 只看第二个字节这一列数据,第一个字节这一列数据作为分割符。 提取所有第二个字节的数据。 绿色是求和的部分,可以得到1,21,3,12,23,10,17,2,21,3,9,23,看到这里还得脑洞一下,对应26个英文字母。 其实这个是云影密码(又称01248密码)的原理,直接跑脚本也可以。
1 2 3 4 5 6 str = '0abcdefghijklmnopqrstuvwxyz' .upper()for i in [1 ,21 ,3 ,12 ,23 ,10 ,17 ,2 ,21 ,3 ,9 ,23 ]: print (str [i],end='' ) print ()
得到的结果是AUCLWJQBUCIW
,这个是压缩包的密码。 打开之后可以得到IfWT725Zkx/SSQdxoZPvm8ldX8BSrr1GU2h841iYrZbZL+rPPyjnboqduBPVO6cx
,尝试解密失败。猜测是一个对称加密,那么还需要一个key,从何而来呢? 现在还有第一个字节的数据没有用到,0x01、0x02、0x05,脑洞一下morse编码,最终发现:
0x01,对应. 0x02,对应- 0x03,对应分隔符
可以得到
调用Cyberchef的morse模块解密一下得到2AE9717689554111
再调用AES模块解密一下 最终可以得到flag{5508d742-bae4-44a0-9376-25ba9c22de6d}
简单MB