Cobalt strike3.8 中文支持
Evi1cg 嘶吼专业版
0x00 简介
cobaltstrike3.10 已经出来很久了,其中最吸引人的可能就是他已经支持中文了,但是貌似很久以来都没在网上看到3.10的资源,所以就没办法,拿手上的3.8 改改将就用。
0x01 反编译
首先我们要对cobaltstrike3.8进行反编译,这里可以参照之前破解的方法,戳我,使用jad进行反编译。
0x02 修改代码
要怎么定位到要改哪里呢? 我们可以看一下CS的输出:
可以看到在输出之前有received output,所以我们就可以检索这个关键字,马上可以定位到BeaconC2.class文件,搜索“received output”一共有5个结果:
v
查看代码如下:
可以看到,输出的结果是由CommonUtils类的bString方法返回的,定位到CommonUtils.class文件查看代码:
可以看到传过来的数据使用 ISO8859-1 进行了编码。ISO8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显, ISO8859-1 编码表示的字符范围很窄,无法表示中文字符。这就是CS无法显示中文的原因。经过测试,使用 ISO8859-1 进行中间编码是不会导致数据丢失的。那么我们是不是可以修改代码把编码转过来来呢?当然可以 !
但是由于自己比较菜,直接修改CommonUtils.java以后编译不过去(表示很难受,如果你会编译,还希望不吝赐教)。所以只能去修改BeaconC2.java。
经过多次测试,发现在CS上执行命令以后返回的结果编码为GBK,所以转码过程为 CommonUtils.java转码:
GBK -> ISO8859-1
我们要修改的BeaconC2.
ISO8859-1 -> GBK -> UTF-8
所以思路就很明朗了,我们只需要在传入rest之前把中文转换成UTF-8就可以了,代码也很简单,测试如下:
所以关键代码为:
String tmp = CommonUtils.bString(CommonUtils.readAll(in)); String tmp1 = new String(tmp.getBytes("ISO8859-1"),"gbk"); String rest = new String(tmp1.getBytes(),"utf-8");
源代码是这样:
修改以后是这样:
所以找到所有的:
String rest = CommonUtils.bString(CommonUtils.readAll(in
替换即可。
0x03 编译替换
修改以后,需要把BeaconC2.java编译之后替换原来的BeaconC2.class。编译方法很简单,只需要把BeaconC2.java放到解压以后的CS目录,执行以下命令:
javac -classpath . BeaconC2.java -Xlint:unchecked
在这里,可能会碰到以下报错
这里可以改一下代码,将
import c2profile.MalleableHook.MyHook; import dns.DNSServer.Handler;
改为:
import c2profile.MalleableHook; import dns.DNSServer;
在进行编译即可。之后将原来的BeaconC2.class替换,我们的CS就修改完成了。
0x04 效果
这里录了一个DEMO:
这里就不给下载链接了,小伙伴自己改改吧,改了以后如果还有什么乱码,麻烦反馈一波。
查看更多关于Cobalt strike3.8 中文支持的详细内容...