BadUSB攻击全解:从原理到实践与防御

admin 2025年3月7日11:02:49评论22 views字数 2941阅读9分48秒阅读模式
BadUSB攻击全解:从原理到实践与防御

在2014年Black Hat大会上,Jakob Lell和Karsten Nohl首次公开展示了一种名为BadUSB的攻击技术,通过USB接口让USB设备能够成为攻击设备攻击具有USB端口的电脑。这项技术的出现彻底颠覆了人们对于USB安全的认知。

BadUSB原理

BadUSB攻击利用了USB设备设计上的缺陷,USB规范出于兼容性和免驱的考虑,并未严格限制USB设备类型的固定特征,攻击者可以通过重写USB设备的固件将一个普通的USB设备伪装成HID(Human Interface Device,人机交互设备),并利用HIDHuman Interface Device)的交互性,将攻击载荷植入到HID中,将USB设备伪装为USB键盘,通过键盘输入固件中的指令,从而完成正常如键盘或鼠标的操作。由于是作为虚拟键盘进行操控,攻击载荷存放在USB设备的固件区域,因此杀毒软件无法扫描到BadUSB攻击。

BadUSB攻击全解:从原理到实践与防御

从技术层面来看,只要能模拟键盘的设备(如Teensy、Arduino UNO/Leonardo、树莓派)均可实现BadUSB攻击效果。

Arduino UNO实现BadUSB攻击

笔者没有选用最简单的小黄鸭设备写入程序,而是选择手头现成的Arduino UNO开发板(这样难度更大),其ATmega16U2芯片是Arduino开发板中作为电脑USB接口和主处理器串口的桥梁,之前版本中的UNO板中使用的是ATmega8U2芯片。ATmega16U2芯片运行的固件可以通过特殊的USB协议(即DFU,设备固件升级)来升级。

Arduino UNO默认使用最新版本的ATmega16U2固件,检查固件是否需要升级可以检查系统的设备管理器中Arduino串口的驱动信息。

BadUSB攻击全解:从原理到实践与防御

根据上文BadUSB原理,要将Arduino UNO作为BadUSB的设备,需要将其改造为能够被电脑识别为HID设备,因此将ATmega16U2固件刷新为键盘固件程序,而刷固件需要将Arduino UNO设置到DFU(Device Firmware Upgrade)模式下,并使用Flip工具写入新的固件。

Flip下载地址:
http://www.microchip.com/developmenttools/productdetails.aspx?partno=flip
Arduino固件下载地址:
https://github.com/arduino/ArduinoCore-avr/tree/master/firmwares/atmegaxxu2

要基于Arduino UNO制作BadUSB,首先需要在UNO的默认固件(Arduino-usbserial-uno)下编写、编译和写入攻击代码,由于BadUSB的攻击基于模拟键盘输入,因此代码中需要使用HIDKeyboard库(https://github.com/SFE-Chris/UNO-HIDKeyboard-Library),Arduino官方的Keyboard库无法在默认固件下编译和上传,会报error: 'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>',且不同于Arduino Leonardo,一旦将固件刷为HID,将无法上传代码,所以在刷固件前首先要写入攻击代码。

示例代码如下,该代码将通过run命令在浏览器中访问https://peirs.net

#include <HIDKeyboard.h>HIDKeyboard keyboard;voidsetup() {    keyboard.begin();    delay(200);}voidloop() {    delay(10);     keyboard.pressSpecialKey(GUI);    keyboard.releaseKey();    delay(200);     keyboard.println("run");    keyboard.pressSpecialKey(ENTER);    keyboard.releaseKey();    delay(1000);    keyboard.println("https://peirs.net");     keyboard.pressSpecialKey(ENTER);    keyboard.releaseKey();    delay(10);    while(1);}

代码上传后,将Arduino UNO置于DFU模式,打开Flip软件并将arduino_keyboard程序写入固件即可将Arduino UNO伪装为键盘。

设置Arduino UNO处于DFU模式,首先需要用USB线连接Arduino与电脑,并让Arduino中的重置针脚短路(跳线连接下图中红点的针脚),以此重置8u216u2芯片。如果重置成功,在Arduino IDE中将不会出现串口信息(正常的串口信息会是COM3COM5,根据不同的设备会有不同)。

BadUSB攻击全解:从原理到实践与防御

接着运行Flip,选择目标设备是ATmega16U2,再选择通讯媒介是USBUSB协议传输打开后,左侧的Operation勾选框变为可选,最后通过Load HEX File,选择Arduino-keyboard-0.3.hex固件程序,点击Run刷入固件程序。

固件写入成功后,重新插入ArduinoUSB连接线,即可看到Arduino UNO作为键盘被电脑识别,之前写入的代码也会运行(效果视频见原文链接)。

BadUSB攻击全解:从原理到实践与防御
BadUSB攻击全解:从原理到实践与防御
BadUSB攻击全解:从原理到实践与防御

操作Flip的过程中,若出现AtLibUsbDfu.dll not found的错误,可以在设备管理器中,更新未知设备(unknown device)的驱动,选择驱动是Flip安装路径下的USB目录,完成后,在设备管理器中可见ATmega16U2的设备。

BadUSB攻击全解:从原理到实践与防御

如果需要重新编辑代码,则需要重新设置ArduinoDFU模式,刷Arduino-usbserial-uno固件,刷新固件后,需要重新插入USB线,让电脑识别Arduino UNO串口,再编写、编译、上传代码。

BadUSB防御

虽然BadUSB攻击隐蔽性高、杀毒软件难以检测,但防御措施至少有三种。

1. 使用USB数据隔离设备(仅充电无数据传输的转接头)。
2. 通过Windows的组策略限制,在组策略→计算机配置→管理模板→系统→设备安装→设备安装限制中,将“禁止安装未由其他策略描述的设备”选项设为启用,将“允许安装与以下设备ID匹配的设备”选项设为启用,并在“显示”中输入可信的USB设备的硬件ID,该ID可在设备管理器 → 【目标设备】 →     右键“属性” → 详细信息 → 属性→硬件ID中查看,格式类似USBVID_XXXX&PID_XXXX
3. 终端安全管理:在企业和机构中部署终端安全管理工具,及时发现并响应异常设备及设备行为。

BadUSB攻击巧妙利用了USB协议设计中的开放性与易用性,攻击成本低且隐蔽性极强,这意味日常生活中我们需要时刻警惕外部USB设备的安全风险。理解BadUSB的原理与防御方法,有助于进一步提升个人和企业面临此类安全风险的防范能力。

BadUSB攻击全解:从原理到实践与防御

原文始发于微信公众号(洞源实验室):BadUSB攻击全解:从原理到实践与防御

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月7日11:02:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   BadUSB攻击全解:从原理到实践与防御https://cn-sec.com/archives/3807757.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息