Cobalt Strike 4.0 破解记录

跟着老哥们一步一步的破解 Cobalt Strike 4.0

准备

使用 Java 8 环境:



使用默认版本(java14)的时候报错

1
Exception in thread "main" java.lang.NoClassDefFoundError: sun/swing/plaf/synth/SynthIcon

创建一个文件夹用来放置项目(cs4),在其中新建两个文件夹分别用来放置原版 jar 和反编译后的 jar

复制 java-decompiler.jar 到项目文件夹(cs4)

1
$ cp /Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar ~/cs4/cs_src

结构

1
2
3
4
5
cs4
├── cs_bin
│   └── cobaltstrike.jar (原版)
├── cs_src
└── java-decompiler.jar

反编译

反编译原版 Jar 到另一个文件夹

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

结构

1
2
3
4
5
6
cs4
├── cs_bin
│   └── cobaltstrike.jar(原版)
├── cs_src
│   └── cobaltstrike.jar (反编译后)
└── java-decompiler.jar

项目准备

创建一个新的文件夹,名字为 crackCS, 打开 Idea 新建工程,创建一个普通的 java 项目(全部 next),把路径设置到我们刚新建的 crackCS 文件夹,在 crackCS 中再创建一个文件夹 decompiled_src 存放我们逆向之后的源码,把 反编译后 的 jar 放到这个文件夹并解压,之后再创建一个 lib 文件夹,用于存放我们的 原版 Jar。lib 位置在哪里都可以,后面会用到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cs4
├── crackCS
│   └── decompiled_src
│   ├── LICENSE.txt
│   ├── META-INF
...
│   ├── lib
│ └── cobaltstrike.jar (放在 crackCS 内 )
│   ├── libicmp.so
│   ├── libicmp64.so
...
│   └── ui
├── cs_bin
│   └── cobaltstrike.jar
├── cs_src
│   └── cobaltstrike.jar
└── java-decompiler.jar

lib 位置都可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cs4
├── crackCS
│   └── decompiled_src
│   ├── LICENSE.txt
│   ├── META-INF
...
│   └── ui
├── cs_bin
│   └── cobaltstrike.jar
├── cs_src
│   └── cobaltstrike.jar
├── lib
│ └── cobaltstrike.jar (放在 crackCS 同级 )
└── java-decompiler.jar


这里要选择原版 Jar 的位置


主类输入 aggressor.Aggressor ,可以在原版 Jar 的 META-INF/MANIFEST.MF 看到

构建准备

在 src 目录创建你要更改的文件以及对应的目录(和 decompiled_src 相同的目录),如:如果要修改入口文件,也就是 aggressor/Aggressor.java,那就要在 src 目录创建 aggressor/Aggressor.java 文件和对应的目录,并在里面作对应的更改


操作:
找到原版的 aggressor/Aggressor.java ,右键 -> 重构 -> 复制文件 -> 到 src 下新建的同名文件夹内


构建设置

选择 构建 -> 构建工件 -> 构建,会生成一个新的 Jar(crackCS.jar)。

设置运行配置文件,Jar 路径选择新生成的 Jar(crackCS.jar),VM 选项输入:

1
-XX:+AggressiveHeap -XX:+UseParallelGC


将 CS 中的 cobaltstrike.auth 复制到新生成的 Jar(crackCS.jar)的目录下,不然会导致如下报错

结构

1
2
3
crackCS/out/artifacts/crackCS_jar/
├── cobaltstrike.auth
└── crackCS.jar

运行测试

测试项目是否可以正常运行

编辑复制过来的 Aggressor.java 文件,在开头那组 import 下面添加下面的代码

1
import javax.swing.*;

public static void main(String[] var0) 函数的第一行添加

1
JOptionPane.showMessageDialog(null, "pwn!!!!");

如下

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] var0) {
JOptionPane.showMessageDialog(null, "pwn!!!!");
ParserConfig.installEscapeConstant('c', "\u0003");
ParserConfig.installEscapeConstant('U', "\u001f");
ParserConfig.installEscapeConstant('o', "\u000f");
(new UseSynthetica()).setup();
Requirements.checkGUI();
License.checkLicenseGUI(new Authorization());
frame = new MultiFrame();
(new ConnectDialog(frame)).show();
}

重新构建工件并运行,出现下面界面。到此算是准备好了


删除刚才添加的两行代码

绕过验证

修改的文件在 common/Authorization.java 把 31 行的密钥注释掉并填进正确的密钥

1
2
3
4
byte[] var4 = { 
1, -55, -61, Byte.MAX_VALUE, 18, 52, 86, 120, 40, 16,
27, -27, -66, 82, -58, 37, 92, 51, 85, -114,
-118, 28, -74, 103, -53, 6 };

过期问题

修改的文件在 common/Authorization.java

第 9 行把 Authorization 类中的 valid 改成 true

第76行把 isValid 函数改成 reture true

第92行把 isExpired 函数改成 return false

去除 exit 暗桩

修改的文件在 beacon/BeaconData.java

第48行 shouldPad 函数中的 shouldPad 变量改成 false

修复 x64 上线问题

修改的文件在 aggressor/dialogs/WindowsExecutableDialog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void dialogAction(ActionEvent var1, Map var2) {
this.options = var2;
String var3 = DialogUtils.string(var2, "listener");
//this.stager = ListenerUtils.getListener(this.client, var3).getPayloadStager("x86");
boolean bool = DialogUtils.bool(this.options, "x64"); //增加判断
if (bool) {
this.stager = ListenerUtils.getListener(this.client, var3).getPayloadStager("x64");
} else {
this.stager = ListenerUtils.getListener(this.client, var3).getPayloadStager("x86");
}
if (this.stager.length != 0) {
String var4 = var2.get("output") + "";
String var5 = "";
if (var4.indexOf("EXE") > -1) {
var5 = "artifact.exe";
} else if (var4.indexOf("DLL") > -1) {
var5 = "artifact.dll";
}

SafeDialogs.saveFile((JFrame)null, var5, this);
}
}

去除彩蛋

dialog/FontDialog.java 下 84 行

这个标签是用来展示字体的。可以替换掉


1
2
3
4
5
6
7
this.size = this.act(var1.combobox("size", "Size", CommonUtils.toArray("5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 23, 26, 30, 33, 38")));
this.preview = new JLabel("Font | 字体"); // 可以替换掉
this.preview = new JLabel();
this.preview.setFont(this.font);
this.preview.setBackground(Color.white);
this.preview.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
this.preview.setOpaque(true);

src 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
src/
├── META-INF
│   └── MANIFEST.MF
├── aggressor
│   ├── Aggressor.java
│   └── dialogs
│   └── WindowsExecutableDialog.java
├── beacon
│   └── BeaconData.java
├── common
│   └── Authorization.java
└── dialog
└── FontDialog.java

制作 macOS App

jar2app

1
$ jar2app cobaltstrike.jar -j "-XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M" -i cobaltstrike.icns

-j 参数后是CS4 执行需要的 jvm 参数
-i 参数后加icns图标文件

自动操作

1
2
3
4
5
6
$ java -Xdock:icon=cobaltstrike.icns -Dfile.encoding=UTF-8 -javaagent:CobaltStrikeCN.jar -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -jar cobaltstrike.jar


####

$ java -Xdock:icon=cobaltstrike.icns -Dfile.encoding=UTF-8 -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -jar cobaltstrike.jar

或者

1
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M -Xdock:icon=/Users/ruiliang/opt/CS4/icon/icon2.icns -jar /Users/ruiliang/opt/CS4/jar/crackCS.jar

使用自动操作创建应用程序


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!