无线键盘的安全性分析与探究

一、前期准备

1、硬件部分

1)微软无线键盘

通过对市面上的各类无线键盘调研,以及根据各大电商平台的销售数据,键盘价格等为参考我们选取了微软无线桌面套装800这款键盘作为我们的测试键盘。

2)Arduino 微型控制器

我们使用一个5V Arduino Pro Mini核心板,该板采用Atmel Atmega328P-AU单片机,它有14个数字输入/输出引脚(其中6个可作为PWM输出),8个模拟输入,一个16MHz的谐振器,一个复位按钮,安装孔引脚头,支持串口下载。该核心板价格便宜,性能优越,易于开发,最重要的是它的体积非常之小

3)nRF24L01+——2.4GHz射频芯片

NRF24L01是一款工作在2.4-2.5GHz世界通用ISM频段的单片收发芯片,无线收发器包括:频率发生器 增强型 SchockBurstTM 模式控制器 功率放大器 晶体放大器 调制器 解调器 输出功率频道选择和协议的设置可以通过SPI接口进行设置极低的电流消耗,当工作在发射模式下发射功率为6dBm时电流消耗为9.0mA 接受模式为12.3mA掉电模式和待机模式下电流消耗模式更低。全球开放ISM 频段,最大0dBm 发射功率,免许可证使用。支持六路通道的数据接收。
1.低工作电压:1.9~3.6V低电压工作
2.高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)
3.多频点:125 频点,满足多点通信和跳频通信需要
4.超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线)
5.低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
6.低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。
7.便于开发:由于链路层完全集成在模块上,非常便于开发。自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测—固定频率检测 内置硬件 CRC 检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道标准插针Dip2.54MM间距接口,便于嵌入式应用。这些芯片只能使用专有的协议进行通信,并不意味着易于嗅探,然而我们将在下面看到该款芯片破解的另类方式。

4)HC-05蓝牙模块

数据发送终端我们经过仔细的选择研究,通过比较蓝牙,GSM,wifi,ZigBee等的优缺点以及基于成本的考虑,我们最终采用了HC-05主从一体蓝牙模块作为数据发送终端,该模块易于开发,价格实惠,体积较小,符合我们本项目的开发制作。

5)USB充电器

USB充电器作为我们的电源供应模块,我选择的是一个超小型USB充电器,这样易于隐藏。

2、软件部分

由于使用了nRF24L01芯片以及Arduino控制器,所以在主程序中使用了对应的开源库文件:
1)RF24.h
2)nRF24L01.h
3)RF24_config.h

二、键盘无线协议分析

1)确定无线键盘协议

首先,我们对键盘上的标签说明进行了检查,注意到其FCC ID为C3K1455,网上查阅了资料后了解到FCC ID是美国联邦通信委员会(即FCC)对申请者提交的设备进行审核,如果符合FCC规则的要求则给设备授权一个FCC ID。随后我们发现其通信频率为2403-2480MHZ。显然,这是一个2.4GHz的设备,我们假设它是利用常见的2.4GHz协议,比如像是Wi-Fi,蓝牙,ZigBee,或其他的,亦或是使用专门的协议工作。由于该设备有自己的无线USB软件保护器(加密狗),并且有他专门的FCC ID,所以这表明这个无线键盘使用的是设定专门的协议。
因为他更像是使用专门的2.4GHz,所以我们广泛收集了大量的嗅探2.4Ghz信号的方法,主要有wifi嗅探器、RTL-SDR等。WiFi嗅探器不会有什么帮助,因为这不是802.11协议。另外,RTL-SDR(一款软件定义无线电)本身也不会有帮助,因为它输出功率(caps out)在2.2GHz,除非另外使用RF下变频器,但是这样会使得我们的系统变得更加复杂。

除此之外,查阅网上的资料发现nrf24l01芯片是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。这里我们猜测如果这款键盘使用的是类似nRF24L01芯片,那我们嗅探2.4GHz信号的工具就可以确定下来。因此我们将键盘拆开查看其内部芯片,发现一个单片机控制了所有部分。它的标签是NRF 24LE1H,这听起来很像是一个NRF24L01。在网上搜索该芯片资料,我们很快找到nRF24LE1芯片,发现它其实有与CPU集成(System-on-Chip/SoC)的nRF24L01 +射频芯片。
以下是我们搜索到的该芯片的资料:
nRF24LE1集成了nRF24L01+的2.4GHz射频收发器内核,增强的16MHz 8位兼容8051型CPU,1kB + 256B RAM,16KB的嵌入式闪存,以及广泛的系统外设。
NRF24L01是一个2.4GHz射频芯片,在工作在可选的250kbps或1Mbps或2Mbps ,采用GFSK(高斯频移键控调制是一个数字频率调制/调频)。但是该芯片只提供了接收和发送的功能,而缺少任何直接用于嗅探的模式。为了解决这个问题,我们需要想办法使其可以嗅探到专门的2.4GHZ的信号。
但是我们发现,使用nRF24L01嗅探无线键盘的击键信号的难点在于,我们不仅需要锁定嗅探的频道,还需锁定监听的设备的MAC地址。其原因在于nRF24L01芯片只能将数据包发送至指定的3-5个字节的MAC地址,即我们需要确定在和谁进行通信;此外,当其锁定MAC地址后,不会将MAC地址展示给我们。而我们现在并不知道键盘或者USB接收器的MAC地址。
当nRF芯片发送一个数据包,激活信号的数据包,仅仅1个字节的前导码,代表了即将有信号传来,紧接着是3-5字节的MAC地址报告接收设备,然后是一个选择性的控制包,表明了信号一定的行为,然后是payload,也就是我们能看到的确切数据。这时信号会切断一切包括前导码,以不暴露MAC地址,然而MAC地址又是我们所要的,因为我们需要MAC地址去嗅探。并且所有数据包都有CRC校验,如果要破解这个信号但是CRC不符,芯片会直接丢掉这个包。经过尝试我们发现,如果我们把MAC地址设置成前导码的话就能混淆信号,信号识别了前导码然后要去获取MAC地址,这么做的话MAC地址之后的数据部分会包含MAC地址,也就是原先的数据部分变成了键盘的MAC地址+数据部分。发现不仅把MAC地址设置成前导码可以混淆,把MAC地址设成选择包也可以,通常MAC地址应该为3-5bytes,但发现通过某种方式我们可以把MAC地址设置成2字节,但是如果单纯地这样设置,会导致CRC校验出错,其实我们可以很容易地禁止CRC校验,这样我们就能接收到全部信号。

