制作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 固件

我编译的中文web界面固件 点击下载

然后打开 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文件

9、编译自定义固件

安装Arduino库

ESP8266 SDK

ESPAsyncWebServer

ESPAsyncTCP

打开Arduino点击 文件->首选线

http://arduino.esp8266.com/stable/package_esp8266com_index.json

添加上列代码到 附加开发板管理网址,然后点击 工具->开发板->开发板管理器 搜索 ESP 点击安装

然后下载 ESPAsyncWebServer 和 ESPAsyncTCP 在Arduino中点击 项目->加载库->添加一个.zip库

修改esp8266_wifi_duck\html\files下的文件,然后打开 minifier.html点击 "minify + byte-ify"转换格式,并替换掉 data.h 里面的内容(这里提供下我汉化的中文WEB界面:点击下载

然后在Arduino IDE中打开 esp8266_wifi_duck.ino 开发板选择:Generic ESP8266 Module Flash大小选择:4M (1M SPIFFS)然后点击 项目->验证/编译 再点击 项目->导出已编译的二进制文件

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

11、参考资料

https://github.com/spacehuhn/wifi_ducky

https://github.com/basic4/WiDucky

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

 
本文转自 K1two2 博客园博客,原文链接:http://www.cnblogs.com/k1two2/p/7083159.html   ,如需转载请自行联系原作者
相关文章
|
10月前
|
机器学习/深度学习 计算机视觉
深度学习与计算机视觉的最新进展
深度学习与计算机视觉的最新进展
|
数据可视化 关系型数据库 MySQL
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
本文介绍了在MySQL 8.0+版本中创建和管理用户的详细步骤,包括通过命令行进入MySQL、创建数据库、用户及授权等操作,并提供了具体命令示例。适合初学者参考学习,帮助实现系统的权限管理和安全控制。
6084 3
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
|
11月前
yolov5的coco128.yaml的配置信息详解
这篇文章详细解释了YOLOv5的`coco128.yaml`配置文件中的参数,包括训练和验证数据集的路径、类别数量以及类别名称。
534 0
|
机器学习/深度学习 算法 vr&ar
YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
这个摘要主要涵盖了一个关于YOLO目标检测的深度学习专栏的内容概览。该专栏专注于YOLO算法的历史、前沿研究和实战应用,提供了一系列的文章,详细讲解了YOLO的改进方法,包括卷积优化、损失函数创新、注意力机制、网络结构和主干网络的更新,以及针对不同场景如红外成像、小目标检测等的应用。此外,还提供了每周多次的更新频率以保持内容的时效性,并指导读者进行论文写作和项目实现,包括具体的代码示例和实战项目,如行人检测、对象分割、姿态估计等。该专栏还涉及到面试准备和实习就业指导,帮助读者提升在图像算法领域的专业技能。
|
SQL 存储 缓存
第四章 逻辑架构(2)
第四章 逻辑架构
92 1
|
SQL Java 大数据
5款开源BI工具优缺点及介绍
【4月更文挑战第15天】对比了几款开源BI报表工具:Superset以其高性能和高度可定制化受青睐,适合复杂分析;Metabase以其简洁易用和广泛兼容性脱颖而出,适合快速构建报表;DataEase以其轻量级和易部署特点吸引中小型企业;JasperReports擅长复杂报表生成,适合Java环境;Pentaho CE则是一体化平台,适合需要全面企业级功能的用户。选择时应结合公司需求、技术背景和数据规模来决定。
4607 6
|
消息中间件 存储 数据库
深度剖析 RocketMQ 5.0,流存储:流场景的诉求是什么?
本文将从使用的角度出发,来更详细的展示一下流存储的场景,看看它和业务消息的场景有哪些区别。 RocketMQ 5.0 面向流存储的场景,提供了哪些特性。再结合两个数据集成的案例,来帮助大家了解流存储的用法。
3735 2
|
Docker 容器
【Ubuntu18.04】Docker配置镜像源
为了提高Docker使用的效率和稳定性,配置一个镜像源是非常必要的。通过使用镜像源,可以加速Docker的镜像下载,同时也能够更好地满足用户的需求。
3176 1
【Ubuntu18.04】Docker配置镜像源
|
人工智能 自然语言处理 前端开发
视野修炼-技术周刊第43期
🔥强烈推荐 1. 2023 Stackoverflow 开发者调查报告 开发人员类型:33%全栈,18%后端,7%前端... 2023 年延续了 JavaScript 的连胜势头,连续第 11 年成为最常用的编程语言 Node.js 和 React.js 是所有受访者最常用的两种 Web 技术 新开AI板块:受访者对AI搜索工具的首选是ChatGPT:83%的受访者在过去一年中使用过它
|
小程序 开发工具 开发者
小程序使用 组件库 vant-weapp详细教程
小程序使用 组件库 vant-weapp详细教程
318 0