Cobalt Strike破解过程

前言

  一波三折终于破解成功,这里特别感谢CSTips的环境搭建,非常良心,非常详细。但有些坑没有说。就顺便记录一下。

环境搭建

  原版cobaltstrike.jar我已经放到github上了,用之前先校验一下sha256,在此感谢放出原版的师傅们。如果在搭建环境中有疑惑,就看CSTips的环境搭建视频。
  建议使用jdk 1.8.0版本,一台电脑可装多个jdk,不冲突。
  其实想破解cs 4.4的,可惜一直找不到原版。cs 4.3原版sha256 hash如下

c3c243e6218f7fbaaefb916943f500722644ec396cf91f31a30c777c2d559465

  使用certutil -hashfile cobaltstrike.jar SHA256,进行校验。对比与原版hash一样。
  
  这里要用到IDEA自带了一个反编译java的工具java-decompiler.jar。在file->settings->Plugins进行安装,我这里已经安装好了。
  
  安装好的插件路径为IDEA\plugins\java-decompiler\lib\java-decompiler.jar,先准备好后面要用到。
  新建两个文件夹,一个cs_bin里面放原版cs,一个cs_src放之后反编译过后的cs。在将java-decompiler.jar放到根目录。目录结构如下。

cobaltstrike
├─cs_bin
│   └─ cobaltstrike.jar
└─cs_src
└─java-decompiler.jar

  在根目录输入以下命令,意思是将cs_bin/cobaltstrike.jar进行反编译,反编译后的文件放到cs_src文件夹中

java -cp java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cs_bin/cobaltstrike.jar cs_src/

  
  稍等几分钟,文件输出到cs_src/cobaltstrike.jar,查看jar文件,可看到都是.java文件,这个就是cs的源代码了。
  
  打开IDEA,在file->new->project新建一个项目,直接点击next
  
  选择保存路径的路径和项目名后,点击Finish
  
  创建好后需要先建立两个文件夹,右击选择New->Directory建立一个decompiled_src文件夹,之后再建立一个lib文件夹
  
  把反编译好的cs_src/cobaltstrike.jar,复制到decompiled_src中,然后把它解压出来,可看到一个完整的反编译后的目录
  
  随后把原始的cs_bin/cobaltstrike.jar,复制到lib
  
  接下来点击File->Project Structure->ModulesDependencies进行设置
  
  点击+号选择JARs or Directories...
  
  选择lib中的cobalt strike.jar,点击ok
  
  确认是Complie之后再勾选上,点击Apply后点击OK
  
  打开lib->META-INF->MANIFEST.MF,可以看到Main Class,复制aggressor.Aggressor
  
  至此依赖关系设置完了,现在进入File->Project Structure->Artifacts—>JAR—>From modules with dependencies
  
  Main Class填入aggressor.Aggressor,点击ok,再点击Apply这里就设置好了
  
  接下来到decompiled_src/aggressor/Aggressor.java,右键选择Refactor->Copy File
  
  点击To directory右边的...
  
  选中src在点击红圈中的新建目录
  
  创建aggressor名字必须要一致,意思是,如果是在aggressor下拷贝的文件就要放在src/aggressor下。如果是在aggressor/bridges下拷贝的文件,就要放在src/aggressor/bridges下。目录结构必须保持一致。
  
  确保放在aggresso目录下后,点击ok
  
  Aggressor.java就被拷贝到src/aggressor,并且自动打开了Aggressor.java
  
  接下来是非常关键的一步,很多博客都没有提,并且CSTip的视频都是在最后的最后才提到的。
  打开decompiled_src/META-INF/MANIFEST.MF,把里面的所有内容复制
  
  打开src/META-INF/MANIFEST.MF,把里面的内容全部删除掉,然后粘贴刚刚复制的内容
  
  之后就是我们要修改哪个文件,就可以在完整的源码中找到那个文件,然后右键Refactor然后Copy File到这个目录然后进行修改,修改完成之后就可以选Build—>Build Artifacts—>Build进行编译
  
  左下角提示Build completed successfully,就说明编译完成
  
  会生成一个out文件夹,里面的project.jar就是我们破解好的cs文件,等后面破解好了重命名成cobaltstrike.jar即可
  
  点击Run->Profile->Edit Configurations...设置参数
  
  点击+号,选择JAR Application
  
  Name可以随便输入,我输入的是MyCs,在Path to JAR中选择out中我们修改并编译好的jar包,选择好后点击Apply
  
  
  最后在Run中选择Run MyCS
  
  出现此对话框,是正常现象
  
  继续配置jar启动项,再次点击Run->Profile->Edit Configurations...VM options填入-XX:+AggressiveHeap -XX:+UseParallelGC,填入后,点击Apply
  
  再次运行Run->Run MyCS,提示找不到cobaltstrike.auth,看第25行。这是cs的认证专门防止白嫖怪。想理解认证过程的参考我后面放的文章,这里不再讲述。
  

生成认证文件

  这里已经有师傅写好了生成认证文件的代码,直接拿来用即可。新建一个RSAKeyPairGenerator.java文件,内容如下。

import common.CommonUtils;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.*;
import java.security.*;
import java.util.Base64;

public class RSAKeyPairGenerator {
    private PrivateKey privateKey;
    private PublicKey publicKey;

