CJMCU-3212开发板BADUSB基础教程
前言:
CJMCU-3212为长江智动旗下的一块集成式开发板,关于这一开发板的官方资料几乎为零,实际上,对于官方资料的缺失,这可以说是合理的,因为其实际并不是传统上的单一MCU的开发板。实际上,CJMCU-3212集成了ARDUINO上的三个模块,即主模块、SD卡模块及WIFI模块。CJMCU-3212开发板实际是官方专为BADUSB而重新设计的开发板,为什么这么说,一方面是因为其基础的实验项目均是基于GITHUB上的BADUSB项目,另一方面是,其MCU的引出引脚实在太少了,其开发板上的引脚目前查明基本上均ATMEGA32U4的引脚,引出接口是VCC*2、GND*2、SPI总线、I2C总线及UART总线[就是常用的串行口],就此引脚基础,实在是难以在此开发板上进行控制性操作。
上面说了,实际上CJMCU-3212上使用了三个ARDUINO的模块,那么,这些模块上使用的MCU有参考意义了,以下为各模块对应使用的MCU:
-
主模块MCU :[ ATMEGA32U4 ]
-
WIFI模块MCU:[ ESP8266-ESP-12E ]
-
SD模块MCU :[ 未查明 ]
一、引脚定义
CJMCU-3212开发板并未在板上标识相关的引脚定义,这对大部分开发人员来说是致命的,实际上,本文对于查找这些引脚的定义花费了大量时间,你必须明确其型号并且从大量的MUC中找出其针脚定义图,然后使用万用表对其进行测试。而现实中,此类专业性非常强的文档并不容易找到,实际上本文对于ESP-12E这一MCU的引脚定义图,也是在数个月之后才找到一张其引脚标识明确的定义图[当然,本文只在闲余时间关注]。以下为非官方的引脚定义图,仅供参考使用。
基于有限的集成电路知识,以上为本文暂时仅识别到引脚定义,由于主模块与WIFI模块的基础电压不一样,对于图中“???”部分,有相关电路知识的朋友,可留言让本文更新相关信息。
二、GITHUB项目
本开发板实际是集合了多个GITHUB上的ARDUINO项目,依据项目的不同,使用到的ARDUINO模块也有区别,其中基于BADUSB方面的主要项目如下:
-
项目一:[ USB-Rubber-Ducky ][ 链接地址 ] -- 使用模块:主模块
-
项目二:[ Duckduino-microSD ][ 链接地址 ]-- 使用模块:主模块及SD模块
-
项目三:[ wifi_ducky ][ 链接地址 ] -- 使用模块:主模块及WIFI模块
三、[Duckduino-microSD]项目说明
该项目使用了CJMCU-3212开发板的主模块与SD模块,基本原理与最早期的BADUSB相同,唯一的区别是,把原来存于EPROM中脚本代码保存到SD模块中,以方便脚本内容的修改或引用。如此使用和早期的BADUSB实际上完全没有区别,当然,GITHUB项目的作者实际意图并不只如此,实际上原作者是希望使用拨码开关结合数字模拟引脚,实现不同的拨码组合以调用的不同攻击脚本,在单物理设备内同时实现多种BADUSB攻击功能。但以CJMCU-3212的引脚状态来说,这基本上已经不可能了,除非你能从不足1毫米的MCU针脚在实现飞线!当然,你也可以使用加入新模块的方式以实现拨码开关的功能,但本文对此方法持保留意见。以下相关电脑部分的操作,均基于WIN7操作系统,其它操作系统请自行灵活处理,下文步骤说明该项目安装与使用方法;
步骤一:从GITHUB网站的Duckduino-microSD项目页面下载源码并解压;解压后你将得到如下的目录结构:
1 2 3 4 5 |
Duckduino-microSD-master # 主目录 ├── DIP Switches Example Code.ino # 使用拨码开关选择BADUSB脚本的示例文件 ├── Duckduino-microSD │ └── Duckduino-microSD.ino # 读取SD模块上的BADUSB脚执行攻击的示例文件[本文仅说明此文件] └── README.md |
步骤二:[Duckduino-microSD.ino]源码简单解读,请使用带行号标识的文本编辑器打开此文件,对照以下说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
行范围:[ 1 - 7 ] # 关于此文档的一些信息说明 行范围:[ 10 - 13 ] # 调用的库或头文件 行范围:[ 15 - 17 ] # 变量定义 # 注:16行为定义一个布尔值 实际上未使用 估计初始设计目的为BADUSB的功能开关 # 注:17行为定义一份文件的名称 与SD模块关联 读取TF卡上那一份文件由此项指定 行范围:[ 19 - 48 ] # ARDUINO的初始代函数[仅执行一次] 行范围:[ 50 -86 ] # 作者自定义函数 关于对TF卡上文件的读取操作 行范围:[ 92 - 233 ] # 作者自定义函数 关于一些特殊的键盘按键的影射操作关系 # 关于这段代码 实际上与[ USB-Rubber-Ducky ]有关 行范围:[ 225 - 227] # ARDUINO的循环函数 此处为空 |
步骤三:将CJMCU-3212插入电脑,安装开发板驱动程序[首次接入需要];注1:在未安装驱动的情况下,CJMCU-3212将在设备管理器中识别为“其它设备”内的“Arduino Leonardo”;注2:ARDUINO下载的程序工具中已默认自带相关驱动,更新本开发板驱动只需要搜索ARDUINO程序的文件夹即可;
步骤四:驱动安装完成后,在设备管理器的“端口(COM 和 LPT)”项内将会发现新的COM口,记录下COM口号;例如,本文新发现的端口为“Arduino Leonardo (COM3)”;
步骤五:对“Arduino Leonardo (COM3)”进行参数配置[正常情况下不需要];操作过程为,相关COM口上右击“属性” --> “端口设置”;正常情况下是不需要的,但为防止特殊情况,本处例出具体参数内容:[位/秒(B):9600]、[数据位(D):8]、[奇偶校验:无]、[停止位(S):1]、[流控制:无];
步骤六:使用ARDUINO的官方配置工具打开[Duckduino-microSD.ino]文件;无此程序请从官方网站自行下载,本文习惯使用绿色版;如ARDUINO提示无法正常打开文件,可新建项目并粘贴相关代码至新项目即可;之后,执行以下操作;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
1.使用ARDUINO程序选择开发板型号,依次选择:"工具" --> "开发板" --> "Arduino Leonardo" 2.选择COM端口[请按实际情况选择]:"工具" --> "端口" --> "COM3 (Arduino Leonardo)" 3.验证设备连接及配置正确性:"工具" --> "取得开发板信息" 本处若能正常弹出开发板信息,则表示设备已正确接入; 4.使用ARDUINO程序对源码进行验证或编译,依次选择:"项目" --> "验证/编译" 如果你能确定代码的正确性,也可直接进行下面的上传操作,这将自动执行前置的编译工作; 5.使用ARDUINO程序将编译后的固件烧录至开发板,依次选择:"项目" --> "上传" 此时只需要等待程序“上传成功”的提示即表示完成,上传成功后将自重置开发板,将有发现新硬件的通知信息; 注意:对开发板进行新的固件烧录,可能引起COM口号变更; |
步骤七:拨出开发板[如果你接口充足也可暂时不用],准备好TF卡及读卡器;将TF卡格式化为FAT32文件系统,然后在TF卡内创建“script.txt”文件并写入如下内容;以下内容即为BADUSB的攻击脚本基础示例,攻击结果为,插入设备后,自动打开“Notepad”并在文本中输入“Hello World !”;
1 2 3 4 5 6 7 8 9 |
DELAY 5000 GUI r DELAY 500 STRING notepad DELAY 500 ENTER DELAY 750 STRING Hello World ! ENTER |
步骤八:从电脑上安全卸载TF卡及开发板设备,将TF卡插入至CJMCU-3212的SD模块上;
步骤九:测试,重新将插好TF卡的开发板接入电脑,你将会看到攻击结果;
最后:补充一些图片说明,自行对以上操作步骤说明;
四、[Duckduino-microSD]项目总结
[Duckduino-microSD]项目实际是[ USB-Rubber-Ducky ]项目的扩展,解决可储存攻击脚本数量上的问题,同时也为同一物理设备上的集成多种攻击手段提供了可能,这是单[ USB-Rubber-Ducky ]项目所不能实现的。单从上面的操作步骤中,你可能并未发现这个项目在使用,实际上,这的确是在使用中,步骤七中,攻击代码的编写格式范本,就是依据[ USB-Rubber-Ducky ]项目而来的。
五、[wifi_ducky]项目说明
本项目使用了CJMCU-3212的主模块与WIFI模块,原理为利用WIFI模块建立一个简单的WEB服务器,再使用浏览器连接至WEB服务器,指定相关的攻击脚本实现对接入设备的攻击。好处很多,可以实现远距离攻击、实时修改脚本内容、指定攻击方法、多脚本等,同时,用于储存BADUSB脚本的空间也比主模块上的空间要多得多。另外说明一点是,由于作者在WEB页面的设计上使用了GOOGLE字体,这导致了该项目在GITHUB上提供的固件并不适合在国内使用,具体表现为,连接至WEB服务器时,由于GOOGLE字体无法正常加载,导致页面打开非常缓慢[实际上如移除了GOOGLE字体,页面加载将非常迅速]。
关于固件烧录,由于[wifi_ducky]项目同时涉及了主模块及WIFI模块,要实现其完整的功能就必需对主模块及WIFI模块分别进行相应固件的烧写,传统方法是主模块固件直接将本开发板接入电脑进行烧录,WIFI模块使用TTL串口线连接本开发板对然后进行固件烧录;以上是正常的操作方式,需要专用的TTL串口烧录器,而且还需要明白烧录器与开发板的具体接线原理[烧录WIFI模块固件时]。然而,本文使用的是更方便的方法,具体原理是首先烧录主模块,将主模块模拟成TTL串口烧录器,然后通过主模块模拟的烧录器向WIFI模块烧录[wifi_ducky]关于WIFI模块的固件,最后,使用[wifi_ducky]项目中的主模块固件替换掉模拟烧录器的固件。以下为具体操作方法。
步骤一:从GITHUB网站的wifi_ducky项目页面下载源码并解压;解压后你将得到如下的目录结构:
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 |
/wifi_ducky-master # 主目录 ├── arduino_wifi_duck # 主模块使用 │ └── arduino_wifi_duck.ino # 用于引导生成主模块的固件 ├── esp8266_wifi_duck # WIFI模块使用 │ ├── data.h # 生成固件时的重要文件 │ ├── esp8266_wifi_duck.ino # 用于引导生成WIFI模块的固件 │ ├── html # WIFI_DUCKY的WEB界面定义 │ │ ├── files │ │ │ ├── functions.js │ │ │ ├── index.html │ │ │ ├── info.html │ │ │ ├── license.txt │ │ │ ├── live.html │ │ │ ├── normalize.css │ │ │ ├── settings.html │ │ │ ├── skeleton.css │ │ │ ├── style.css │ │ │ └── view.html │ │ ├── minifier.html # 格式转换页面[自定义固件用] │ │ └── readme.md # 关于[minifier.html]的使用说明 │ ├── Settings.cpp # SSID名称/密码等配置文件 │ └── Settings.h ├── images │ └── ... ├── LICENSE ├── README.md └── esp8266_wifi_duck_4mb.bin # WIFI模块已编译完成后的固件[需要另外下载] |
步骤二:下载WIFI模块的官方固件“esp8266_wifi_duck_4mb.bin”[ 链接地址 ],你也可以使用上面的源码编译后导出;
步骤三:插入本开发板,使用ARDUINO程序烧录模拟TTL烧录器的固件至主模块,代码如下;关于驱动、验证/编译、及上传固件,参看“三、[Duckduino-microSD]项目说明”的“步骤三”至“步骤六”;
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 |
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()); } } } |
步骤四:以上模拟烧录器的固件烧录成功后,系统将重新加载设备并发现新硬件,同时COM口将变更;本例从“Arduino Leonardo (COM3)”变更为“Arduino Leonardo (COM5)”;
步骤五:拨出开发板,将ESP8266的GPIO0引脚接地,即引脚标识图上的GPIO0与GND短接[两个金属触点][实际上任意GND均可,本开发板主模块与WIFI模块共地][原因:要对ESP8266的MCU进行固件烧录,GPIO0引脚必需接地];重新接入开发板至电脑;
步骤六:使用“ESP8266Flasher_x64”[ 连接地址 ]烧录“esp8266_wifi_duck_4mb.bin”至WIFI模块;注1:"Config"项配置固件位置;注2:"Advanced"项配置烧录参数,分别为[Baudrate:115200]、[Flash size:4MByte]、[Flash speed:80MHz]、[SPI Mode:DIO];注3:"Operation"项配置COM口及烧录开关;
步骤七:拨出开发板,撤除GPIO0与GND的短接,重新接入电脑,烧录“arduino_wifi_duck.ino”至主模块;注意,此时的COM品仍然是“Arduino Leonardo (COM5)”;烧录完成后,系统将重新发现硬件,些是COM口一般将还原为原来的“Arduino Leonardo (COM3)”;
步骤八:使用设备如手机,连接名为“WiFi Duck”的WIFI热点[默认密码“quackquack”],使用浏览器输入“192.168.4.1”进入攻击界面,默认已内置了一个名为“Hello world”攻击脚本,点击“RUN”发送该攻击脚本测试;攻击结果为,自动打开“Notepad”并在文本中输入“Hello World !”;
最后:补充一些图片说明,自行对以上操作步骤说明;
六、[wifi_ducky]项目总结
[wifi_ducky]项目实际也是[ USB-Rubber-Ducky ]项目的扩展,实现了远程攻击手段,也解决原项目攻击目的单一的问题,ESP8266-12E模块的储存空间也相对充足。另外补充一点,使用本文方法在烧录基于主模块的固件时,不需要长按[RESET]键,说明这个问题是因为,很可能入手这一开发板的读者,都是基于某个视频入手的。
关于固件自定义,你可以基于你于HTML及JAVA的理解,去修改"/wifi_ducky-master/esp8266_wifi_duck/html/files/"目录内的文件,相关文件被修改后,需要运行"/wifi_ducky-master/esp8266_wifi_duck/html/minifier.html"更新"/wifi_ducky-master/esp8266_wifi_duck/data.h"文件,详细使用方法参见"/wifi_ducky-master/esp8266_wifi_duck/html/readme.md"
八、攻击效果图示
九、结语
这是基于CJMCU-3212开发板的基本教程,突然写这个的原因是因为关于这开发板的某群群主某天突发其想的将我设了个管理员,于是我想那就写点什么吧~当然另一个原因是我想充实一下这个BLOG。看完这个你能做什么?实际上很可能的结果是,你什么也做不了,这只是一个工具,决定其危害结果是应用于上面的应用,这需要很强的综合知识,反正本文只当这是一个用于学习的工具,区别是,让学习的过程变得更加有趣。
Q群还在吗
2022-12-01 下午8:03那个群已经没人说话的了,没多少人玩这个...
2022-12-23 上午4:39能否做储存卡
2022-05-20 下午12:10不明白你什么意思,如果你指类似U盘,应该可以但绝对性能低得难以接受[数据传输总线的问题];我看到最近B站有个人玩这个玩得很好,你可以去B站请教他~
2022-06-01 上午4:08你好我在淘宝买了一个一模一样的,我一直弄不明白,我有问题请教可以吗
2021-01-07 下午5:26……你直接问啊,看了一眼,我都已经4个月没更新了,没时间管这个博客了~我也想继续写些搭建教程,不过现在的公司真的忙~~
2021-01-27 下午9:38