无线混杂模式嗅探器项目:深入解析键盘鼠标漏洞与安全攻防

本文详细介绍了基于Nordic nRF24L系列芯片的无线键盘鼠标安全漏洞,涵盖混杂模式嗅探原理、密钥注入攻击技术、Logitech Unifying协议分析,以及低成本嗅探器硬件构建与代码实现,旨在帮助安全研究人员深入理解无线HID设备的安全风险。

无线混杂模式嗅探器项目

作者:Ray Felch
2020年5月27日

引言

在完成并记录最近的键盘注入攻击研究(《执行键盘注入攻击》)后,我对所使用的工具和脚本(由多位作者和安全研究专业人员创建)的深入技术细节产生了浓厚兴趣。特别是,我希望创建自己的软件/硬件实现这些漏洞利用,而不是盲目执行和接受他人的工作。

显然,这项努力需要深入研究一些非常著名的信息安全研究人员的工作,如Travis Goodspeed(GoodFet 2009)、Marc Newlin(Bastille Research – MouseJack 2016)、Samy Kamkar(KeySweeper 2015)、Marcus Mengs / Rogan Dawes(Logitacker 2019)、Darren Kitchen(Ducky Scripts – Hak5)、phikshun / infamy(JackIt insecurity of Things 2017)以及Thorsten Schröder / Max Moser(KeyKeriki 2010)。

通过以这种方式接受挑战,我的意图是创建一个“全面”且文档齐全的HID(人机接口设备)漏洞利用多方面账户,让其他人也能从我在途中发现的内容中受益。

研究信息

Nordic Semiconductor

绝大多数用于键盘、鼠标、演示点击器等设备的无线(非蓝牙)接收器基于传统的Nordic nRF24L系列嵌入式硬件芯片。Nordic收发器中使用的ESB(Enhanced Shockburst)协议允许双向数据包通信,支持数据包缓冲、数据包确认和丢失数据包的自动重传。

Nordic无线电在2.4GHz ISM频段(2.4 – 2.525GHz)上运行,使用GFSK调制,提供250kbps、1Mbps或2Mbps的波特率,通常以4dBm传输(但能够达到20dBm功率)。nRF24L01+收发器使用1MHz的信道间隔,产生125个可能的信道。

Nordic收发器能够在6个管道(节点)上接收,并在1个管道上传输。它们能够同时在所有6个管道上接收,但一次只能监听一个信道。

注意: 必须知道目标设备的地址才能从远程设备读取和写入数据。所有配置和数据传输都通过SPI(串行外设接口)使用FIFO(先进先出)缓冲区处理。

Nordic的Shockburst数据包协议

注意,地址字段定义为3到5字节(通常为5)。

混杂模式嗅探

有趣的是,Travis Goodspeed在2011年发现,尽管Nordic nRF24L收发器芯片组官方不支持数据包嗅探,但存在一种伪混杂模式,能够嗅探各种设备传输的数据包子集。这是通过忽略Nordic关于地址限制为3-5字节的规范来实现的。

意识到两位定义了地址大小,Travis将地址设置为非法的零值并获得字节匹配。通过禁用CRC(校验和),他获得了大量误报数据包,然后可以通过手动计算和确认校验和来检查其真实性。显然,如果没有分配特定地址来监听,这种方法会产生大量流量,包括由于背景噪声导致的错误数据包。后来,Travis创建了他的goodfet.nrf autotune脚本,显著改进了MAC地址和信标的识别。Travis的研究扩展了KeyKeriki v2.0项目(2010)的Thorsten Schröder和Max Moser的工作。

注意: 尽管所有使用Nordic nRF24L系列无线电的供应商(Microsoft、Logitech等)都遵循相同的ESB数据包协议规范,但这些供应商定义其特定有效载荷和硬件交互的方式差异巨大。有些使用明文通信,没有加密。其他供应商对其键盘流量使用加密,但鼠标保持明文等。

Thorsten Schröder和Max Moser构建了一个基于NXP LPC17 Arm Cortex-M3微控制器和SDR(软件定义无线电)固件的硬件设备。他们的设备采用了两个不同的Nordic无线电收发器模块。为了成功传输、接收和解析供应商数据包,他们需要分析内容并尝试查找和确定任何加密(加密算法)、使用的序列计数器,并找到校验和算法(传输必需)。他们的KeyKeriki项目为其他研究人员奠定了基础。

