• 蓝牙安全入门——两道CTF题目复现


    蓝牙安全入门

    🚀🚀最近一直对车联网比较感兴趣,但是面试官说我有些技术栈缺失,所以还得狠狠补,先从蓝牙开始吧,因为刚好有道CTF的题目可以复现一下。

    参考资料

    蓝牙CTF题目汇总 (yuque.com) 所有的文件都在大佬的网页里面,需要的可以自己去下载。

    CTFtime.org / Cyber Apocalypse 2021 / Low Energy Crypto / Writeup 因为有一步有点问题,所以后面按照这个大佬的步骤来的。

    题目 low_energy_crypto

    🚀🚀首先题目打开是这样子的(如果显示不全,那就是版本问题,我终于换掉了我老掉牙的wireshark :happy:):

    在这里插入图片描述

    获取私钥

    🚀🚀我们很容易就能看到有些Tx和Rx数据,而且看到了UART,这个主要是用来通信和传递数据的,所以我们就打开看一眼传输的内容:

    在这里插入图片描述

    🚀🚀我们能看到类似于公钥的东西,我们先提取出来,这里是有两部分:

    -----BEGIN PUBLIC KEY-----
    MGowDQYJKoZIhvcNAQEBBQADWQAwVgJBAKKPHxnmkWVC4fje7KMbWZf07zR10D0m
    B9fjj4tlGkPOW+f8JGzgYJRWboekcnZfiQrLRhA3REn1lUKkRAnUqAkCEQDL/3Li
    4l+RI2g0FqJvf3ff
    -----END PUBLIC KEY-----
    

    🚀🚀这个地方可以使用RsaCtfTool.py来解密,但是我没成功,运行的时候有问题,就想着换一种办法,如下所示,我们先恢复私钥:

    openssl rsa -in ../pub.key -text -inform PEM -pubin
    
    # Public-Key: (512 bit)
    # Modulus:
    #     00:a2:8f:1f:19:e6:91:65:42:e1:f8:de:ec:a3:1b:
    #     59:97:f4:ef:34:75:d0:3d:26:07:d7:e3:8f:8b:65:
    #     1a:43:ce:5b:e7:fc:24:6c:e0:60:94:56:6e:87:a4:
    #     72:76:5f:89:0a:cb:46:10:37:44:49:f5:95:42:a4:
    #     44:09:d4:a8:09
    # Exponent:
    #     00:cb:ff:72:e2:e2:5f:91:23:68:34:16:a2:6f:7f:
    #     77:df
    # writing RSA key
    # -----BEGIN PUBLIC KEY-----
    # MGowDQYJKoZIhvcNAQEBBQADWQAwVgJBAKKPHxnmkWVC4fje7KMbWZf07zR10D0m
    # B9fjj4tlGkPOW+f8JGzgYJRWboekcnZfiQrLRhA3REn1lUKkRAnUqAkCEQDL/3Li
    # 4l+RI2g0FqJvf3ff
    # -----END PUBLIC KEY-----
    

    🚀🚀输出如上所示,然后我们把十六进制转为十进制,使用的脚本如下所示:

    hex_string = """
    00:a2:8f:1f:19:e6:91:65:42:e1:f8:de:ec:a3:1b:
    59:97:f4:ef:34:75:d0:3d:26:07:d7:e3:8f:8b:65:
    1a:43:ce:5b:e7:fc:24:6c:e0:60:94:56:6e:87:a4:
    72:76:5f:89:0a:cb:46:10:37:44:49:f5:95:42:a4:
    44:09:d4:a8:09
    """
    
    # 移除换行符和冒号
    hex_string_clean = hex_string.replace("\n", "").replace(":", "")
    
    # 将整个十六进制字符串转换为整数
    int_value = int(hex_string_clean, 16)
    
    # 打印结果
    print(f"Hex: {hex_string_clean} -> Int: {int_value}")
    
    

    🚀🚀然后我们就得到了n和e,使用在线网站(http://factordb.com/index.php)来获得q,p,结果如下所示:

    p = 92270847179792937622745249326651258492889546364106258880217519938223418249279
    
    q = 92270847179792937622745249326651258492889546364106258880217519938223418258871
    
    e = 271159649013582993327688821275872950239
    

    🚀🚀然后下载这个py文件(rsatool/rsatool.py at master · ius/rsatool (github.com)),使用如下命令,可能会缺少库,自己安装一下就好了:

    python rsatool.py -p 92270847179792937622745249326651258492889546364106258880217519938223418249279 -q 92270847179792937622745249326651258492889546364106258880217519938223418258871 -e 271159649013582993327688821275872950239 -o priv.key
    

    🚀🚀结果如下所示,我们就获得了私钥:

    -----BEGIN RSA PRIVATE KEY-----
    MIIBRwIBAAJBAKKPHxnmkWVC4fje7KMbWZf07zR10D0mB9fjj4tlGkPOW+f8JGzg
    YJRWboekcnZfiQrLRhA3REn1lUKkRAnUqAkCEQDL/3Li4l+RI2g0FqJvf3ffAkBY
    f1ugn3b6H1bdtLy+J6LCgPH+K1E0clPrprjPjFO1pPUkxafxs8OysMDdT5VBx7dZ
    RSLx7cCfTVWRTKSjwYKPAiEAy/9y4uJfkSNoNBaib393y3GZu+QkufE43A3BMLPC
    ED8CIQDL/3Li4l+RI2g0FqJvf3fLcZm75CS58TjcDcEws8I1twIgJXpkF+inPgZE
    TjVKdec6UGg75ZwW3WTPEoVANux3DscCIDjx+RSYECVaraeGG2O/v8iKe6dn1GpM
    VGUuaKecISArAiA0QRYkZFB5D4BnOxGkMX3ihjn7NFPQ7+Jk/abWRRq6+w==
    -----END RSA PRIVATE KEY-----
    

    解密

    🚀🚀之后解密一下传输的加密内容就好了,加密内容如下所示:

    在这里插入图片描述

    🚀🚀提取出来把后面多余的0删除,便可以解密了,使用命令如下所示:

    openssl rsautl -decrypt -raw -inkey priv.key -in flag
    

    🚀🚀结果如下所示:

    The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
    �5������p+wɹ�[R�.;����^�bs� �6yflag{5cf7b-9f8f1e-688-9f80f}
    

    🚀🚀最后我们就拿到了我们的flag{5cf7b-9f8f1e-688-9f80f}

    题目 蓝牙钥匙的春天

    🚀🚀这个比较简单,所以只是介绍一下SMP协议:

    🚀🚀蓝牙中的安全管理协议(Security Manager Protocol,SMP)是负责蓝牙设备间的配对和加密的协议。SMP在蓝牙低功耗(Bluetooth Low Energy, BLE)和经典蓝牙(Bluetooth Classic)中有所不同,但它们的主要功能是相似的。下面是对蓝牙低功耗中的SMP协议的详细介绍:

    配对过程

    🚀🚀SMP的主要功能之一是处理设备间的配对过程。配对过程的主要目的是建立一个安全的连接,确保数据传输的机密性和完整性。配对过程通常包括以下步骤:

    • 配对特征交换:设备交换配对请求和响应,以决定使用的安全功能和认证方法。
    • 生成和交换临时密钥(Temporary Key, TK):设备生成一个临时密钥,用于保护接下来的密钥交换过程。
    • 生成和交换短期密钥(Short Term Key, STK):使用临时密钥生成短期密钥,短期密钥用于初次加密连接。
    • 生成和交换长期密钥(Long Term Key, LTK):生成长期密钥,用于加密以后的连接。

    配对方法

    🚀🚀SMP支持多种配对方法,每种方法提供不同级别的安全性:

    • Just Works:无需用户输入,用于低安全需求的场景。
    • Passkey Entry:一方输入另一方显示的6位数密码,用于中等安全需求。
    • Numeric Comparison:双方显示一个6位数并进行比较,用于高安全需求。
    • Out of Band (OOB):使用蓝牙之外的通信渠道(如NFC)交换配对信息,用于最高安全需求。

    密钥分发

    🚀🚀在配对过程中,设备之间会分发各种密钥,用于加密和身份验证:

    • 长期密钥(LTK):用于加密数据。
    • 连接签名密钥(CSRK):用于数据签名,确保数据完整性。
    • 身份信息(IRK):用于设备身份验证和隐私保护。

    数据加密

    🚀🚀配对完成后,SMP使用生成的密钥对数据进行加密。蓝牙低功耗使用AES-CCM(Counter with CBC-MAC)算法进行加密,确保数据的机密性和完整性。

    安全漏洞和保护

    🚀🚀虽然SMP提供了强大的安全功能,但它也可能受到各种攻击,如中间人攻击(MITM)和旁路攻击。为了提高安全性,建议:

    • 使用高安全级别的配对方法。
    • 经常更新设备固件以修补已知的安全漏洞。
    • 在设计蓝牙应用时考虑使用额外的加密和认证机制。

    实际应用

    🚀🚀SMP广泛应用于需要安全数据传输的蓝牙设备,如智能手表、健身追踪器、无线耳机和医疗设备。通过确保设备间的安全配对和数据加密,SMP在保护用户隐私和数据安全方面起到了重要作用。

    • 使用高安全级别的配对方法。
    • 经常更新设备固件以修补已知的安全漏洞。
    • 在设计蓝牙应用时考虑使用额外的加密和认证机制。

    实际应用

    🚀🚀SMP广泛应用于需要安全数据传输的蓝牙设备,如智能手表、健身追踪器、无线耳机和医疗设备。通过确保设备间的安全配对和数据加密,SMP在保护用户隐私和数据安全方面起到了重要作用。

  • 相关阅读:
    力扣21:合并两个有序链表
    ELF: better symbol lookup via DT_GNU_HASH
    垃圾回收机制——GC详讲
    TNF6TOA TNF5TOA 全新板卡8路任意速率业务支路处理板
    python判断语句
    SpringBoot3 正式发布:有哪些新玩法?
    数字转型 | 论指标解析在数据治理中的作用
    图之最小生成树Kruskal算法详解(C语言版)
    SVA断言
    java mock单测
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/139574627