跟着老哥们一步一步的破解 Cobalt Strike 4.0
准备
使用 Java 8 环境:
使用默认版本(java14)的时候报错
| Exception in thread "main" java.lang.NoClassDefFoundError: sun/swing/plaf/synth/SynthIcon
|
创建一个文件夹用来放置项目(cs4),在其中新建两个文件夹分别用来放置原版 jar 和反编译后的 jar
复制 java-decompiler.jar
到项目文件夹(cs4)
| $ cp /Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar ~/cs4/cs_src
|
结构
| cs4 ├── cs_bin │ └── cobaltstrike.jar (原版) ├── cs_src └── java-decompiler.jar
|
反编译
反编译原版 Jar 到另一个文件夹
| $ java -cp ./java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cs_bin/cobaltstrike.jar ./cs_src
|
结构
| 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 位置都可以
| 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 选项输入:
| -XX:+AggressiveHeap -XX:+UseParallelGC
|
将 CS 中的 cobaltstrike.auth
复制到新生成的 Jar(crackCS.jar)的目录下,不然会导致如下报错
结构
| crackCS/out/artifacts/crackCS_jar/ ├── cobaltstrike.auth └── crackCS.jar
|
运行测试
测试项目是否可以正常运行
编辑复制过来的 Aggressor.java
文件,在开头那组 import 下面添加下面的代码
在 public static void main(String[] var0)
函数的第一行添加
| JOptionPane.showMessageDialog(null, "pwn!!!!");
|
如下
| 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 行的密钥注释掉并填进正确的密钥
| 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"); 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 行
这个标签是用来展示字体的。可以替换掉
| 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 结构
| src/ ├── META-INF │ └── MANIFEST.MF ├── aggressor │ ├── Aggressor.java │ └── dialogs │ └── WindowsExecutableDialog.java ├── beacon │ └── BeaconData.java ├── common │ └── Authorization.java └── dialog └── FontDialog.java
|
制作 macOS App
jar2app
| $ jar2app cobaltstrike.jar -j "-XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M" -i cobaltstrike.icns
|
• -j
参数后是CS4 执行需要的 jvm 参数
• -i
参数后加icns图标文件
自动操作
| $ 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
|
或者
| /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
|
使用自动操作创建应用程序
Link && REF