制作WiFiDucky远程HID攻击设备
字数 1949 2025-08-22 18:37:22

WiFiDucky远程HID攻击设备制作教程

1. 项目介绍

WiFi Ducky是一个基于Wi-Fi控制的BadUSB设备,能够远程执行Ducky Scripts脚本。它结合了ESP8266和ATMEGA32U4芯片,通过Wi-Fi网络实现远程上传、保存和运行攻击脚本。

主要特点:

  • 远程控制:通过Wi-Fi网络上传和运行Ducky Script
  • 实时测试:无需频繁复制到micro-SD卡或编译,可直接通过web界面测试脚本
  • 扩展性强:可实现多种攻击方式,如下载可执行文件、执行不同攻击并返回结果、开启反向Shell等

2. 所需材料

组件 型号/规格
主控芯片 CJMCU-Beetle Leonardo USB ATMEGA32U4
WiFi模块 ESP8266-12F
电源模块 AMS1117-3.3V

3. 所需软件

  1. Arduino IDE:https://www.arduino.cc/en/Main/Software
  2. NodeMCU Flasher:https://github.com/nodemcu/nodemcu-flasher
  3. WiFi Ducky固件:https://github.com/spacehuhn/wifi_ducky/releases

4. 硬件连接

接线图说明:

  1. ATMEGA32U4与ESP8266通过串口连接
  2. AMS1117-3.3V为ESP8266提供稳定电源
  3. 关键引脚连接:
    • ATMEGA32U4的TX -> ESP8266的RX
    • ATMEGA32U4的RX -> ESP8266的TX
    • ATMEGA32U4的GND -> ESP8266的GND
    • AMS1117-3.3V输出 -> ESP8266的3.3V

5. 固件烧录步骤

5.1 写入初始代码到ATMEGA32U4

将以下代码上传到Arduino:

int program_pin = 12;
int enable_pin = 13;

void setup(){
  Serial1.begin(115200);
  Serial.begin(115200);
  pinMode(enable_pin, OUTPUT);
  pinMode(program_pin, OUTPUT);
  digitalWrite(program_pin, LOW);
  digitalWrite(enable_pin,HIGH);
}

void loop(){
  while(Serial1.available()){
    Serial.write((uint8_t)Serial1.read());
  }
  if(Serial.available()){
    while(Serial.available()){
      Serial1.write((uint8_t)Serial.read());
    }
  }
}

5.2 烧录ESP8266固件

  1. 从GitHub下载esp8266_wifi_duck_4mb.bin固件
  2. 打开NodeMCU Flasher
  3. 设置参数:
    • Flash Mode: DIO
    • Flash Size: 32Mbit
    • Flash Speed: 921600
  4. 选择固件文件
  5. 选择正确的COM端口
  6. 点击"Flash"开始烧录

注意:烧录完成后需要断开GPIO0的连接线

6. 写入主代码到ATMEGA32U4

上传以下主控制代码:

#include <Keyboard.h>
#define BAUD_RATE 57200
#define ExternSerial Serial1

String bufferStr = "";
String last = "";
int defaultDelay = 0;

void Line(String _line){
  int firstSpace = _line.indexOf(" ");
  if(firstSpace == -1) Press(_line);
  else if(_line.substring(0,firstSpace) == "STRING"){
    for(int i=firstSpace+1;i<_line.length();i++) Keyboard.write(_line[i]);
  }
  else if(_line.substring(0,firstSpace) == "DELAY"){
    int delaytime = _line.substring(firstSpace + 1).toInt();
    delay(delaytime);
  }
  else if(_line.substring(0,firstSpace) == "DEFAULTDELAY") defaultDelay = _line.substring(firstSpace + 1).toInt();
  else if(_line.substring(0,firstSpace) == "REM"){} //nothing :/
  else if(_line.substring(0,firstSpace) == "REPLAY") {
    int replaynum = _line.substring(firstSpace + 1).toInt();
    while(replaynum--){
      Line(last);
    }
  }
  else{
    String remain = _line;
    while(remain.length() > 0){
      int latest_space = remain.indexOf(" ");
      if (latest_space == -1){
        Press(remain);
        remain = "";
      }
      else{
        Press(remain.substring(0, latest_space));
        remain = remain.substring(latest_space + 1);
        delay(5);
      }
    }
    Keyboard.releaseAll();
    delay(defaultDelay);
  }
}

void Press(String b){
  if(b.length() == 1) Keyboard.press(char(b[0]));
  else if (b.equals("ENTER")) Keyboard.press(KEY_RETURN);
  else if (b.equals("CTRL")) Keyboard.press(KEY_LEFT_CTRL);
  else if (b.equals("SHIFT")) Keyboard.press(KEY_LEFT_SHIFT);
  else if (b.equals("ALT")) Keyboard.press(KEY_LEFT_ALT);
  else if (b.equals("GUI")) Keyboard.press(KEY_LEFT_GUI);
  else if (b.equals("UP") || b.equals("UPARROW")) Keyboard.press(KEY_UP_ARROW);
  else if (b.equals("DOWN") || b.equals("DOWNARROW")) Keyboard.press(KEY_DOWN_ARROW);
  else if (b.equals("LEFT") || b.equals("LEFTARROW")) Keyboard.press(KEY_LEFT_ARROW);
  else if (b.equals("RIGHT") || b.equals("RIGHTARROW")) Keyboard.press(KEY_RIGHT_ARROW);
  else if (b.equals("DELETE")) Keyboard.press(KEY_DELETE);
  else if (b.equals("PAGEUP")) Keyboard.press(KEY_PAGE_UP);
  else if (b.equals("PAGEDOWN")) Keyboard.press(KEY_PAGE_DOWN);
  else if (b.equals("HOME")) Keyboard.press(KEY_HOME);
  else if (b.equals("ESC")) Keyboard.press(KEY_ESC);
  else if (b.equals("BACKSPACE")) Keyboard.press(KEY_BACKSPACE);
  else if (b.equals("INSERT")) Keyboard.press(KEY_INSERT);
  else if (b.equals("TAB")) Keyboard.press(KEY_TAB);
  else if (b.equals("END")) Keyboard.press(KEY_END);
  else if (b.equals("CAPSLOCK")) Keyboard.press(KEY_CAPS_LOCK);
  else if (b.equals("F1")) Keyboard.press(KEY_F1);
  else if (b.equals("F2")) Keyboard.press(KEY_F2);
  else if (b.equals("F3")) Keyboard.press(KEY_F3);
  else if (b.equals("F4")) Keyboard.press(KEY_F4);
  else if (b.equals("F5")) Keyboard.press(KEY_F5);
  else if (b.equals("F6")) Keyboard.press(KEY_F6);
  else if (b.equals("F7")) Keyboard.press(KEY_F7);
  else if (b.equals("F8")) Keyboard.press(KEY_F8);
  else if (b.equals("F9")) Keyboard.press(KEY_F9);
  else if (b.equals("F10")) Keyboard.press(KEY_F10);
  else if (b.equals("F11")) Keyboard.press(KEY_F11);
  else if (b.equals("F12")) Keyboard.press(KEY_F12);
  else if (b.equals("SPACE")) Keyboard.press(' ');
  else Serial.println("not found :'"+b+"'("+String(b.length())+")");
}

void setup() {
  Serial.begin(BAUD_RATE);
  ExternSerial.begin(BAUD_RATE);
  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);
  Keyboard.begin();
}

void loop() {
  if(ExternSerial.available()){
    bufferStr = ExternSerial.readStringUntil('\n');
    Serial.println(bufferStr);
    if(bufferStr.length() > 0){
      bufferStr.replace("\r","\n");
      bufferStr.replace("\n\n","\n");
      while(bufferStr.length() > 0){
        int latest_return = bufferStr.indexOf("\n");
        if(latest_return == -1){
          Serial.println("run: "+bufferStr);
          Line(bufferStr);
          bufferStr = "";
        }
        else{
          Serial.println("run: '"+bufferStr.substring(0, latest_return)+"'");
          Line(bufferStr.substring(0, latest_return));
          last=bufferStr.substring(0, latest_return);
          bufferStr = bufferStr.substring(latest_return + 1);
        }
      }
      ExternSerial.write(0x99);
      Serial.println("done");
    }
  }
}

7. 设备使用

  1. 将设备插入目标计算机
  2. 使用手机或电脑搜索WiFi网络:
    • SSID: WIFI DUCK
    • 密码: quackquack
  3. 连接后,在浏览器访问:http://192.168.4.1
  4. 通过Web界面可以:
    • 上传新的Ducky Scripts
    • 查看、删除已有脚本
    • 直接运行脚本

注意:每行脚本最大长度为600个字符

8. Ducky Script编写指南

Ducky Script是一种简单的脚本语言,用于控制键盘输入。基本语法包括:

  • STRING <text>: 输入文本
  • DELAY <ms>: 延迟指定毫秒数
  • DEFAULTDELAY <ms>: 设置默认延迟
  • REM <comment>: 注释
  • REPLAY <n>: 重复执行上一条命令n次
  • 键盘按键:直接使用按键名称,如ENTER, CTRL, ALT等

示例脚本:

REM 这是一个示例脚本
DELAY 1000
GUI r
DELAY 500
STRING cmd
ENTER
DELAY 1000
STRING echo Hello, WiFi Ducky!
ENTER

9. 固件更新与自定义

通过Web界面更新:

  1. 访问http://192.168.4.1/info
  2. 上传新的.bin固件文件

