CS4.5优化Beacon回显编码
2022-9-30 00:1:56 Author: NOVASEC(查看原文) 阅读量:26 收藏

△△△点击上方“蓝字”关注我们了解更多精彩
0x00 免责声明

在学习本文技术或工具使用前,请您务必审慎阅读、充分理解各条款内容。

1、本团队分享的任何类型技术、工具文章等文章仅面向合法授权的企业安全建设行为与个人学习行为,严禁任何组织或个人使用本团队技术或工具进行非法活动。

2、在使用本文相关工具及技术进行测试时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。如您仅需要测试技术或工具的可行性,建议请自行搭建靶机环境,请勿对非授权目标进行扫描。

3、如您在使用本工具的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。

4、本团队目前未发起任何对外公开培训项目和其他对外收费项目,严禁任何组织或个人使用本团队名义进行非法盈利。

5、本团队所有分享工具及技术文章,严禁不经过授权的公开分享。

如果发现上述禁止行为,我们将保留追究您法律责任的权利,并由您自身承担由禁止行为造成的任何后果。

0x01 前言
国庆预备愿祖国:和平长久,繁荣昌盛,天耀祖国,不负韶华,山河远阔,国泰民安。NOVASEC 祝大家国庆节快乐!!!
题外话:CS4.5系列存稿的最后一篇,即将休假,提前发送。
CS4.5以后的版本都是二进制打包的服务端,目前来看没有什么我会改的地方,因此准备逐步往开源C2靠近。希望大家能给我推荐一些开源C2框架,最好是也支持:shellcode导出、dotnet执行、dll反射、BOF等功能。感激不尽!!!!
很前些日子,公众号[安全的矛与盾]分享了一个关于HW礼包的文章,其中有一个关于CobalStrike4.5 Agent [Attack2DefenseAgent].
其中描述了javaagent的两项新增功能:
1、回传数据解析编码设置,命名为setchar
setchar能够将回传数据的解析编码改为UTF-8此时可在console当中显示UTF-8编码的中文字符。
2、CS自带的一些功能的绕过360核晶开关。命名为bypass360
实质就是修改默认的进程注入方法从spawn方法修改为inject方法。这个修改在CS4.5上是可有可无的,因为CS4.5默认的注入方式就是使用inject
感觉setchar的功能还可以,因此也分析实现了一下。
整体比较复杂,就不讲实现逻辑了,有需求的可以看参考文献,以下是修改的代码文件。
0x02 scripts/default.cna 客户端UI显示setchar命令

menu "Soldier " {    # Last Soldier       item "&Setchar" {           $bid = $1;           $dialog = dialog("Setchar", %(charsets => ""), &Setchar);           dialog_description($dialog, "Set the Beacon's Charset ");           drow_combobox($dialog, "charsets", "charset:", @("", "UTF-8", "GBK", "GB2312", "GB18030", "ISO-8859-1", "BIG5", "UTF-16", "UTF-16LE", "UTF-16BE"));           dbutton_action($dialog, "Setchar");           dialog_show($dialog);       }
sub Setchar { binput($bid, "setchar $3['charsets']"); beacon_setchar($bid, $3['charsets']); }}
0x03 aggressor/windows/BeaconConsole 增加命令

//新增setcharelse if (var11.is("setchar")) {   if (var11.verify("Z")) {      var4 = var11.popString();      this.master.setChar(var4);   } else if (var11.isMissingArguments()) {      this.master.setChar("");   }}
0x04 aggressor/windows/SecureShellConsole 增加命令

//新增 setchar else if (var8.is("setchar")) {   if (var8.verify("Z")) {      var4 = var8.popString();      this.master.setChar(var4);   } else if (var8.isMissingArguments()) {      this.master.setChar("");   }}
0x05 aggressor/browsers/Sessions 客户端显示

protected String[] cols = new String[]{" ", "external", "internal", "listener", "user", "computer", "charset", "note", "process", "pid", "arch", "last"};
0x06 common\BeaconEntry 功能修改增加

//新增 setCharset 函数public void setCharset(String var1) {   this.chst = var1;}
注意:类本身已存在其他功能,因此只需要添加set函数。实质就是修改和调用 this.chst 这个变量
0x07 server\Beacons 功能增加

