制作Wi-Fi Ducky远程HID攻击设备

1、介绍WIFI DUCKY

它是一个Wi-Fi控制的BadUSB设备来远程执行Ducky Scripts。

使用充当键盘的USB设备来注入攻击,Hak5 的 USB Rubber Ducky 是这种攻击的黑客小工具。它引入了一个简单的脚本语言,称为Ducky Script,这个项目也是这样使用的。

该设备使用 ESP8266 + ATMEGA32U4 创建WIFI信号,进行远程上传、保存和运行脚本进行攻击

但是为什么要添加Wi-Fi,你可能会问。

使用Wi-Fi,您可以远程上传并运行Ducky Script。

只需将设备插入,连接到其Wi-Fi网络,即可完全控制目标机器。

它还给你一个比其他BadUSB更大的优势,你可以测试你的脚本!您不需要将它们复制到micro-sd卡或编译它们。您可以通过web界面直接运行它们,这使得它非常容易测试和改进脚本。

它还为不同的攻击增加了很多可能性。您可以使目标从Wi-Fi网络下载可执行文件,而不是互联网。或者执行不同的攻击并将结果发回。或者打开ESP8266s Wi-Fi上的反向Shell。

等等...有这么多的可能性,赶快动手做起来吧!

2、所需材料:

1.CJMCU-Beetle Leonardo USB ATMEGA32U4

2.ESP8266-12F

3.AMS1117-3.3V电源模块

3、所需软件:

ARDUINO IDE 下载地址:https://www.arduino.cc/en/Main/Software

NodeMCU Flasher 下载地址:https://github.com/nodemcu/nodemcu-flasher

4、接线图:

5、写入固件到ESP8266

首先,然后将下列代码上传到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());
    }
  }
}

将设备连接PC,打开Arduino IDE,选择开发板和端口

然后点击 上传 将代码写入Arduino

写入成功后,前往 https://github.com/spacehuhn/wifi_ducky/releases 下载 esp8266_wifi_duck_4mb.bin 固件

然后打开 NodeMCU Flasher 写入软件

将参数设置如下

然后选择固件

选择端口,点击 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);
      --replaynum;
    }
  } 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("END");
    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);
      }
    }

    bufferStr = "";
    ExternSerial.write(0x99);
    Serial.println("done");
  }
}

等提示 写入成功,把设备拔出,重新连接PC

7、如何使用它

这时用手机搜索WIFI会找到

WIFI:WIFI DUCK  PASSWD:quackquack

打开浏览器,输入 http://192.168.4.1 进入管理地址

在这里,你可以上传,查看,删除和运行新的Ducky Scripts。

请注意,脚本的每行最大长度为600个字符。

如何写Ducky Scripts:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript

8、通过Web界面更新ESP8266固件

如想更新固件,可以通过Web界面进行更新。

转到192.168.4.1/info并上传新的.bin文件

(在Arduino IDE中点击 Sketch->Export compiled Binary 编译.bin文件)

9、制作过程视频(生肉)

*视频上传中*

10、参考资料

https://github.com/spacehuhn/wifi_ducky

https://github.com/basic4/WiDucky

http://www.cnblogs.com/k1two2/p/6849941.html(文章末尾有网友"g0ttl"的演示作品)

时间: 2024-10-11 06:54:02

制作Wi-Fi Ducky远程HID攻击设备的相关文章

Teensy HID攻击科普文

0x00 前言: 在2014年美国黑帽大会上,柏林SRLabs的安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为"BadUSB"(按照BadBIOS命名)的攻击方法.在认识BadUSB之前我们来先了解一种类似的攻击手法,使用Teensy芯片进行HID攻击,这种手法要古老的多,2010年左右,通过U盘伪装成为USB键盘输入恶意代码的攻击方式就已经相当成熟,并将这种攻击方式称为"Teensy HID攻击",Kautilya也是在20

WHID Injector:将HID攻击带入新境界

