2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

admin 2020年11月30日17:01:25评论100 views字数 4296阅读14分19秒阅读模式

Sourcell@HatLab 海特实验室

蓝牙协议是物联网中常用的无线协议,本次西湖论剑IoT闯关赛中设计了三道蓝牙安全相关的赛题,以下是相关writeup

adv_sign

这道题是蓝牙类的签到题,考察选手对 LE 设备的情报收集能力。

使用 bluescan 扫描周围的 LE 设备可以发现如下不同寻常的 GAP 数据:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

将这些数据依次按 0xfc、0xfd 和 0xfe 的顺序拼起来再做 base64 解码,即可得到 flag ble@e_b5p@k_fl@go!

L2CAP 套娃

该题主要考察选手对 L2CAP 协议连接建立过程的理解。核心思想是与目标设备建立 L2CAP 连接的情况下,再手动构造数据包,实现两层嵌套的 L2CAP 连接。

使用 bluescan 扫描周围目标设备的 SDP 服务可以发现如下信息:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

根据上面的提示信息,显然该服务就是选手的目标,而且它暴露了 level 0 L2CAP 连接的 PSM,即 0x1031。但是后面两层 L2CAP 连接的 PSM 未知。

先使用暴露的 PSM 建立最外面的 L2CAP 连接再说。连接建立后可得到来自 level 1 的提示 “ConnectMe”:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

此时我们根据 L2CAP 协议,构造建立连接的第一个数据包 L2CAP_INFORMATION_REQ,并把它作为 level 0 L2CAP 的数据信道载荷发送给目标:

  1. Length CID Code Identifier(随意) Length InfoType(随意)

  2. 0600 0100 0a ff 0200 ffff

目标返回建立连接所需的 PSM 0x1041:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

继续构造第二个数据包 L2CAP_CONNECTION_REQ,并使用上面得到 PSM 建立连接:

  1. Length CID Code Identifier(随意) Length PSM SourceCID

  2. 0800 0100 02 ff 0400 4110 4000

按照协议规范解析目标返回的 L2CAP_CONNECTION_RSP,我们可以拿到配置 level 1 数据信道所需的 DCID 0x0041:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

最后使用上面的 DCID 构造第三个数据包 L2CAP_CONFIGURATION_REQ。把它发送给目标,即可完成 level 1 L2CAP 连接的建立:

  1. Length CID Code Identifier(随意) Length Destination Flags

  2. 0800 0100 04 ff 0400 4100 0F00

Level 1 L2CAP 建立完成后,目标将返回来自 level 2 L2CAP 的提示:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

重复上述过程,在 level 1 的数据信道载荷中建立 level 2 L2CAP 连接后,可得到拿 flag 的提示:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

最后根据提示在 level 2 的数据信道载荷中发送 “flag”,即可拿到 flag br0h1pIt_l@cab_watrx0sHka

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

GATT 保险箱

这道题模拟了一个智能保险箱,该保险箱使用 GATT 与用户通信,综合考察选手破解这类智能设备的能力。核心思想是收集保险箱开放的服务,并利用这些情报非法打开保险箱,拿到里面的 flag。

首先使用 bluescan 扫描目标设备的 GATT 服务,可以发现目标提供了一个 Battery 服务和一个未知服务:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

从上面的信息中,发现 UUID 为 2a1911111111-1111-1111-1111-111111111111 以及 11111111-1111-1111-1111-111111111110 的 characteristic 带 NOTIFY 属性。于是先使能它们的 notification,看能拿到什么数据再说:

  1. safe_box.subscribe('00002a19-0000-1000-8000-00805f9b34fb', callback=handle__notifi)

  2. safe_box.subscribe('11111111-1111-1111-1111-111111111111', callback=handle_notifi)

  3. safe_box.subscribe('11111111-1111-1111-1111-111111111110', callback=handle_notifi)

使能 notification 后,目标设备将主动给发送数据,如下:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

其中 characteristic 2a19 反映的 battery level 一直是个随机值,不断在 10、20 到 100 间变化。然后 11111111-1111-1111-1111-111111111111 没数据;11111111-1111-1111-1111-111111111110 始终返回 “DBAPPSecurHatLab”。

这个随机变化的 battery level 不符合常理,肯定有问题。再结合最开始扫到的 GATT 服务数据,我们发现可读写的 11111111-1111-1111-1111-111111111111 characteristic 也提示了 “Strange battery level”:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

那么需要思考这个随机变化的 “battery level” 有什么用?会 notify 的 11111111-1111-1111-1111-111111111111 为什么没有返回数据?

此时发现 “Strange battery level” 对应的 11111111-1111-1111-1111-111111111111 有 WRITE 属性,是可写的。接着把当前收到的 battery level 立即写入 11111111-1111-1111-1111-111111111111,就会发现它能返回数据了,如下:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

同时在上图中可以发现,若写入的 battery level 相同,11111111-1111-1111-1111-111111111111 返回的数据也相同,它们有如下对应关系:

Battery Level 11111111-1111-1111-1111-111111111111
10 b'VmYZWYe2xGpy1Ifk'
20 b'm55GRyWz7jk6UL9O'
30 b'7Dz2UyaPTYaINOhT'
40 b'7DU4xpwOaBE9dVnu'
50 b'5vquNX1PZuatGD4X'
60 b'V6TNSErhXPgdJSZU'
70 b'8rrkcBSw9928pxmj'
80 b'rYA6xm9mP1gqdItZ'
90 b'dxj4iwXPBRPM2uk4'
100 b'lry0CrP5HDGL5VqY'

随后再根据最开始获取的 GATT 情报,发现 11111111-1111-1111-1111-111111111110 提示了 “Random key challenge”:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

因此意识到上面 11111111-1111-1111-1111-111111111111 提供的数据(每个都为 128-bit)可能是密钥。另外之前不断出现的明文 “DBAPPSecurHatLab” 也一直没有用上。

那么尝试使用实时获取的密钥,加密明文 “DBAPPSecurHatLab”,再写给那个告诉我们 “Random key challenge” 的 characteristic:

  1. cipher = AES.new(bytes(key), AES.MODE_ECB).encrypt('DBAPPSecurHatLab'.encode())

  2. safe_box.char_write('11111111-1111-1111-1111-111111111110', value)

之后可以得到如下数据,并没有多出什么有用的信息:

下面图中的 Cipher 只是加密后的 “DBAPPSecurHatLab”,不是新情报。

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

但是当我们等一会,自动进行实时加密 10 次,并把密文实时提供给 “Random key challenge” 对应的 characteristic 后,它就会自动吐出 flag:

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

HatLab知识星球

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

关于我们

2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

人才招聘

一、物联网安全研究员(硬件安全方向)

工作地点:

1.杭州;

岗位职责:
1.嵌入式方向的安全漏洞挖掘;
2.嵌入式系统硬件软件设计与研发。
任职要求:
1.熟练使用C语言,可规范使用指针,结构体,联合体;
2.熟练使用Linux操作系统,理解Makefile原理并可编写Makefile文件;
3.了解数字电路原理,具有较扎实的计算机系统结构知识,理解操作系统原理;
4.了解WEB或PWN方向的漏洞挖掘过程,会使用相关工具如Zap、IDA等,会自行编写漏洞利用工具。
加分项:
1.具有网络安全公司实习经验;
2.具有网络安全赛事经验;
3.有设计电路板原理图和四层PCB布局经验;
4.熟练焊接0402,0201,QFN,BGA等元器件封装;
5.有AVR,ARM,MIPS,Xtensa等内核的MCU/SoC开发经验;
6.向知名平台提交过物联网方向的漏洞报告。


二、物联网安全研究员(固件安全方向)

工作地点:

1.杭州;

岗位职责:
1. 物联网通用协议、组件、操作系统漏洞挖掘与漏洞复现;
2. 物联网设备漏洞挖掘与漏洞复现;
3. 参与创新物联网安全研究项目;
任职要求:
1.具有二进制漏洞挖掘经验,熟悉ARM、MIPS等其他架构的漏洞利用技巧;
2.熟练掌握gdb、IDA等工具的使用;
3.具有一定的硬件基础和动手能力,掌握常见的嵌入式设备固件提取及解包的方法;
4.至少掌握一门编程语言,如C/C++/Perl/Python/PHP/Go/Java等。
加分项:
1.具有知名物联网设备/网络设备漏洞挖掘成果证明;
2.参加CTF比赛并获奖;
3.参与GeekPWN、HackPWN等智能设备破解大赛并取得成绩。


三、物联网安全研究员(无线电安全方向)

工作地点:

1.杭州;

岗位职责:
1. 无线通信协议的通用漏洞挖掘;
2. 无线通信应用系统的漏洞挖掘,如智能设备等。
任职要求:
1. 掌握无线通信基本原理及数字信号处理理论,熟悉各种调制解调算法,信道编码算法等;
2. 熟悉C/C++、MatLab、Python等编程语言;
3. 熟悉至少一种常见无线通信协议及其安全问题,如Wi-Fi、Bluetooth、Zigbee、4/5G等;
4. 熟练掌握SDR外设和GNURadio等工具的使用。
加分项:
1. 具有信息安全公司实习经验;
2. 有嵌入式固件逆向分析经验;
3. 参加CTF比赛并获奖;
4. 有智能设备的破解经验;
5. 通信工程、信息安全专业。



感兴趣的小伙伴请联系姜女士,或将简历投送至下方邮箱。(请注明来源“研究院公众号”)

联系人:姜女士
邮箱:[email protected]
手机;15167179002,微信同号

本文始发于微信公众号(安恒信息安全研究院):2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年11月30日17:01:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2020西湖论剑IoT闯关赛系列Writeup(蓝牙部分)https://cn-sec.com/archives/193214.html

发表评论

匿名网友 填写信息