KEYSWEEPER // SIGINT // SAMY.PL // REL TO ALL // APPLIED HACKING
KeySweeper 是一款隐蔽的基于 Arduino 的设备,伪装成一个可正常工作的 USB 墙式充电器,能够以无线方式被动嗅探、解密、记录并(通过 GSM)回传附近任何微软无线键盘的所有按键输入。
所有按键都会在线和本地记录。当输入触发词、用户名或 URL 时,设备会发送 SMS 警报,从而暴露密码。如果被拔出电源,KeySweeper 仍会依靠内置电池继续运行,并在重新通电后自动充电。基于 Web 的工具支持实时按键监控。
联系方式: @SamyKamkar // [email protected] // http://samy.pl
**发布日期:**2015 年 1 月 12 日
源代码 / 原理图: https://github.com/samyk/keysweeper
**单价:**10 - 80 美元,取决于具体配置
**状态:**可运行、开源、开放硬件、已公开。
KeySweeper 是一款隐蔽的基于 Arduino 的设备,伪装成一个可正常工作的 USB 墙式充电器,能够以无线方式被动嗅探、解密、记录并回传区域内任何微软无线键盘(使用专有的 2.4GHz RF 协议)的所有按键输入。
按键记录可通过可选的 GSM 芯片经互联网回传给 KeySweeper 操作者,也可以存储在闪存芯片上,当另一台 KeySweeper 设备进入目标 KeySweeper 的无线范围时,再以无线方式提取。基于 Web 的工具支持实时按键监控。
KeySweeper 能够在用户输入特定按键内容(例如 „www.bank.com“)时发送 SMS 警报。如果 KeySweeper 被断开交流电源,它看起来像已关机,但实际仍会使用内置电池秘密运行,并在重新接通交流电源后自动充电。
KeySweeper 扩展了 Travis Goodspeed 的 goodfet.nrf 项目以及 Thorsten Schröder 和 Max Moser 的 KeyKeriki v2.0 项目的研究成果。
3 - 30 美元:可以使用 Arduino 或 Teensy 微控制器。在我的制作中,我使用 3.3v 的 Arduino Pro Mini,因为它的外形非常薄。
1 美元:我使用的是一块 1 美元的 nRF24L01+ 射频芯片,它通过 2.4GHz 频段上的 GFSK 进行通信。更多细节见下文。这类芯片在 eBay 上最低仅需 1 美元即可买到。这些芯片只能使用专有协议进行通信,并非为嗅探而设计,不过我们将在下文看到,可以通过巧妙的方式将其用于混杂模式嗅探。
6 美元:我使用一个廉价的 AC USB 充电器(整流器),将交流电转换为 5V 直流电。我链接的这款恰好有一颗螺丝,打开起来很方便(在打开的过程中我已经弄坏了好几个其他充电器)。如果使用 KeySweeper 的 GSM 版本,我实际上会使用两个 USB 充电器——一个小充电器(类似 iPhone 充电器)的内部元件,加上一个较大 USB 充电器的外壳。
可选(2 美元):可以使用可选的 SPI 串行闪存芯片 来存储按键记录。如果使用下面的 FONA GSM 扩展板,则不需要此芯片,因为按键记录可以通过互联网实时存储;但如果你希望采用更便宜的方式,可以将按键存储在 KeySweeper 内的这块芯片上,之后用另一台设备进入该设备的 2.4GHz 无线范围内,从中提取按键记录。
大多数微控制器的内存或 EEPROM 都非常有限,难以存储数据,因此使用闪存芯片来保存这些按键记录具有明显优势。
可选(45 美元):Adafruit 制作了一款名为 FONA 的扩展板,可让你使用 2G SIM 卡直接通过设备发送/接收短信、拨打电话和使用互联网。
使用此方案时无需闪存芯片,因为按键记录会立即发送到后端服务器进行数据采集。此外,如果目标键盘输入了特定关键词,设备会向指定号码发送短信,提醒操作人员这一情况。
可选(3 美元,仅在使用 FONA 时需要):FONA 需要 mini-SIM 卡(而非 micro-SIM)。我使用的是 T-Mobile 预付费 SIM 卡。我建议使用 T-Mobile,因为他们支持 2G,而大多数其他运营商已经或正在淘汰其 2G 网络;FONA 的互联网功能仅支持 2G。请确保购买正确尺寸的 SIM 卡——更多详情请参见这里的 FONA SIM 卡要求。
可选(5 美元起,仅在使用 FONA 时需要):FONA 提供板载 LiPo/LiOn 电池充电功能;当 KeySweeper 连接交流电源时,电池会保持充电状态,但它仍然是必需的。此外,当 KeySweeper 被拔掉交流电源后,它会依靠电池继续隐蔽运行,并在重新接通交流电源后开始充电。
KeySweeper 的完整源代码可以从我的 github 上获取:https://github.com/samyk/keysweeper
KeySweeper 由多个部分组成。主要代码安装在微控制器上,而使用 jQuery 和 PHP 的 Web 后端会记录所有按键,并提供用于实时监控目标键盘的 Web 界面。
KeySweeper 还需要来自 maniacbug 的 RF24 库 的以下文件:
RF24.hnRF24L01.hRF24_config.h只需将这些文件复制到 keysweeper_mcu_src 目录中。你还需要修改 RF24.h 文件中的 #include 语句,将其从 #include <RF24_config.h> 改为 #include "RF24_config.h"。
你应该使用我版本的 Adafruit FONA 库,因为我增加了一个额外选项,让 FONA 在有新短信时通知我们。在原始库中,你必须不断轮询,以检查是否有比预期更多的短信;而使用我的版本,你可以启用 fona.setSMSInterrupt(1) 选项,该选项会在收到新短信时让 RI(振铃中断)引脚短暂拉低。
我创建了一个后端工具,让你可以通过网页实时监控键盘。jQuery Terminal 插件让它看起来更酷。
jQuery UI Virtual Keyboard 让 KeySweeper 的实时间谍界面工具继续显得很酷,当用户实际按键时,虚拟键盘上的对应按键会显示被按下。
当我们拿到一个微软无线键盘时,可以查看其背面的 FCC ID。在我的键盘上,FCC ID(美国所有使用无线电频率的设备都必须具备)为 C3K1455,我们可以很容易地在 FCC 网站 上搜索到它。
根据 FCC 报告,我们立即发现该键盘在 2403 - 2480MHz 频段上通信。
既然知道这是 2.4GHz 设备,我推测它要么使用常见的 2.4GHz 协议(如 wi-fi、蓝牙、zigbee 或其他),要么使用专有协议。由于该设备自带 USB 接收器(拥有自己的 FCC ID,C3K1461),因此它更有可能是专有的 2.4GHz 信号。
由于它很可能是专有的 2.4GHz 信号,我们现在需要采用某种 2.4GHz 嗅探方法。Wi-Fi 嗅探器帮不上忙,因为这不是 802.11(例如我们在 SkyJack 中使用的方法);RTL-SDR 本身也没用,因为它的频率上限约为 2.2GHz,除非额外使用射频下变频器(我们在 Digital Ding Dong Ditch 中使用了 RTL-SDR)。因此我立刻想使用 HackRF,这是一种功能强大且廉价的软件定义无线电;不过,尽管它性价比极高,我们也许可以用更便宜的硬件来实现。
根据以往经验,我推测键盘使用的是类似 Nordic nRF24L01+、TI CC2500 或 Cypress CYRF6936 的芯片,但不进一步检查我们无法确定。
拧下键盘上的螺丝并将其打开后,我们看到一颗芯片负责所有工作。它标注为 NRF 24LE1H,听起来很像 nRF24L01(n=Nordic Semiconductor,RF=Radio Frequency 射频,24=2.4GHz)!我们很快通过搜索找到了 nRF24LE1 芯片,发现它实际上将 nRF24L01+ 射频芯片与 CPU 集成在一起(片上系统/SoC)。再快速在 eBay 上搜索,可以看到 nRF24L01+ 不到 1 美元就能寄给我们。
The nRF24LE1 integrates an nRF24L01+ 2.4GHz RF transceiver core, enhanced 16MHz 8-bit 8051 compatible CPU, 1kB + 256B RAM, 16kB embedded Flash, and a wide range of system peripherals
查看 nRF24L01+ 数据手册,我们会发现这是一款 2.4GHz 射频芯片,支持 250kbps/1Mbps/2Mbps 速率,使用 GFSK(高斯频移键控调制是一种数字频率调制/FM)。遗憾的是,它没有任何合法的混杂模式或直接模式可用于嗅探……真的没有吗?
虽然我通常会拿出像 HackRF 或带数字下变频器的 RTL-SDR(以便将 2.4GHz 降到 RTL-SDR 的范围内),但如果我们能用更便宜的硬件进行嗅探,那就太好了,因为最终我想把所有东西封装成一个可以留在现场的装置。
经过简单搜索,我找到了 Travis Goodspeed 的精彩页面。他不仅嗅探了一款类似的键盘(Microsoft Comfort Desktop 5000),还演示了如何使用他的 GoodFET 设备和装有 goodfet.nrf Python 应用程序的主机,将 nRF24L01+ 变成 2.4GHz 嗅探器。
Travis 发现,传统上使用该设备进行嗅探非常困难,因为你不仅要指定要监听的频道(频率),还必须指定要监听的 MAC 地址。nRF 芯片只会传送发送到该特定 MAC 地址的数据包。此外,nRF 芯片不会告诉你 MAC 地址,因为你已经指定了它(它被假定位于数据手册中的某个 RX_ADDR_P[0-5] 管道中)。
然而,Travis 发现,在指定 MAC 长度时,数据手册中有一个被视为“非法”的选项(SETUP_AW, 0x03 set to 00),但它实际上将 MAC 设置为 2 字节!另外,通过将 MAC 设置为通常在前导码中会出现的数据(0x00AA 或 0x0055,二进制为 0000000010101010 或 0000000001010101),我们可以欺骗设备提前交出数据包,从而在数据部分为我们提供完整的 MAC 地址!阅读他的精彩文章了解全部细节。
虽然我们可以在测试期间使用 GoodFET、计算机和 nRF24L01+ 进行嗅探,但我们最终希望将其放在一个廉价的嵌入式设备上。我们可以借鉴 Travis 在 Python 方面的优秀成果,并将其移植到嵌入式 C 语言中,以便加载到微控制器上,而不再需要计算机 + GoodFET。
此外,我们还实现了几项改进。Goodfet.nrf 提供了一种扫描设备的方法,具体操作如下:
这意味着要扫描全部频率范围,大约需要 85 分钟,而且至少要在正确的 10 秒监听窗口内按下几次按键。在研究了 Travis 的研究及其键盘、KeyKeriki 的研究及其键盘,以及我自己的键盘之后,我们可以实现以下几项改进:
0xAA (10101010),因为 0xAA 前导码后面总是跟着一个 1 比特(0xCD 即 11001101),以保持比特交替,这又使搜索时间减半Thorsten Schröder 和 Max Moser 展示了一款出色的设备 KeyKeriki,它能够嗅探微软键盘,并且完整逆向工程了其解密过程,还制造出了相应的设备。不过 Travis 指出,他们的设备需要两个无线电模块和一个高端微控制器,才能以键盘通信的 2Mbps 速度捕获和解析数据包。Travis 的项目同样出色,但它需要一台主机,而且体积太大,不适合我们的隐蔽部署。在本场景中,我们对这些设计进行了改进,只需要一个廉价的无线电模块和一个微控制器,两者功耗低、体积小,无需计算机或高级无线电设备。
Thorsten 和 Max 发现,按键数据只是使用 MAC 地址按 ECB 模式 进行了异或“加密”;而借助 Travis 滥用 nRF24L01+ 来同时嗅探和揭示 MAC 地址的方法,我们就能嗅探到这些数据。这种“加密”就相当于把一副牌切一次,然后就说它已经洗好了。
经过进一步调查,我发现,既然我们现在知道所有微软键盘的 MAC 地址都以 0xCD 开头,那么实际的按键数据(下图中橙色部分)恰好与 MAC 地址的第一个字节(0xCD)对齐。这意味着即使我们不知道 MAC 地址,也能解密按键数据,因为这种对齐关系永远不会改变,且 0xCD 始终是 MAC 的第一个字节。
另一个发现是:由于数据包中加密部分的长度为 11 字节,MAC 为 5 字节,而 CRC 是每个字节与另一个字节异或的结果(在加密之前),于是发生了一些有趣的事情。由于 MAC 被异或了两次,我们无需知道 MAC 地址也能计算出校验和。这是因为 MAC 地址在其中完整出现了两次,而任意数与自身异或(即 MAC 与 MAC 异或)会相互抵消。第 11 个字节又是 MAC 的第一个字节,我们始终知道它是 0xCD。这使我们能够执行其他攻击,例如在仍然不知道 MAC 地址的情况下修改按键数据和 CRC。我将在未来的项目中展示这一点以及其他一些有趣的演示。
KeyKeriki 演示文稿中的一页展示了解密过程:
我们在 KeySweeper 源代码中实现的解密方法:``` // 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; }
# (U) 构建/篡改 USB 充电器
**警告:连接到交流电源的设备使用高压电,而我们正在创建的这种连接到交流电源的设备并不安全,也不符合典型的电气安全标准。这是一种危险的设备,如果使用或制作不当,可能导致死亡、火灾或其他严重损害。除非你知道自己在做什么,否则不要构建交流供电设备。如果你想继续构建此设备但不想使用交流电源,只需使用电池或直接通过 USB 为设备供电,即可安全地继续操作。**
KeySweeper 使用极低功耗且外形小巧的硬件,以尽可能保持隐蔽。KeySweeper 可由电池或约 3-20V 直流电源供电。由于我们希望 KeySweeper 始终通电,我们将其隐蔽地安装在一个看似无害的墙壁 USB 充电器内,这种充电器预计会一直插着。
如果 USB 充电器被拔掉,KeySweeper 会使用其(可选的)内部电池隐蔽地继续工作。一旦 KeySweeper 重新插上电源,它就会切换回使用交流电源,并同时为电池充电。
如果你只是在不带 GSM 板的情况下构建 KeySweeper,你可以将所有东西装进一个典型的交流 USB 墙壁充电器中。我建议找一个用螺丝固定的充电器,因为大多数其他充电器都是密封的,需要破坏设备的某些部分才能打开。
[](http://samy.pl/keysweeper/usbopen.jpg)
如果你决定使用 GSM 板,我发现它无法与其余电子元件一起装进这种类型的 USB 充电器中。不过,我发现打开一个较小的 USB 充电器(类似于 iPhone USB 充电器)后,我们会找到一个更小的整流器(交流电->直流电)和降压转换器(高电压->5V),它允许我们将**所有**电子元件装进较大的 USB 充电器中。
[](http://samy.pl/keysweeper/usbcharger1.jpg)
[](http://samy.pl/keysweeper/usbcharger2.jpg)
我的好友 Dana 把她的洋娃娃烙铁借给了我。我不太明白她用它做什么,但它是一把带有可拆卸刀片的烙铁。这对于切割塑料和洋娃娃(我猜想)非常有用。我一解释这个设备会做什么,她就把烙铁拿回去了。显然她不支持这个行为,虽然我不确定为什么。我相信等我嗅探到她键盘的更多按键后,就会知道了。
[](http://samy.pl/keysweeper/usbcharger3.jpg)
[](http://samy.pl/keysweeper/usbchargeropen.jpg)
**警告:再说一次,因为我们面对的是交流电,所以这非常危险。除非你知道自己在做什么,否则不要打开/重新接线任何交流供电设备。** 你仍然可以通过简单地使用 USB 充电器、端口或电池为所有东西供电来构建 KeySweeper,而无需改装基于交流电的设备。
同样重要的是,通过 RAW 端口将我们的 Arduino 连接到 5v USB 电源,并确保极性正确(负极接 GND,正极接 RAW)。在这种情况下,我使用的是 3.3v Arduino Pro Mini。RAW 端口接受 3.35-12v 之间的非稳压电压,并使用板载稳压器将其降至 3.3v。请注意,我们的 nRF24L01+ 芯片需要 1.9-3.6v,所以给它 5v 是**太高了!** 此外,如果你使用像 [SST25VF016B](http://ww1.microchip.com/downloads/en/DeviceDoc/S71271_04.pdf) 这样的 SPI 芯片,它需要 2.7-3.6v,所以同样,使用 5v 也是**太高了!** 请务必使用 Arduino 输出的稳压 3.3v(来自 3.3v Arduino 的 VCC 引脚,或 5v Arduino 的 3V3 引脚)。
[](http://samy.pl/keysweeper/multimeter.jpg)
*注意:万用表旁边图片中的 USB 板是我决定将其换成一个更小的版本以同时容纳 GSM 板之前的原始板*
在拿到所有硬件后,我们可以看到它们都能装进我们的充电器中,而且还留有空间(布线之前):
[](http://samy.pl/keysweeper/testingsize.jpg)
为了好玩,我把充电器的 LED 接到了 Arduino 的引脚 6 上,虽然 LED 看起来行为与之前相同,但实际上我让它在嗅探到按键时闪烁。这很可能会暴露你的身份,但看起来真的很有趣。我还确保在交流电源断开时 LED 会熄灭,即使设备的其余部分继续由内部电池供电。
我们还要确保 USB 充电器的其余部分保持可用,以便其他设备能继续从 USB 充电器获得电力。

-----
# (U) 可选的辅助 KeySweeper
如果你希望放弃 GSM 板以降低成本,你可以创建一个仅包含 Arduino 和 nRF24L01+ 的辅助 KeySweeper 设备。在编译辅助设备时,取消注释 `#define BACKTRACER 1`。
其工作原理是:如果辅助 KeySweeper(BACKTRACER)一旦进入第一个 KeySweeper 的无线距离内(使用 2.4GHz nRF24L01+),它会自动检测到第一个设备的存在,然后初始 KeySweeper 设备会将其日志转储到 BACKTRACER。两个 KeySweeper 都内置了自动检测功能,因此它们能快速找到彼此,这要归功于 nRF24L01+ 支持多个 RX 管道的能力。
如果你将 BACKTRACER 连接到计算机,按键日志会被转储到串口,你可以通过串口发送 'E' 命令来擦除原始 KeySweeper 的 SPI 闪存芯片内容,现在你已经获取了其中的内容。你可以离开,让原始 KeySweeper 继续记录按键。
-----
# (U) 原理图
点击查看大图(基于 FONA 的原理图),或 [点击此处](http://samy.pl/keysweeper/keysweeper.fzz) 获取 Fritzing 文件。
[](http://samy.pl/keysweeper/keysweeper2_schem.png)
-----
# (U) 联系方式
**联系人:** [@SamyKamkar](https://twitter.com/samykamkar)
你可以在 <http://samy.pl> 查看我的更多项目,或通过 <[email protected]> 联系我。