Thorsten Schröder和Max Moser确定Microsoft键盘数据包的头部是明文,有效载荷的其余部分使用设备地址作为密钥与数据进行XOR加密。

Microsoft键盘加密示例

2016年,Marc Newlin(Bastille Research – Mousejack / Burning Man)在一些知名供应商设备(Microsoft、Logitech、HP、Dell、Lenovo、AmazonBasics)的漏洞方面取得了一些重要发现。参见:受影响设备列表

与他的研究相关,Marc Newlin指出: “Crazyflie是一种开源无人机,由称为Crazyradio PA的放大nRF24L基加密狗控制。”参见:Crazyflie 2.0 “这相当于通常用于无线鼠标和键盘的USB加密狗的放大版本。修改Crazyradio PA固件以包括伪混杂模式支持,使得将数据包嗅探和注入功能提炼为最小量的Python代码成为可能。”

键盘注入攻击如何可能?

无线鼠标和键盘使用专有协议在2.4GHz ISM频段进行通信。与蓝牙不同,没有行业接受的标准可遵循,供应商需要实施自己的安全方法。这些设备之间的无线通信通过向连接到用户笔记本电脑或台式计算机的接收器加密狗传输射频数据包来完成。当用户按下键(或移动/点击鼠标)时,动作被传输到加密狗。加密狗监听这些配对设备发送的射频数据包,并在动作发生时通知计算机。加密狗以USB HID(人机接口设备)数据包的形式提交此信息。

为了防止窃听,许多供应商加密其键盘的传输流量。加密狗知道键盘使用的加密密钥,并能够解密数据以确定所传达的动作。没有此密钥的知识,攻击者将无法访问明文数据或知道正在键入的信息。

Marc Newlin(Bastille Research)发现,所有测试的鼠标都没有使用任何加密技术。这意味着鼠标传输的明文数据包可以被攻击者冒充鼠标进行欺骗。Marc Newlin还发现,由于某些加密狗处理接收数据包的方式,实际上可以用 specially created keystroke packets 代替鼠标移动和鼠标点击进行传输。在某些情况下,他发现协议弱点允许攻击者向加密狗生成看起来真实的加密数据包。

在Marc Newlin的研究过程中,还确定了一些键盘和鼠标在没有任何加密的情况下进行通信。这种缺乏加密协议的情况不提供任何安全性,允许攻击者注入恶意击键,以及嗅探用户键入的击键。

使用Crazyradio PA加密狗,可以嗅探发送到加密狗的无线键盘和鼠标流量,然后在计算机上转换为USB HID数据包。这些HID数据包可以通过在Linux上启用usbmon内核模块来嗅探,从而显示按下键的HID代码。然后可以分析捕获的RF数据包与生成的HID数据包,以确定供应商特定的协议。

Logitech Unifying接收器

Unifying是Logitech无线鼠标和键盘广泛使用的专有协议。Logitech对Unifying协议的主要关注点是能够将多达6个兼容键盘和鼠标连接到一台计算机,使用单个Unifying接收器 – 并忘记多个USB接收器的麻烦。大多数Unifying加密狗使用Nordic nRF24L收发器,其余设备使用Texas Instruments CC254x收发器。所有设备在无线方面兼容,无论底层硬件如何。

Bastille研究团队确定所有Unifying数据包使用5、10或22字节的ESB有效载荷长度。除了ESB数据包提供的2字节CRC外,Unifying数据包还使用1字节校验和保护。

Unifying击键数据包使用128位AES加密,使用配对过程中生成的密钥。团队不知道特定的密钥算法,但他们能够演示加密击键注入,而无需知道密钥。

加密狗始终在接收模式下运行,所有配对设备在传输模式下运行。加密狗无法主动传输到配对设备,但它使用ACK有效载荷向设备发送命令。

信道跳频

当设备首次打开时,它向其配对的加密狗地址传输“唤醒”数据包。这导致加密狗开始监听发送设备的地址。为了快速响应不良信道条件,设备向加密狗发送周期性的“保持活动”数据包。如果错过“保持活动”数据包,设备和加密狗都会移动到新信道。周期性时间间隔由设备设置。保持超时间隔较短可提高稳定性(较少信道变化),但以高功耗为代价。为了更好地确保可靠注入,建议保持超时间隔短于目标设备通常使用的时间。

配对

主机软件通过USB启用配对模式。一旦启用,加密狗在固定配对地址BB:0A:DC:A5:75上监听新配对设备,持续30-60秒。并非所有Unifying加密狗上的固件都可以更新,因此需要保持配对过程通用以实现向后兼容性。当设备首次打开时,它将尝试使用“唤醒”数据包重新连接到其配对的加密狗。如果找不到配对的加密狗,它将向固定配对地址传输配对请求以启动配对。

Mousejack设备发现和研究工具

Bastille Research提供访问他们用于研究可利用设备的一些工具。https://github.com/BastilleResearch/mousejack 特别是,我发现nRF24_scanner.py和nRF24_sniffer.py Python脚本在我自己的研究中非常有用。

其他贡献者

在我对这个项目的广泛研究过程中,我经常发现自己跟随其他研究人员及其击键注入技术实现的工作。特别是,我想向phikshun / infamy(JackIt Insecurity of Things)致敬。在我之前的博客《执行键盘注入攻击》中,我可靠地使用JackIt来演示我的注入攻击以获取对易受攻击设备的根访问权限。JackIt也被证明是我在混杂扫描器/嗅探器项目工作中的宝贵调试工具。JackIt将Bastille研究团队的工具与Darren Kitchen – Hak5已经验证的Ducky脚本语言结合到一个出色的击键注入攻击工具中。

我的击键注入研究项目如果不提及Marcus Mengs / Rogan Dawes – Logitacker的最新工作(2019年)就不完整。Marcus实施了一个硬件解决方案,专门用于Logitech设备,实现发现、被动和主动枚举、强制配对、击键注入、脚本等更多功能。使用Nordic nRF52840(pca 10059)USB加密狗,Marcus将他的二进制代码刷写到加密狗上,并配备了方便的命令行界面(CLI)。

我击键漏洞利用研究工作的另一个主要贡献者是Samy Kamkar的KeySweeper工作。尽管我没有实际尝试构建他的硬件项目,但我发现从键盘记录渗漏的角度来看,这个概念非常有趣。Samy的KeySweeper无线嗅探、解密和记录(以及使用GSM报告)附近的无线Microsoft键盘。他的文章非常 informative 且易于遵循。http://samy.pl/keysweeper/

构建低成本混杂嗅探器

零件清单:

  • Arduino Nano
  • nRF24L01+ 收发器模块
  • 电压调节器模块
  • Arduino Nano V3模块
  • nRF24L01+ PA LNA 长距离模块(可选)

硬件布线相当简单。nRF24无线电通过SPI(串行外设接口)控制,SPI引脚在电压调节器板上清晰标记。最初,我将项目面包板化,后来制作了一个独立的直接接线版本。两种方法都可以相当快地构建(取决于您的焊接和/或面包板经验)。此外,我决定在整个硬件设计工作中维护颜色代码方案。这样做有助于减少(如果不是消除)接线错误的可能性。

Arduino Nano V3是一个基于ATmega328的面包板友好微控制器板。它有22个输入/输出引脚(14个数字和8个模拟),32Kb闪存,2Kb闪存引导加载程序和8Kb的SRAM。Arduino嗅探器草图需要使用Arduino IDE编程到Arduino Nano板上。https://www.arduino.cc/en/Main/Software

重要说明: 您可以在不使用电压调节器的情况下使用nRF24L01+收发器,但是,如果您选择这样做,必须用最大3.3v为nRF24L01+供电,否则有损坏模块的风险。如果您使用电压调节器板(强烈推荐),您可以用5v为其供电,调节器板将安全地将其调节到无线电的3.3v。Nano板上提供3.3v和5v输出。

请记住,传输需要相当多的功率(PA最大设置),有时Arduino Nano可能难以提供所需的功率。这可能导致间歇性丢失数据包,以及限制有效范围。使用电压调节器板显著提高了无线电的整体性能。使用电压调节器板的有效范围约为100米(没有则为10米)。使用可选的nRF24L01+ PA LNA长距离模块与外部天线已经测试并验证可以达到1100米(视线)。

接线图

由于我过去使用JackIt进行击键注入的成功以及我对能够连接到移动手机的紧凑设备的渴望,我决定从Insecurity of Things的uC_mousejack(phikshun)存储库开始工作。uC_mousejack项目包括将‘mousejack’攻击放入一个小型嵌入式设备中,形式因子为钥匙链。代码提供了一个工具,使用Duckyscript对Microsoft和Logitech设备启动自动化击键注入攻击。如果您不知道Duckyscript是什么,请参阅Hak5 USB Rubber Ducky Wiki https://github.com/hak5darren/USB-Rubber-Ducky/wiki

混杂嗅探器代码

1
2
3
4
5
6
7
git clone https://github.com/insecurityofthings/uC_mousejack
cd /uC_mousejack/src
mkdir promisc_sniffer
copy c:\attack.h  promisc_sniffer
copy c:\<path>\promisc_sniffer.ino promisc_sniffer
cd promisc_sniffer
(run) promisc_sniffer.ino

主要,我感兴趣的是能够混杂扫描(被动枚举)附近潜在易受攻击设备的MAC地址,然后嗅探这些地址(主动枚举)以确定数据包有效载荷,从而指纹识别设备为可利用的Microsoft或Logitech设备(如果适用)。

对于这个特定项目,我不关心uC_mousejack的攻击模式功能,并在代码中故意禁用了此功能。如果您决定重新启用攻击模式,请注意不需要交互来启动攻击。请小心使用此设备。我们不能对此工具的使用方式承担任何责任。

还要注意,我修改了代码以监视传输的击键注入并通过串行总线显示这些数据包。这些数据可以使用Arduino IDE中的Serial Monitor(在工具下)查看,或者如果使用platformIO则通过监视串行端口查看。或者,您可以在基于Windows的系统中使用PuTTY查看此数据。

易受攻击的Microsoft Mouse 5000示例输出(被动/主动枚举)

(由有效载荷长度(校验和验证)和指纹识别的HID类型确定)

对易受攻击的Logitech K400r键盘的击键注入攻击示例(注入‘ABC’)

对易受攻击的Microsoft Mouse 5000的击键注入攻击示例(注入‘ABC’)

显然,这是真正有趣的地方。解密这些专有数据包需要按供应商逐个进行,以确定这些设备用于与加密狗通信的确切协议。需要识别和指纹识别“保持活动”和“唤醒”数据包,以及建立和维护数据包间时间间隔。Marc Newlin – Bastille Research和Thorsten Schröder / Max Moser在这个领域做了大量研究,他们的白皮书是开源和公开可用的。

结论

正如您可能已经注意到的,只有少数行业领先的安全研究人员在调查这个无线漏洞利用领域。尽管他们在不同程度上非常成功,但我们都可以同意,检查野外每个键盘和鼠标几乎是不可能的。显然,其中一些设备可以用新固件更新,从而减轻风险(前提是他们主动这样做),但是,有许多设备具有OTP(一次性可编程)固件,暴露完整系统(最终完整网络)于恶意攻击。

最快和最明显的解决方案是在安全区域用有线对应物替换无线键盘和鼠标。蓝牙设备往往更昂贵且倾向于使用相当多的功率,但这些也有助于降低暴露风险。

从信息安全的角度来看,采取混杂嗅探器方法并维护已知易受攻击设备及其指纹的数据库可以在帮助公司了解其基础设施中可能存在的弱点方面走得很远。理想情况下,能够现场启动便携式嗅探器,捕获地址和数据包,指纹识别这些设备为易受攻击或安全,并最终为客户打印出可疑设备日志将是有益的。只是一个想法。

最后,我要说我已经学到了关于这个经常被忽视的无线漏洞利用领域的大量信息。随着物联网(IoT)中出现越来越多的安全问题,有时很容易将键盘和鼠标视为简单无害的设备而 overlook。直到几个月前,我肯定也是这样。将来,这将改变。

参考文献

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计