自定义固件编译:

  1. 修改esp8266_wifi_duck/html/files下的文件
  2. 打开minifier.html
  3. 点击"minify + byte-ify"转换格式
  4. 替换data.h中的内容
  5. 在Arduino IDE中打开esp8266_wifi_duck.ino
  6. 点击"项目->验证/编译"
  7. 点击"项目->导出已编译的二进制文件"

10. 注意事项

  1. 使用此设备进行未经授权的攻击是违法的,仅限授权测试使用
  2. 确保在合法授权范围内使用
  3. 脚本执行时不要中断设备连接
  4. 注意脚本每行的长度限制(600字符)
  5. 烧录固件后必须断开GPIO0的连接

11. 参考资料

  1. WiFi Ducky官方仓库:https://github.com/spacehuhn/wifi_ducky
  2. WiDucky项目:https://github.com/basic4/WiDucky
  3. Ducky Script官方文档:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript
WiFiDucky远程HID攻击设备制作教程 1. 项目介绍 WiFi Ducky是一个基于Wi-Fi控制的BadUSB设备,能够远程执行Ducky Scripts脚本。它结合了ESP8266和ATMEGA32U4芯片,通过Wi-Fi网络实现远程上传、保存和运行攻击脚本。 主要特点: 远程控制:通过Wi-Fi网络上传和运行Ducky Script 实时测试:无需频繁复制到micro-SD卡或编译,可直接通过web界面测试脚本 扩展性强:可实现多种攻击方式,如下载可执行文件、执行不同攻击并返回结果、开启反向Shell等 2. 所需材料 | 组件 | 型号/规格 | |------|----------| | 主控芯片 | CJMCU-Beetle Leonardo USB ATMEGA32U4 | | WiFi模块 | ESP8266-12F | | 电源模块 | AMS1117-3.3V | 3. 所需软件 Arduino IDE:https://www.arduino.cc/en/Main/Software NodeMCU Flasher:https://github.com/nodemcu/nodemcu-flasher WiFi Ducky固件:https://github.com/spacehuhn/wifi_ ducky/releases 4. 硬件连接 接线图说明: ATMEGA32U4与ESP8266通过串口连接 AMS1117-3.3V为ESP8266提供稳定电源 关键引脚连接: ATMEGA32U4的TX -> ESP8266的RX ATMEGA32U4的RX -> ESP8266的TX ATMEGA32U4的GND -> ESP8266的GND AMS1117-3.3V输出 -> ESP8266的3.3V 5. 固件烧录步骤 5.1 写入初始代码到ATMEGA32U4 将以下代码上传到Arduino: 5.2 烧录ESP8266固件 从GitHub下载 esp8266_wifi_duck_4mb.bin 固件 打开NodeMCU Flasher 设置参数: Flash Mode: DIO Flash Size: 32Mbit Flash Speed: 921600 选择固件文件 选择正确的COM端口 点击"Flash"开始烧录 注意 :烧录完成后需要断开GPIO0的连接线 6. 写入主代码到ATMEGA32U4 上传以下主控制代码: 7. 设备使用 将设备插入目标计算机 使用手机或电脑搜索WiFi网络: SSID: WIFI DUCK 密码: quackquack 连接后,在浏览器访问:http://192.168.4.1 通过Web界面可以: 上传新的Ducky Scripts 查看、删除已有脚本 直接运行脚本 注意 :每行脚本最大长度为600个字符 8. Ducky Script编写指南 Ducky Script是一种简单的脚本语言,用于控制键盘输入。基本语法包括: STRING <text> : 输入文本 DELAY <ms> : 延迟指定毫秒数 DEFAULTDELAY <ms> : 设置默认延迟 REM <comment> : 注释 REPLAY <n> : 重复执行上一条命令n次 键盘按键:直接使用按键名称,如ENTER, CTRL, ALT等 示例脚本: 9. 固件更新与自定义 通过Web界面更新: 访问http://192.168.4.1/info 上传新的.bin固件文件 自定义固件编译: 修改 esp8266_wifi_duck/html/files 下的文件 打开 minifier.html 点击"minify + byte-ify"转换格式 替换 data.h 中的内容 在Arduino IDE中打开 esp8266_wifi_duck.ino 点击"项目->验证/编译" 点击"项目->导出已编译的二进制文件" 10. 注意事项 使用此设备进行未经授权的攻击是违法的,仅限授权测试使用 确保在合法授权范围内使用 脚本执行时不要中断设备连接 注意脚本每行的长度限制(600字符) 烧录固件后必须断开GPIO0的连接 11. 参考资料 WiFi Ducky官方仓库:https://github.com/spacehuhn/wifi_ ducky WiDucky项目:https://github.com/basic4/WiDucky Ducky Script官方文档:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript