前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转Flipper Zero:了解滚动码及其可能的缺陷

玩转Flipper Zero:了解滚动码及其可能的缺陷

作者头像
yichen
发布2024-05-08 15:47:12
1.1K0
发布2024-05-08 15:47:12
举报
文章被收录于专栏:陈冠男的游戏人生

在开始之前先来想一下为什么要有滚动码这个机制,最简单的固定码机制每次发送的信号是不变的,可以录制信号后直接进行重放,来达到与原来的遥控钥匙相同的控制效果。通过一张动态图片感受一下,固定码技术就像是你在附近喊一句:芝麻开门,车门就打开了

这就会出现一个问题,如果有人在附近偷听你喊的是什么,他也那么喊一句,那么他就能打开你的门了。为了解决固定码重放的问题,人们发明了滚动码,每次的信号是变化的,这样哪怕别人听到了你喊了什么,他再去喊一遍也没法打开你的门。同时为了防止使用者误触钥匙导致信号不同步,滚动码也包含同步机制,当接收端发现钥匙发射的信号在未来的序列时,会同步到未来的序列位置

如下图所示,当钥匙背景为黄色时表示不在接收器识别范围内,这时候不小心多按了几次导致钥匙信号不同步也不要紧,接收器会跟未来的信号进行匹配。但是同步也有一个范围,不是说你的信号在序列中离接收端的信号有多远都可以同步,同步的范围称为窗口,例如窗口为 16,当前接收端序列在 3,你发送一个大于 19 的信号接收端也不会同步

上图中传递的信号仍然是明文的,如果有人多次录制信号并分析,可能找出信号滚动的规律,从而自己生成一段信号用来攻击,所以后面又引入了伪随机数生成器与加密等技术,这样滚动序列就是一串攻击者没有密钥的情况下无法分析的序列了

Security+1.0

那与技术发展对应,我们先来看一个滚动但是没加密的例子,这个协议在 Unleashed firmware 固件中叫:Security+1.0,在官方固件中叫:LiftMaster,是 liftmaster.com 这家公司自己的协议,相关专利:

代码语言:javascript
复制
https://patents.google.com/patent/US6980655B2

目前他们还在推 security+2.0,相关专利:

代码语言:javascript
复制
https://patents.google.com/patent/US20110317835A1

接下来实际操作一下,来到 SubGHz 这个 APP,通过 Add Manually 添加一个 Security+1.0 433MHz 的信号,填写好名字直接保存,在 Saved 中选择创建的 Security+1.0 433MHz 的信号,点击 Emulate 进入信号发射界面,PC 端使用 HackRF 和 URH 录制信号并保存这个信号

再使用 SubGHz 的 Read 功能接收 HackRF 的重放,可以看到成功识别到了 Security+1.0 信号

按 OK 键选择这个信号可以直接进入模拟界面,进行发射或保存信号,同时 Cnt 这个计数器已经自动增加了

我们来详细分析一下这段信号的含义,整个信号数据实际是以三进制组织起来的

Key 就是传输的主要内容了,可以将其拆开,分为两部分

代码语言:javascript
复制
63A5EB6D
E6000044

前面的 63A5EB6D 是固定不变的,转为三进制是:

代码语言:javascript
复制
11022111211011021122

其中后三位分别是:

代码语言:javascript
复制
id1(表示是否发送 PIN 码):1
id0(含义未知):2
Btn(1 表示左,0 表示中间,2 表示右,与 Sw_id 是同一个值):2

剩下的前面的部分是设备序列号

代码语言:javascript
复制
Sn:11022111211011021 = 0x3B0CFD4

后面的 E6000044 就是计数器了,每次发送,就只有 Cnt 在变化

因此这个协议只是单纯的让信号滚动起来了,如果有攻击者多次录制信号,可以找到其中的规律,从而自己编辑下一次信号

KeeLoq

在滚动码机制中,最常听的是 KeeLoq,但是其实各家实现的方式也有所不同,我们这里以 DoorHan 这家公司的协议为例,整个数据 64bit 的

代码语言:javascript
复制
C02F91572A68F314

想要解析这些数据首先需要转为二进制然后翻转

C02F91572A68F314 转为二进制序列为:

代码语言:javascript
复制
1100 0000 0010 1111 1001 0001 0101 0111 0010 1010 0110 1000 1111 0011 0001 0100

反转二进制序列得到(老外将原来的序列称为 Key,反转后的称为 Yek 哈哈哈):

代码语言:javascript
复制
0010 1000 1100 1111 0001 0110 0101 0100 1110 1010 1000 1001 1111 0100 0000 0011

将反转的序列转为十六进制得到:28CF1654EA89F403,将该值拆分为两部分:28CF1654 和 EA89F403

其中 28CF1654 是固定的,前面的 2 是 Btn,后面的内容是序列号 Sn:8CF1654

EA89F403 是滚动的部分,这部分被加密了只有通过厂商的 key 才能解密,好在 flipper 是知道这个 key 的,可以看到上图中成功识别了 Cnt,并且你每次发射信号他也会增加

滚动码缺陷

简单介绍了滚动码机制后,接下来我们来借助 rolling flaws 这个 APP,看一下在具体滚动码协议实现上,各家自己实现的滚动码机制可能会出现什么缺陷,接下来将左边的设备称呼为 flipper1 作为攻击设备,右边的设备称为 flipper2 作为被攻击设备及其射频钥匙

Subghz Rolling Flaws 这个 APP 有几个选项