    public RSAKeyPairGenerator() throws NoSuchAlgorithmException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        KeyPair pair = keyGen.generateKeyPair();
        this.privateKey = pair.getPrivate();
        this.publicKey = pair.getPublic();
    }

    // 将byte 写入文件
    public void byte2File(String path, byte[] data) throws IOException {
        File f = new File(path);
        f.getParentFile().mkdirs();

        FileOutputStream fos = new FileOutputStream(f);
        fos.write(data);
        fos.flush();
        fos.close();
    }

    public PrivateKey getPrivateKey() {
        return privateKey;
    }

    public PublicKey getPublicKey() {
        return publicKey;
    }

    // 加密数据
    public byte[] encryptPri(byte[] data, PrivateKey privateKey) throws BadPaddingException, IllegalBlockSizeException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, this.privateKey);
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException, IllegalBlockSizeException, InvalidKeyException, NoSuchPaddingException, BadPaddingException {
        RSAKeyPairGenerator PairGenerator = new RSAKeyPairGenerator();
        //byte[] data = {-54, -2, -64, -45, 0, 77, 1, -55, -61, 127, 0, 0, 0, 1, 43, 16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103 };
        byte[] data ={-54, -2, -64, -45, 0, 77, 1, -55, -61, 127, 0, 0, 0, 1, 43, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103};
        byte[] rsaByte = PairGenerator.encryptPri(data, PairGenerator.getPrivateKey());
        PairGenerator.byte2File("RSA/cobaltstrike.auth", rsaByte);
        PairGenerator.byte2File("RSA/authkey.private", PairGenerator.getPrivateKey().getEncoded());
        PairGenerator.byte2File("RSA/authkey.pub", PairGenerator.getPublicKey().getEncoded());
    }
}

  为了方便运行,放在src
  
  打开RSAKeyPairGenerator,右键Run RSAKeyPairGene....main()
  
  成功运行后,会在根目录下生成RSA文件夹
  
  为了能和cs原目录结构保持一致,先将RSAKeyPairGenerator.java删除掉,再将decompiled_src/common/AuthCrypto.java复制到src/common/AuthCrypto,再在src新建一个resources目录。再将RSA/authkey.pub复制到resources
  
  使用certutil -hashfile authkey.pub MD5,计算RSA/authkey.pub的MD5,每个人算出来的都不一样,我这里是8f9f024ee785de97cd9830e28b991468
  
  打开src/common/AuthCrypto来到第28行,将里面的值替换成刚刚算出来的md5的值
  
  最后将RSA/cobaltstrike.auth复制到out文件下,和编译好的jar包同一目录。
  
  重新Build—>Build Artifacts—>Build进行编译,再次Run,成功运行起来。至此环境搭建彻底结束。
  

正式破解

  记得从decompiled_src目录下拷贝对应的文件过来,修改src/common/Authorization.java,watchmark 改为1,vaild 改为true
  
  修改src/beacon/BeaconData.java,this.shouldPad = false,修复自动退出beacon的问题
  
  到这里就正式破解结束了!!!

生成cobaltstrike.exe

  你会发现搞完后,只有一个破解好的jar包。而网上的cs破解的文件目录结构如下。所以先去网上下载破解文件,后面要用。

cobaltstrike4.3
├─ third-party
│    ├─ README.winvnc.txt
│    ├─ winvnc.x64.dll  vnc服务端dll
│    └─ winvnc.x86.dll
├─ agscript  扩展脚本
├─ c2lint    检查C2文件配置
├─ cobaltstrike        客户端启动脚本
├─ cobaltstrike.auth   认证密钥文件
├─ cobaltstrike.exe
├─ cobaltstrike.jar    主程序jar包
├─ icon.jpg
├─ license.pdf
├─ peclone
├─ start.sh 
├─ teamserver          服务端启动脚本
├─ update               更新脚本
├─ update.bat
└─ update.jar

  将jar生成为exe要用到,exe4j。下载完成后,来到主界面,点击右下角的Change License
  
  License key输入 L-g782dn2d-1f1yqxx1rv1sqd,Name和Company随便输入,至此已经能正常使用exe4j了
  
  选择"JAR in EXE" mode
  
  项目名随便填。输出路径,我保存到桌面
  
  Executable name 填cobaltstrike,Icon File为exe添加图标,使用在线格式转换,将破解文件里面的icon.jpg转为icon.icon。
  
  64位电脑就勾上,生成64位程序
  
  继续来到此界面,VM Parameters填入-XX:+AggressiveHeap -XX:+UseParallelGC后,再点击右边的+号
  
  
  选择out文件夹下,我们已经破解好的jar包,点击ok
  
  Main class from填入aggressor.Aggressor,或者点击最右边的...选择aggressor.Aggressor
  
  Minimum version 允许最低jre填入1.5
  
  只保留Search Windows registry,其他的全部删除,然后点击右边的+号
  
  这里选择jdk或者jre的目录,不知道路径的可以先在idea运行一遍,底下就有路径信息
  
  
  将jdk移到第一行
  
  选择Client hotspot VM
  
  文章中没有提到的部分就直接默认,然后一步一步next,最后finish就可以生成exe了。
  成功生成了cobaltstrike.exe
  
  最后将out下破解好的jar,复制粘贴,重命名成cobaltstrike.jar,将cobaltstrike.exe复制进此目录。这个时候就可以双击运行cobaltstrike.exe
  
  一切正常后,将cobaltstrike.exe,cobaltstrike.auth,cobaltstrike.jar,复制替换进网上下载好的破解文件即可。
  
  大功告成,收工!

参考文章与鸣谢

RedCore红队学院CSTips
【知识回顾】Cobalt Strike 4.0 认证及修补过程
CobaltStrike 4.3 破解及Sleeve相关问题

查看评论 -
评论