2)扫描设备策略改进

搜集资料关于扫描设备的方法,我们参考以下几点:
*在频率为2400MHz开始
*将数据传输速率设置为1Mbps,MAC设置为0x00aa,听10秒
*将数据速率设置为2Mbps,MAC设置为0x00aa,听10秒
*将数据传输速率设置为1Mbps,MAC设置为0x0055,听10秒
*将数据速率设置为2Mbps,MAC设置为0x0055,听10秒
*频率依次增加,然后重新开始上面四条,一旦我们到达2528MHz,就会重新置为2400MHz(一共128个频道)
*一旦检测到一个潜在的键盘,只有当有四个合法的数据包才能满足我们的阈值,不然会有许多误报。
我们通过观察FCC,在2403MHz-2480MHz之间,在2.4GHz里其实只有78MHz,而带宽是128MHz,所以我们可以把频率从128MHz降到78MHz用来快速扫描键盘的频率。
这意味着全方位的扫描频率,这会耗时85分钟,因为我们在每个频道上只会监听10s,这意味着至少几个按键必须要在这10秒内被按下。经过反复推敲,我们对上面的方法进行了几点改进:
*我们通过观察FCC,在2403MHz-2480MHz之间,在2.4GHz里其实只有78MHz,而带宽是128MHz,所以我们可以把频率从128MHz降到78MHz用来快速扫描键盘的频率。因此我们只使用2403 - 2480MHz 的键盘,把我们的扫描频道从128减少到78个,大约减少了40%的扫描。
*所有的键盘传输速率都使用2Mbps,削减了一半的搜索。
*在考察更多的键盘后,我发现所有的微软键盘MAC地址都以0xcd开始,它告诉我们,前导码所用的一个字节取决于MAC地址的首字母,因此我们射频前导序列总会是0xAA(10101010),为了保持位交替,射频前导序列0xAA后面总是跟着1位(0xcd 是11001101),这也能使我们削减一半的搜索。
*我们把对每个频道的扫描时间降低到500ms,这样,我们完成一个完整的扫描只需要40s。
*所有的数据包都有某种固定的报头,无论是敲打键盘的包还是另外一种包(idol?Iol?Ill packet?)这两种数据包都有被完全加密的包头,耐心观察我们会发现0xCD总会是MAC地址的第一个byte,所以在我们扫描时我们只需要通过对单个数据包进行观察,就能得知这是不是微软的无线键盘
*我们把对每个频道的扫描时间降低到500ms,这样,我们完成一个完整的扫描只需要40s。一旦发现目标设备的工作频道,它就会将这些写入Arduino设备,这样它就会知道需要去扫描这些频道

3)解密击键

在查阅大量微软无线键盘的资料后我们发现,击键是经过简单加密(异或)的,而且是用ECB模式的MAC地址进行异或。
经过进一步的调查,我发现,因为我们现在知道的所有微软键盘都以 0xCD作为MAC地址的开始,真实的击键(红色字)碰巧也和以 0xCD作为MAC地址的开始对齐。这意味着,即使我们不知道MAC地址,我们任然可以解密击键,由于对齐方式不会改变,并且0xcd总是MAC的第一个字节。
我们前面确定的以CD开头的MAC地址是一位一位地传输的,异或其中的每一位,然后就能得到MAC地址了。这样一来,加密的MAC永远是一样的,因为我们能嗅探所有的东西,也就能解密每一个字节。后来的资料显示,前面我们所解码的以0xCD开头的,也就是MAC地址的开头,如下面的解密示意中显示,其HID 码是05,当我们用C8异或CD时,于是就得到了05,也就得到了按键。问题是所有的按键值总是有一个特殊的解法,而且我们已经知道了所有键盘的MAC都是以CD开头,所以也就不需要用MAC来解密数据包,只需要异或CD就可以了,因为我们知道这是这个数据包的开头,这个解密过程根本不需要MAC地址了。用这个方法能解密整个数据包,或者是按键。
解密方法:
// decrypt those keyboard packets!
void decrypt(uint8_t* pkt)
{
// our encryption key is the 5-byte MAC address and
// starts 4 bytes in (4-byte header is unencrypted)
for (int i = 4; i < 15; i++)
pkt[i] ^= mac >> (((i - 4) % 5) * 8) & 0xFF;
}

三、最终制作

为了起到更好的提醒作用,使人们更加重视无线键盘的安全问题,我们最终决定将整套设备隐藏在一个插线板中,以展示此系统的隐蔽性与高效性。
将我们的装置整合进一个插线板中,就算插线板没有打开电源开关,我们的装置也可以工作,只要插线板插在插座上,我想谁也不会想到在插线板里会有一个记录键盘的装置吧。在无人察觉的情况下,我们的装置会悄悄地记录无线键盘的敲击状态,这就提醒了无线键盘的用户使用的安全性,评估其风险并进行合理的规避。

你可能感兴趣的:(比赛)