//新增 charsets HashMapprotected HashMap charsets;

//public void register 新增存入set_char键值对var1.put("beacons.set_char", this);

//   public Map buildBeaconModel()   新增 获取 charsets值String var5 = (String)this.charsets.get(var4.getId());if (var5 != null && !var5.equals("")) {   var4.setCharset(var5);} else {   var4.setCharset(var4.getCharset());}

// public Beacons(Resources var1)  新增 赋值 charsetsthis.charsets = new HashMap();

//新增setChar函数public void setChar(String var1, String var2) {   synchronized(this){}   try {      var2 = var2.toUpperCase();      this.charsets.put(var1, var2);      this.setup.getController().setCustomCharset(var1, var2);   } catch (Throwable var5) {      throw var5;   }}

//新增 set_char 函数处理else if (var1.is("beacons.set_char", 2)) {   this.setChar((String)var1.arg(0), (String)var1.arg(1));}
0x08 beacon\BeaconC2 功能增加

// public class BeaconC2  新增 customCharsets 变量protected HashMap customCharsets;

// public BeaconC2(Resources var1)  新增 customCharsets 赋值this.customCharsets = new HashMap();

//新增 setCustomCharset 函数public void setCustomCharset(String var1, String var2) {   var2 = var2.toUpperCase();   this.customCharsets.put(var1, var2);}

// Last Soldier getCharsets编码注册逻辑String var13 = (String)this.customCharsets.get(var12.getId());
if (!var12.sane()) { CommonUtils.print_error("Session " + var12 + " metadata validation failed. Dropping"); return null;} else { //this.getCharsets().register(var12.getId(), var9, var10); //修改 getCharsets编码注册逻辑 =============== if (var13 != null && !var13.equals("")) { this.getCharsets().register(var12.getId(), var13, var13); } else { this.getCharsets().register(var12.getId(), var9, var10); } //修改 getCharsets编码注册逻辑 ===============
0x09 common\BeaconOutput 功能增加

   //public String eventName() 新增 set_charcase 13:   return this.prefix("set_char");


//新增 SetChar 命令 调用函数public static final BeaconOutput SetChar(String var0, String var1) {   return new BeaconOutput(var0, (short)13, var1);}
0x10 aggressor\bridges\BeaconBridge 功能调用

//public void scriptLoaded(ScriptInstance var1)  存入 beacon_setcharCortana.put(var1, "&beacon_setchar", this);

// public Scalar evaluate(String var1, ScriptInstance var2, Stack var3) 新增 beacon_setchar 命令处理if (var1.equals("&beacon_setchar")) {   String[] beaconIds = bids(var3);   String argument = BridgeUtilities.getString(var3, "");   for(int index = 0; index < beaconIds.length; ++index) {      this.conn.call("beacons.set_char", CommonUtils.args(beaconIds[index], argument));      this.conn.call("beacons.log_write", CommonUtils.args(BeaconOutput.SetChar(beaconIds[index], argument)));   }}
0x11 beacon/TaskBeacon.java 功能调用

///新增 setChar 处理函数public void setChar(String var1) {   for(int var2 = 0; var2 < this.bids.length; ++var2) {      this.conn.call("beacons.set_char", CommonUtils.args(this.bids[var2], var1));      this.conn.call("beacons.log_write", CommonUtils.args(BeaconOutput.SetChar(this.bids[var2], var1)));   }}
0x12 修改测试

0x13 参考文档
CobaltStrike Charset Improvementhttps://xz.aliyun.com/t/11055
Cobalt Strike快乐星球https://mp.weixin.qq.com/s/v3e2Ac5WRFsk_iVNORog5Q

如您有任何投稿、问题、建议、需求、合作、请后台留言NOVASEC公众号!

或添加NOVASEC-余生 以便于及时回复。

感谢大哥们的对NOVASEC的支持点赞和关注

加入我们与萌新一起成长吧!

本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!!


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzODU3ODA0MA==&mid=2247488248&idx=1&sn=249e7099b142688761a000e682e5dd05&chksm=fad4cfefcda346f9179db4c62d2325fdd088858b4a7af2191215e666457b2d9a9eb62b8f7cc1#rd
如有侵权请联系:admin#unsafe.sh