暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Cobalt Strike 定制化开发(部分bug修复)完整版

猫头鹰安全团队 2022-09-15
4084

简介

    Cobalt Strike是一款多功能的命令控制形式的后门工具,用于内网渗透、横向移动、后门植入、后渗透等等。其功能与插件市场非常庞大是目前综合能力最为优异的后门管理工具。但是CS从3.x版本到CS4.6,该工具的GUI界面都是默认的Synthetica主题,这样很容易导致安全从业人员 “审美疲劳” 这么优秀的工具不能使用这么差劲的主题,所以本文主要是针对CS进行二次开发修改其GUI界面美化。

图1:CS默认主题

这里使用CS4.5,另外放出4.5 不依赖CSAgent方法直接实现破解。还有就是为什么对4.5进行修改,其实4.6 4.7也可以改,但是考虑到CS官方对teamserver进行了二进制转换也就是编译jvm虚拟机,直接将teamserver的class编译进去,这样子二次开发有很大的局限性,而且也没有key,如果进行二次开发会很困难。所以这里使用4.5。

环境搭建

    环境搭建主要是以搭建二次开发环境为基准,基本网上有很多方法。

    首先就是反编译CS的jar包,因为jar是对一群class文件进行打包然而class是一组编码形式呈现所以需要进行反编译转为java源代码,这样子好对CS进行源码修改。

    使用工具:
    • IDEA
    • CS原版包

    首先在IDEA的安装目录找到java-decompiler.jar  文件所在路径:..\JetBrains\IntelliJ IDEA 2022.1\plugins\java-decompiler\lib 。并且新建两个目录 一个bin用于存放原版jar包,一个src用于存放反编译后的文件。将java-decompiler.jar存放在src与bin同一级目录

图2:目录结构

