Cobalt strike3.8 中文支持(Update)
in 工具收集 with 17 comments

Cobalt strike3.8 中文支持(Update)

in 工具收集 with 17 comments

0x00 简介

cobaltstrike3.10 已经出来很久了,其中最吸引人的可能就是他已经支持中文了,但是貌似很久以来都没在网上看到3.10的资源,所以就没办法,拿手上的3.8 改改将就用。

0x01 反编译

首先我们要对cobaltstrike3.8进行反编译,这里可以参照之前破解的方法,戳我,使用jad进行反编译。

1522336230599.png

0x02 修改代码

要怎么定位到要改哪里呢?
我们可以看一下CS的输出:

1522336286954.png

可以看到在输出之前有received output,所以我们就可以检索这个关键字,马上可以定位到BeaconC2.class文件,搜索“received output”一共有5个结果:

1522336540818.png

查看代码如下:

1522336597408.png

可以看到,输出的结果是由CommonUtils类的bString方法返回的,定位到CommonUtils.class文件查看代码:

1522336678669.png

可以看到传过来的数据使用 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就可以了,代码也很简单,测试如下:

1522337535419.png)

所以关键代码为:

String tmp = CommonUtils.bString(CommonUtils.readAll(in));
String tmp1 = new String(tmp.getBytes("ISO8859-1"),"gbk");
String rest = new String(tmp1.getBytes(),"utf-8");

源代码是这样:

1522337880400.png

修改以后是这样:

1522337852391.png

所以找到所有的:

 String rest = CommonUtils.bString(CommonUtils.readAll(in));

替换即可。

0x03 编译替换

修改以后,需要把BeaconC2.java编译之后替换原来的BeaconC2.class。编译方法很简单,只需要把BeaconC2.java放到解压以后的CS目录,执行以下命令:

javac -classpath . BeaconC2.java -Xlint:unchecked

在这里,可能会碰到以下报错

1522338365724.png

这里可以改一下代码,将

import c2profile.MalleableHook.MyHook;
import dns.DNSServer.Handler;

改为:

import c2profile.MalleableHook;
import dns.DNSServer;

在进行编译即可。之后将原来的BeaconC2.class替换,我们的CS就修改完成了。

0x04 效果

这里录了一个DEMO:

CS.gif

0x05 纠错

经过小伙伴的反馈以及我自己的测试,发现这么粗暴的改是有问题的,如果把所有输出的编码都改了,会使得程序流程走不通,部分功能不能使用,所以还是要针对性的修改。也就是在BeaconC2.class 中修改想要的输出部分,首先,检索received output, 把其对应的

 String rest = CommonUtils.bString(CommonUtils.readAll(in));

替换,之后经过测试 type == 22 是回显文件列表的,所以我们只需要修改这部分就好了。如下图:

1522599287195.png

这样就不会造成程序其他功能上的错误了。关于上传,下载,执行等,都写在TaskBeacon.class 里面,可以针对性对其编码进行修改。这里就不详细说明了,有兴趣的可以自己去读一下代码,关于文件浏览,我们可以定位到
aggressor/windows/FileBrowser.class,其双击事件代码如下:

1522637355520.png

调用了ls 方法:

1522637409194.png

ls 方法调用了 beacons.task_ls,快速定位到server/Beacons.class, 由于双击事件是取得返回转码以后的文字,所以要让功能正常使用,我们需要再将编码转回去,修改如下:

1522637549907.png

这样就可以正常使用文件浏览功能了,以上替换的class文件已经推到了github,欢迎小伙伴一起来修改bug~

GITHUB:

Responses
  1. soulflag

    我缺啥,师傅弄啥,666

    Reply
  2. soulflag

    显示是没问题列,文件浏览 ,进不去文件夹了,依旧乱码

    Reply
    1. @soulflag

      更新了一下,可以cd到目录以后在打开文件浏览查看。

      Reply
    2. @soulflag

      已更新github。

      Reply
  3. 我直接用师傅GitHub的class不行啊

    Reply
    1. @Lucifer

      咦。是什么情况呢?

      Reply
      1. @Evi1cg

        师傅能发我邮箱一份吗。我这里改了半天还是不行,乱码呢

        Reply
      2. @Evi1cg

        难道是因为我电脑是win,不应该啊,难受,很难受

        Reply
        1. soulflag
          @Lucifer

          改完以后 ,服务器那边也要替换成修改后的cs

          Reply
          1. @soulflag

            nice,谢谢师傅

            Reply
  4. gorgias

    使用javassist可以修改common.CommonUtils的的bString方法,只修改这个好像没什么反应

    Reply
    1. gorgias
      @gorgias

      直接修改bString的话Listener会用不了,还是根据需要一个一个改吧

      Reply
  5. 我是小白

    一个小地方忘记了大神,keystrokes 回显中文乱嘿嘿。

    Reply
    1. @我是小白

      已更新。

      Reply
  6. 我是小白

    CommonUtils.class 貌似是这个文件导致,不替换次文件政策

    Reply
    1. @我是小白

      你用git新更新的那几个文件替换

      Reply
  7. fengzi

    表哥能不能把你的插件分享一下,为什么我的右键是英文的呢。。。

    Reply