HID Attack是最近几年流行的一类攻击方式.HID是Human Interface Device的缩写,意思是人机接口设备.它是对鼠标.键盘.游戏手柄这一类可以操控电脑设备的统称. 由于电脑对这类设备缺少严格的检测措施,只是简单的识别设备类型,就允许设备对电脑进行各项操作.所以,通过修改篡改设备反馈信息,就可以很轻松的让电脑将其他设备误认为HID设备,从而获取控制权限.尤其是USB和蓝牙这类即插即用接口出现,导致HID Attack成为重要方式.例如,Bad USB就是USB类攻击的典型代

HID攻击进阶——WHID injector

前言 HID是Human Interface Device的缩写,意思是人机接口设备.它是对鼠标.键盘.游戏手柄这一类可以操控电脑设备的统称.延伸出的WHID代表基于Wi-Fi的HID注射器,即对HID攻击进行无线化攻击时的一种注入工具.本次实验采用的攻击原理如下图: 攻击者使用ESP8266作为AP,在自己的电脑创建客户端连接AP.在客户端键入命令发送到ESP8266,它再转发给Arduino Leonardo.利用Arduino中的Keyboard库就可以使用传输的命令控制目标主机的键盘.

远程获取iOS设备的屏幕截图

一个远程获取iOS设备屏幕的例子,Client采用TCP连接iOS设备的2115端口,然后读取PNG格式的数据流. +VSRemoteScreen.h +VSRemoteScreen.m 添加到你的iOS项目中,然后在App启动时调用startScreenServer函数. +client.php client示例文件 [1].[代码] RemoteScreen 跳至 [1] [2] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

如何通过Chrome远程调试android设备上的Web网站

网上的帖子很多,但很多都是老版本的,试过了,根本不管用,花了一天时间,终于在本机试验通过了,特记录下来,以备用.有需要的朋友也可以参考.先上一张图,看看PC端chrome上调试的效果: 左边是手机的模拟操作器,右边是大家熟悉的开发人员工具,也可以在手机上操作,PC端左边屏幕会同步到手机上的界面. 下面再说一下环境配置: 1.手机端,我手机是华为荣耀4,android4.4.4,很旧的手机了,大家别笑话,但不影响本次试验.安装chrome版本为58.0.3029.83: 2.PC端,win7 64

远程调试 Android 设备使用入门

远程调试 Android 设备使用入门 目录 要求 第 1 步:发现您的 Android 设备 第 2 步:从您的开发计算机调试 Android 设备上的内容. 更多操作:重新加载.聚焦或关闭一个标签 检查元素 Android 设备到开发计算机的抓屏 反馈 By Kayce Basques Technical Writer at Google 从 Windows.Mac 或 Linux 计算机远程调试 Android 设备上的实时内容. 本教程将向您展示如何: 设置您的 Android 设备进行

浏览器 连不上网 (1):远程计算机或设备将不接受连接

前言 不知道为什么,每隔一段时间,我的谷歌浏览器就不能正常上网,而其他,比如火狐浏览器和qq之类的却可以正常使用.使用谷歌浏览器自带的windows检测后, window给出的提示如下: 解决办法 原博客地址:https://blog.csdn.net/ls1792304830/article/details/74797066好几次我都是根据上面的博客教程解决的,这次就记录下来,为了日后好寻找. win+R 然后输入 regedit 打开注册表后,根据我上面的图片左下角的地址提示,依次打开以下目

远程端口占用—设备无法远程登入

远程端口占用-设备无法远程登入 某司网络部分架构如下图所示: 故障场景:通过网关10.15.116.200和中间二层设备10.15.119.8设备无法跳转登入到最下面二层接入设备10.15.118.122,在本地也无法远程登入. 1. 通过在二层10.15.119.8设备telnet和stelnet下连10.15.118.122,发现无法登入2. 查看10.15.118.122设备aaa及ssh相关配置正常:3. 查看其它相关配置信息也没问题,以及在线用户: 4. 在我们查看tcp状态,发现12

使用Safari远程调试iOS设备网页

最近在做HTML 5游戏时,发布到手机上访问网页总是莫名其妙出现问题,苦于没有remote debug功能一直没有查找到问题. 这边博客详细介绍了iOS, Android, Windows Phone的调试方法: http://developer.telerik.com/featured/a-concise-guide-to-remote-debugging-on-ios-android-and-windows-phone/ 1. 使用方法 在Mac下连接iPhone试了一下确实不错, 环境: