-
-
[原创]使用Arduino UNO制作BadUSB
-
发表于: 2021-8-27 15:46 12080
-
2014年Black Hat会议上,由Jakob Lell和Karsten Nohl展示,通过USB接口让USB设备能够成为攻击设备攻击具有USB端口的电脑。
BadUSB攻击主要是利用HID(Human Interface Device)的交互性,将攻击载荷植入到HID中,从而通过键盘鼠标控制设备,而键盘能够实现鼠标所有的操作,因此BadUSB主要是利用虚拟键盘进行攻击。由于是作为虚拟键盘,攻击载荷存放在USB设备的固件区域,因此杀毒软件无法扫描到BadUSB攻击。
BadUSB利用了USB设计上的漏洞,处于对USB设备的兼容性及免驱的要求,USB设计上没有要求对应的设备特征,而是拥有多种USB设备的特征,这样通过重写固件,可以将USB设备伪装为USB键盘,从而通过键盘输入固件中的指令。
从攻击原理看,只要能够作为键盘的HID设备都可以实现BadUSB效果,比如Teensy、Arduino UNO/Leonardo、树莓派。
采用只充电无数据传输的USB转接头;
组策略-计算机配置-管理模版-系统-设备安装-设备安装限制;
ATmega16U2芯片是Arduino开发板中作为电脑USB接口和主处理器串口的桥梁,之前版本中的UNO板中使用的是ATmega8U2芯片。ATmega16U2芯片运行的固件可以通过特殊的USB协议(即DFU,设备固件升级)来升级。
Arduino UNO默认使用最新版本的ATmega16U2固件,检查固件是否需要升级可以检查设备管理器中Arduino串口的驱动信息。
根据上文BadUSB原理,要将Arduino UNO作为BadUSB的设备,需要将其改造为能够被电脑识别为HID设备,因此刷ATmega16U2固件为键盘固件程序(文末有UNO和Keyboard固件程序下载)。刷芯片固件需要将Arduino UNO设置到DFU模式下,并使用Flip工具。
Flip下载地址:ac4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2A6j5%4u0G2j5$3S2A6M7q4)9J5k6h3y4G2L8g2)9J5c8X3c8W2N6X3g2D9L8%4m8E0k6h3&6@1N6r3!0G2L8s2y4Q4x3V1k6H3M7X3!0V1N6h3y4@1k6r3g2@1j5h3W2D9M7#2)9J5k6h3q4K6M7s2S2Q4x3@1k6H3j5i4u0@1L8X3!0Q4x3@1c8X3L8r3W2H3
Arduino固件下载地址:04eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7X3c8#2K9h3&6G2i4K6u0r3b7i4u0V1N6h3W2F1L8@1y4G2M7X3g2Q4x3X3c8S2N6Y4u0Q4x3V1k6@1M7X3g2W2i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3k6X3W2J5L8i4N6S2M7X3g2K6i4K6u0r3j5i4c8E0k6h3N6S2P5s2S2#2x3R3`.`.
设置Arduino UNO处于DFU模式,首先使用USB线连接Arduino与电脑,让Arduino中的重置针脚短路,实现重置8u2或16u2芯片。如果重置成功,在Arduino IDE中将不会出现串口信息。
要基于Arduino UNO制作BadUSB,首先需要在UNO默认固件(Arduino-usbserial-uno.hex)下编写、编译和上传代码,由于BadUSB的攻击基于模拟键盘输入,因此代码中需要使用HIDKeyboard库(d79K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0c8V1g2Q4x3X3c8o6K9s2u0A6M7#2)9J5c8W2g2z5e0#2)9J5k6p5S2u0c8p5E0W2P5h3u0G2j5i4u0V1i4K6u0V1e0r3W2T1M7X3q4J5P5g2!0q4c8W2!0n7b7#2)9^5z5g2!0q4c8W2!0n7b7#2)9^5b7@1q4J5k6s2g2A6L8X3!0Q4c8e0g2Q4b7f1g2Q4z5e0S2Q4c8e0k6Q4z5e0k6Q4b7U0W2Q4c8e0N6Q4z5f1q4Q4z5o6c8w2k6i4W2T1L8$3q4J5k6q4!0q4y4g2!0n7b7g2)9&6x3#2!0q4y4W2)9&6y4#2!0m8x3q4!0q4y4W2!0n7x3#2)9&6y4g2!0q4y4g2)9&6b7#2!0m8z5q4!0q4z5g2!0n7b7W2)9&6z5q4!0q4z5q4!0m8c8g2!0m8y4q4!0q4y4g2)9&6b7W2!0n7b7g2!0q4y4q4!0n7b7W2!0n7y4W2!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0m8c8W2)9&6x3g2!0q4y4g2)9&6x3W2)9^5b7#2!0q4y4q4!0n7z5q4)9^5b7g2!0q4y4q4!0n7b7#2!0m8x3q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4q4!0n7b7#2)9&6b7g2!0q4y4W2)9^5b7g2!0m8y4h3g2J5M7X3!0J5i4K6y4m8 'Keyboard' not found. Does your sketch include the line '#include ',且不同于Arduino Leonardo,一旦将固件刷为HID,将无法上传代码。
示例代码如下,该代码将通过run命令在浏览器中访问本站:
代码上传后,将Arduino UNO至于DFU模式,使用Arduino-keyboard-0.3.hex固件程序刷新固件,从而将Arduino UNO伪装为键盘。将Arduino设备置于DFU模式后,运行Flip,选择目标设备是ATmega16U2,再选择通讯媒介是USB,USB协议传输打开后,左侧的Operation勾选框变为可选,最后通过Load HEX File,选择Arduino-keyboard-0.3.hex固件程序,点击Run刷入固件程序。
固件写入成功后,重新插入Arduino的USB连接线,即可看到Arduino UNO作为键盘被电脑识别,之前写入的代码也会运行。
操作Flip的过程中,若出现AtLibUsbDfu.dll not found的错误,则可以在设备管理器中,更新未知设备(unknown device)的驱动,选择驱动是Flip安装路径下的USB目录,完成后,在设备管理器中可见ATmega16U2的设备。
如果需要重新编辑代码,则需要重新设置Arduino的DFU模式,刷Arduino-usbserial-uno固件,刷新固件后,需要重新插入USB线,让电脑识别Arduino UNO串口,再编写、编译、上传代码。
效果见视频:使用Arduino UNO制作BadUSB
加上红外遥控:红外操控Windows系统
#include <HIDKeyboard.h>
HIDKeyboard keyboard;
void setup() {
keyboard.begin();
delay(
200
);
}
void loop() {
delay(
200
);
keyboard.pressSpecialKey(GUI);
keyboard.releaseKey();
delay(
200
);
keyboard.println(
"run"
);
keyboard.pressSpecialKey(ENTER);
keyboard.releaseKey();
delay(
1000
);
keyboard.println(
"b05K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3k6h3W2J5M7#2)9J5k6h3&6W2N6l9`.`."
);
keyboard.pressSpecialKey(ENTER);
keyboard.releaseKey();
delay(
10
);
while
(
1
);
}
#include <HIDKeyboard.h>
赞赏
- [原创]供应链安全管理与实践 8624
- [原创]软件设计中的七类安全问题 8136
- [原创]安全产品落地思路 7778
- [原创]使用Arduino UNO制作BadUSB 12081
- 交通信号机的安全风险 11391