执行反编译命令:

    java -cp java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dsg=true bin/cobaltstrike.jar src
    复制

        只要不出现异常中断,能够运行完,基本反编译成功。通过src发现还是一个jar文件,其实是一个反编译后的通过解压即可。

    图3:jar文件内容

        接着打开idea,新建一个工具,使用默认即可 不推荐使用maven等等。通过手工搭建。如果修改东西,将源码从decompile复制到src修改即可。

        在工程文件夹里构造以下目录结构

      • lib   存放原版jar包

      • decompile 反编译文件的内容(解压)

      • src 源码(修改点)

        

    图4:工程文件夹结构

    将decompile/aggressor.Aggressor.java 复制到src/aggressor.Aggressor.java

    回到idea 菜单栏打开文件(File)-》项目结构(Project Structure),打开模块(Module)选项 点击依赖(dependencies)将jar文件加进去。这个依赖主要是编译打包目标(简单理解)

    图5:添加依赖

    并且点击制品(artifact)添加JAR 以模块依赖方式导入,选中aggressor.Agressor即可,这个主要是生成jar包的设置

    ide

    这样子可以使用菜单栏的Build里面Build Arifact进行jar打包了。结果会在out里面。启动文件使用打包的jar即可。


    Crack Cobalt Strike

        破解CS主要是使用修改认证函数即可,并且还有很多暗桩查找System.exit对着改就行了。

        修改common/Authorization.java里的构造函数即可:

      protected String watermarkHash = "BeudtKgqnlm0Ruvf+VYxuw==";
      public Authorization() {
      try {
      this.watermark=100000;
      this.validto="forever";
      this.valid = true;
      final byte[] bytes = {-13, -114, -77, -47, -93, 53, -78, 82, -75, -117, -62, -84, -34, -127, -75, 66};
      common.MudgeSanity.systemDetail("valid to", "perpetual");
      common.MudgeSanity.systemDetail("id", String.valueOf(this.watermark));
      SleevedResource.Setup(bytes);
      }
      catch (Exception ex2) {
      MudgeSanity.logException("auth file parsing", ex2, false);
      }
      }


      复制
         其中byetes变量是密钥 对sleeve修改用帮助可以自己留着用。修改这个地方还有一些暗桩就可以实现破解了。


      CS主题修改

          通过源码分析,发现CS采用swing为图形界面框架,所以我们修改的话,可以使用针对swing的主题框架即可。这里使用FlatLaf作为演示,这里我使用暗黑主题。

          下载jar文件,不建议使用maven容易出问题。直接下载jar文件即可。

          并且导入到依赖和打包。

      图6:FlatLaf依赖

      图7:FlatLaf打包设置

      注意:如果不加入打包,虽然编译可以正常运行,但是会找不到定义也就是加载会失败。

      然后在入口函数加入setup函数即可。

      图8: 加入代码

      然后主题设置起了作用,但是出现了bug。

      Session图标重复显示 Target重复显示。文件浏览器图标显示不全  还有 表格白底影响美观。

      如以下图片:

      图9: Session列表图标

      图10: Target图标

      图11: 文件浏览器图标

      图12:表格白底

      以上Bug,我们直接少废话直接解决。

      Session修复

      通过在Sessions.java的getContent函数添加代码即可修复Sessions。


      添加代码:

        this.table.getColumnModel().getColumns().asIterator().forEachRemaining(new Consumer<TableColumn>() {
        public void accept(TableColumn tableColumn) {
        tableColumn.setCellRenderer(new TableCellRenderer() {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component tableCellRendererComponent = table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        ((JLabel)tableCellRendererComponent).setIcon((Icon)null);
        return tableCellRendererComponent;
        }
        });
        }
        });
        复制

        图13:修复Session

        Target修复

        通过修改Targets.java 的getContent函数的表格属性即可修复。

        修复代码:

          this.table.getColumn("address").setCellRenderer(ATable.getSimpleTableRenderer());
          this.table.getColumn("name").setCellRenderer(ATable.getSimpleTableRenderer());
          this.table.getColumn("note").setCellRenderer(ATable.getSimpleTableRenderer());
          复制

          图14:修复Targets

          文件浏览器

          文件浏览器在入口函数调用FlatLaf的setup处修改为以下代码即可修复:

            ParserConfig.installEscapeConstant('c', "\u0003");
            ParserConfig.installEscapeConstant('U', "\u001f");
            ParserConfig.installEscapeConstant('o', "\u000f");
            (new UseSynthetica()).setup();
            Object DirIcon = UIManager.get("FileView.directoryIcon");
            Object DirIcon2 = UIManager.get("FileView.fileIcon");
            Object DirIcon3 = UIManager.get("FileView.computerIcon");
            Object DirIcon4 = UIManager.get("FileView.hardDriveIcon");
            Object DirIcon5 = UIManager.get("FileView.floppyDriveIcon");
            Requirements.checkGUI();
            try {
            FlatDarkLaf.setup();
            UIManager.put("FileView.directoryIcon",DirIcon);
            UIManager.put("FileView.fileIcon",DirIcon2);
            UIManager.put("FileView.computerIcon",DirIcon3);
            UIManager.put("FileView.hardDriveIcon",DirIcon4);
            UIManager.put("FileView.floppyDriveIcon",DirIcon5);
            } catch( Exception ex ) {
            System.err.println( "Failed to initialize LaF" );
            }
            复制

            图15:修复文件浏览器

            表格白底

            通过修复ui.ATable.java 大伙可以找到getTableCellRendererComponent定位

            修改代码:

              public Component getTableCellRendererComponent(JTable var1, Object var2x, boolean var3, boolean var4, int var5, int var6) {
              if (var2x == null) {
              var2x = "";
              }


              Component var7 = var2.getTableCellRendererComponent(var1, var2x, var3, false, var5, var6);
              Object var8 = ((GenericTableModel)var1.getModel()).getValueAtColumn(var1, var5, "_accent");
              if (!var3) {
              if ("neutral".equals(var8)) {
              var7.setForeground(ATable.FORE_NEUTRAL);
              var7.setBackground(ATable.BACK_NEUTRAL);
              } else if ("bad".equals(var8)) {
              var7.setForeground(ATable.FORE_BAD);
              var7.setBackground(ATable.BACK_BAD);
              } else if ("good".equals(var8)) {
              var7.setForeground(ATable.FORE_GOOD);
              var7.setBackground(ATable.BACK_GOOD);
              } else if ("ignore".equals(var8)) {
              var7.setForeground(ATable.FORE_IGNORE);
              var7.setBackground(ATable.BACK_IGNORE);
              } else if ("cancel".equals(var8)) {
              var7.setForeground(ATable.FORE_CANCEL);
              var7.setBackground(ATable.BACK_CANCEL);
                          } else {//关键点
              var7.setForeground(Color.BLACK);
              //var7.setBackground(ATable.this.alternateBackground ? ATable.A : Color.WHITE);
              }
              } else if ("neutral".equals(var8)) {
              var7.setForeground(ATable.BACK_NEUTRAL);
              } else if ("bad".equals(var8)) {
              var7.setForeground(ATable.BACK_BAD);
              } else if ("good".equals(var8)) {
              var7.setForeground(ATable.BACK_GOOD);
              } else if ("ignore".equals(var8)) {
              var7.setForeground(ATable.BACK_IGNORE);
              } else if ("cancel".equals(var8)) {
              var7.setForeground(ATable.BACK_CANCEL);
              }


              return var7;
              }
              });
              }


              复制

              图16:修复白底

              图标替换

              图标修改主要是修改resource的文件即可。这里直接找尊师的照片转化为png并且替换掉原本的文件即可修改。

              图17:图标替换

              最终效果

              图18:最终效果

              总结

              本文就不多修复特征类的了,网上有很多包括也可以自己阅读cloudstrike的代码也可以实现。这里谢谢大家支持,感谢。



              文章转载自猫头鹰安全团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论