前言
一波三折终于破解成功,这里特别感谢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->Modules
对Dependencies
进行设置
点击+号选择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相关问题