查看原文
其他

侠盗猎车—玩转滚动码

星舆实验室 看雪学苑 2022-07-01


本文为看雪论坛优秀‍‍‍文章
看雪论坛作者ID:星舆实验室


侠盗猎车—玩转滚动码(上)

在前两篇侠盗猎车系列文章中, 我们介绍了固定码逆向分析的思路和原理。感兴趣的同学可去(https://bbs.pediy.com/thread-269716.htm和(https://bbs.pediy.com/thread-270069.htm) 复习一波。

值得一提的是其中一个测试目标无线门锁, 在锁的接收端与遥控器部分都带有一个8 bits的DIP开关。每一bit又可有上中下3种变化码位。只有当两边的bits拨码位相匹配时, 遥控器才能将门锁打开。

相对传统不可更改的固定码而言, 这大大提升了无线门锁的码位空间。以下是分别代表了3段不同拨码位的信号频谱图, 可以看出这3段信号的后半部分完全相同。

而每段第1位的信号却各不相同, 因为随着1st bit拨码位的更改, 以其相对应的信号也随之改变。是不是发现有点滚动码的意思了, 这种设计给重放攻击带来一定困扰。


0x01 爆破


不过其影响非常有限, 因为拨码仅8bits, 3^8 总共只有6561种组合。对于如今电脑算力实在不费吹灰之力, 且大多数的无线门锁系统并没有防爆破机制。

这里跟大家推荐一款为无线信号逆向破解而生的软件Universe Radio Hacker。想要逆向常见的无线钥匙系统使用URH足够了。如下图通过URH来判断无线信号的频率范围和调制方式。

在捕捉到无线门锁的信号后, 还可以通过URH进行可视化分析。如下图门锁遥控信号的固定码一览无余。

前面提到过此款无线门锁的拨码变化空间有限, 所以可以在分析完信号结构后生成所有可能的排列组合, 通过URH的Fuzzing 功能对门锁进行爆破攻击。

以下是URH爆破无线门锁指令演示视频 (https://www.youtube.com/watch?v=xuIouejbXss)


0x02 De Bruijn 序列


传统的爆破攻击往往需要很长的时间, 从实战角度来说我们还需要进行优化。这里要跟大家介绍下De Bruijn序列, 这是由荷兰数学家Nicolas Govert de Bruijn命名而来。

De Bruijn序列的表达式为B (k,n)。我们用常见的银行ATM密码举个例子, k为所有的数字组合{0,1,2,3,4,5,6,7,8,9}, n则是密码的总长度假设为4, 因此De Bruijn表达式为B (10,4)。
 
这样的密码总共可有10,000种组合, 如果每组都单独尝试仍需要花很长的时间。电子电路中还有一个shift register的概念, 如下图中只出现了1组数列, 但却可用于3次密码尝试。

因为如果采用了shift register机制, 每次尝试电路寄存器都自动向前移动一位。

在举个例子我们用二进制数列来分别表示1,2,3,4:

现在假设密码是111111000000。我们首先尝试0111111000000 这12bits数列, 这显然不对, 但如果目标系统用shift register, 我们则无需在尝试另一组12bts数列, 因为shift register 每次仅向前移动1bit 变为111111000000, 密码正确。

在无线指令爆破攻击中, 我们可以提前生成具有De Bruijn序列特性的数组。从而大大减少了所需时间。以下是利用De Bruijn序列爆破无线门铃视频 (https://www.youtube.com/watch?v=o3CjamtVbjQ)


0x03 总结


但当我们的目标是汽车钥匙滚动码的时候, 即使De Bruijn序列也不够用。这就需要我们找到滚动码算法或者系统本身的设计缺陷。

以下是某款汽车滚动码缺陷演示视频 (https://www.youtube.com/watch?v=9JKg3IUJYPU)


0x04 文献

http://samy.pl/opensesame/
https://github.com/jopohl/urh
https://www.usenix.org/conference/woot18/presentation/pohl


侠盗猎车—玩转滚动码(中)

在上篇侠盗猎车系列文章中, 我们介绍了滚动码的基础,以及通过爆破的手段打开门锁。在这篇文章中我们将了解更多滚动码的细节以及漏洞CVE-2021-46145的发现过程。
 

0x01 滚动码

 
前面我们提到通过拨码的方式来改变码位的滚动码模式。但众厂商早已淘汰了此方式, 转而采用通过密钥算法来产生滚动码。例如这款2014款VW大众 Hella 系的汽车钥匙, 就采用私有的加密模式。

抓包分析后我们可以得知VW系采用OOK 调制模式, 通过Manchester 编码对数据解码。

而每段有效的数据都会以 10101000 作为起始sync-word。

305-312字节则为相应的操作指令。如00011100 为开门, 00101010 为关门, 01000110则为开启后备箱指令。数据图中的标蓝部分为VW系钥匙的滚动码部分。

这里我们可以通过python脚本或URH 自带的比对功能, 对不同指令间的滚动码部分进行比对分析。


除了大众系以外还有Microchip出产的HCS系列芯片在RKE钥匙中广为流行。其使用的便是私有协议KEELOQ。

Keeloq 数据结构共有66bits包含了28bits的系列号, 32bits的滚动码, 以及4bits 的按键功能码和2bits状态码。所采用的编码格式为PWM。


通过RTL_433自带的解码插件成功解码出设备ID号以及滚动码。跟我们手动抓包分析后得出的结果相吻合。


众多钥匙体算法中还有很多其他类型, 比如Hitag也是常见的算法之一。想要熟悉每一套算法, 都需要我们进行大量的分析比对。

例如以下是一款2015年福特汽车的钥匙信号。每一串指令都有相同但又不同之处, 因为缺少官方文档, 所以这里我们只能大胆假设小心求证。可以看到从1-26字节都是值为0的引导码。

从27-39 的值也都相同, 这里我们可以假设其为设备ID。很明显的是从40-43字节为开关车门的操作, 其值从ebdc 转换成了f3dc, 所以我们可以推测其跟操作指令相关。

而44 字节有规律的递减, 这很可能是计数器。最后的45-53字节各不相同, 则大概率为滚动码。


0x02 CVE-2021-46145

 
这是我在滚动码研究过程中发现的一个本田汽车钥匙的设计缺陷。事实上这在汽车钥匙的安全研究中已经不是第一次出现, 早在2016年就有研究员在比亚迪汽车钥匙设计中找到同类问题。

理论上每当车钥匙的按键按下,滚动码的同步计数器便随之向前增加。同时为了避免车主的误操作, 车钥匙与车端会在一定范围内同时接受N组提前协商好的滚动码数列。

根据滚动码的设计原理, 通常我们是无法使用简单的回放攻击打开车门。但是如果我们把过期的开门指令按特定顺序重新排列并发送, 令人意外的是本田汽车的同步计数器竟回滚了, 也意味着之前过期的开门指令又复活了。

如视频所示在特殊指令发送后, 本已过期的指令又恢复使用。以下是滚动码缺陷演示视频(https://www.youtube.com/watch?v=d8CjoV6kPnY)

很神奇但也很有趣对吗, 那么除此之外是否还有其他方式, 可以破解滚动码的密钥呢? 敬请期待侠盗猎车-玩转滚动码(下)

 

0x03 文献

https://bbs.pediy.com/thread-269716.htm

https://bbs.pediy.com/thread-270069.htm

https://bbs.pediy.com/thread-270866.htm

https://www.cvedetails.com/cve/CVE-2021-46145

 


 


看雪ID:星舆实验室

https://bbs.pediy.com/user-home-937445.htm

*本文由看雪论坛 星舆实验室 原创,转载请注明来自看雪社区



# 往期推荐

1.一种将LLVM Pass集成到NDK中的通用方法

2.人工智能竞赛-房价预测

3.Windows PrintNightmare 漏洞复现分析

4.壳小白关于压缩壳的学习心得及基础实战练习

5.Windows平台下栈溢出漏洞学习笔记

6.GKCTF2021 KillerAid






球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存