代码语言:javascript
复制
Config 用来配置 APP 的设置,每次重启都会重置配置
Reset count 0 用来将滚动码的计数器回滚到 0
Transmit Signal 用来发射信号
Receive Signals 接收信号界面,会显示出是否解锁
Sync Remote 使用远程信号同步配置
About 有关应用程序的信息

在配置中主要关注

代码语言:javascript
复制
调节频率(Frequency)
协议(Protocol)
固定码部分(Fix [SN+Btn])
是否允许重放攻击(Replay attack)
Window [next] 表示当前多少个滚动码序列后仍然可以解锁(例如当前设备滚动码序列为 2,Window [next]=3,那么滚动码序列 3、4、5 都可以解锁设备)
Window [future] 表示从现有的计数多少属于未来的计数序列序列
Window [gap] 表示两个计数之间要多近才会被认为是有效的

重放攻击

虽然是滚动码,但是有些设备确实收到已经过期的信号后仍然会有效,这纯属实现的问题

flipper1 进入Sub-GHz 中使用 Read RAW 监听信号,flipper2 在 rolling-flaws 的 Config 选项中设置 Replay Attack 为 Yes,将设备切换至可受重放攻击的状态

点击 flipper2 的 Transmit Signal 模拟设备遥控器发射信号,flipper1 捕获到信号

随后 flipper2 回到 Receive Signals 此时 flipper2 屏幕上显示 CLOSED!表示设备未解锁

按下 flipper1 的确认键发送刚刚捕获的信号,flipper2 接收到信号显示 OPENED!表示设备已解锁同时显示解锁原因是 REPLAY

克隆攻击

此种攻击仅限于你知道该协议的构造,并且知道制造商密钥,像 flipper 就包含了像 Security+1.0、DoorHan 这些国外常见车库门的滚动码协议及制造商密钥,所以它能够直接解码并找到其中滚动码计数部分,还可以随着你发送的次数自动增加计数器

flipper1 进入到 Sub-GHz 的 Read 选项进入监听状态,重启 flipper2 的 rolling-flaws APP 使其恢复到初始状态,然后按下 Transmit Signal,此时 flipper1 收到滚动码信号并解析

flipper2 进入 Receive Signals 界面,此时 flipper1 选中这个信号选择发送,flipper2 的界面上仍然显示 CLOSED!因为我们重放的是已经发过的信号,不允许重放后自然是解不开的

但是当你再次使用 flipper1 发送信号时 flipper 会自动帮你将计数器加一,这时候 flipper2 屏幕上就将显示 OPENED!了,可以看到理由是 NEXT 说明是正常的滚动码发送序列中的下一个代码

回滚攻击

前面提到,为了防止用户不在接受其范围内不小心按下了遥控器导致滚动码不匹配,接收器在收到一个在窗口(Window [next])范围内的信号时会将自己的序列同步到该信号的位置

例如 flipper2 的滚动码序列此时已经到 4 了

当 flipper1 发送滚动码序列为 0xB 的时候即使不匹配仍然可以解锁设备,这说明 0xB 目前仍然在滚动码序列的窗口内(在 Config 中可以看到目前设置为 16)

还有一种同步机制是,如果你能连续发送几个相邻的信号,那么即使你不在 Window [next] 范围内,在 Window [future] 范围内也是可以同步信号的,但是我们说的这种回滚攻击他的 Window [future] 实际没有做限制,即使是已经用过的几个相邻的信号也可以被同步,实际效果是整个接收器的滚动码序列回滚到了之前的,因此称为回滚攻击

之前星舆实验室对本田汽车进行的测试就是这种攻击,参考:

代码语言:javascript
复制
https://rollingpwn.github.io/rolling-pwn

接下来通过 flipper 简单的复现一下这个过程,首先将 flipper2 的 Window [future] 设置为 ALL,这样哪怕是已经使用过的信号也会被认为是未来的滚动码序列

将 flipper1 切换到 Read RAW 记录原始信号,将 flipper2 的信号多发射几次,我们录下前两次信号,正常情况下重放必然是不成功的,因为已经属于用过的信号了

但是当我们使用 flipper1 重放第一个的时候,flipper2 的屏幕上显示的是 FUTURE,表示接收端识别到这是一个在未来序列的信号

在发送第二个信号时便显示 OPENED!了,这种攻击方式不需要去解码信号,直接录制原始无线信号即可

屏蔽重放攻击

这种攻击方式很容易理解,当发射端发射信号时攻击者发送干扰信号,使接收端收不到该信号,但攻击者记录下这个信号后再进行重放

后话:跟很多师傅讨论过这个小玩意到底有啥用,看着好像集成了很多功能,但是很多功能都有比它强很多的专用设备,感觉没什么地方用。我在和别人介绍它的时候也说就是个玩具😂那为啥加拿大、澳大利亚都说这设备可能被用来做坏事呢

前些天与朋友吃饭,聊起国外的时候突然灵光一闪,这东西在国外那么火,有没有可能是因为人家真的能用上哇!像是这篇文章我们就可以看到,flipper 里面集成了很多国外车库门滚动码的制造商密钥,在写这篇文章的时候关注的一个国外的博主,他介绍 flipper 的时候直接拿出了三四个不同的车库门接收器来作为目标,他们会希望把多个射频钥匙集中在 flipper 这个设备上,这样只带一个 flipper 就够了

既然能用来做正常的射频钥匙,当然也可以用来做坏事,那有没有人重放车库门信号偷东西咱就不得而知了,但是关注的车联网安全事件中,像是撬开车大灯注入 CAN 指令开车门、背个包举着天线中继信号偷车等等,国内你看看谁敢干

所以有时候不要总是找自己的原因,可以抱怨一下大环境哈哈哈哈

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档