Pr0ph3t

char nick[7] = "Pr0ph3t";

printf("https://github.com/%s\n",nick);

printf("%s\x40pr0ph3t\x2e\\\bcom\n","admin");

puts("91B6 191A C2C3 285C 201D  801B B5A3 6B56 8528 E140");

[工具]Cobalt Strike4.0 破解日记

Aug 5, 2020 • CyberSecurity,Tools,RedTeam Page view:

好久没写东西了啊。。。。感觉都过去几万年了。。。感觉这两年自己变化也挺大的,决定了一些事情,做成了一些事情,错过了一些事情,反省了一些事情。是时候也更新一下这个封尘的博客了。最近发现cs4.0出来了,想着白嫖一波23333

  • 在网上白嫖了其他师傅破解的,试用了几波之后发现有挺多问题的。比如net view会无回应,无法生成powershell马等等,一开始以为是4.0破解的通病,但是问了几位师傅之后发现只有我这发生了这种情况。。。所以就想着,反正有原版,索性自己搞一下。

  • 感谢ssooking师傅的原版jar, 这里的原版是Cobalt Strike 4.0 (December 5, 2019) 558f61bfab60ef5e6bec15c8a6434e94249621f53e7838868cdb3206168a0937 Cobalt Strike 4.0 Licensed (cobaltstrike.jar) bug fixes之前的版本,不过这个问题不大,这个主要是修复了x64上线的问题
  • checksum checksum

  • 破解方法有很多种,这里采用的是改动最小(因为懒)的直接硬编码key覆盖掉。感谢coolcat师傅和其他师傅的无私贡献~
  • 其余方法也有零队的《Cobaltstrike 4破解之 我自己给我自己颁发license》链接 / ca3tie1师傅的《CobaltStrike4.0无Hook蛮力Cracked License思路》链接

准备工作

  • 我用的是Mac,Windows可能稍有点区别但是区别应该不大
  • 以下操作都在一个新建文件夹fuckcs4.0

找到Idea的java反编译工具,Mac在路径/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib下,找到java-decompiler.jar copy出来一份,并建立文件夹cs_bin,把原版jar放进去

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

2 directories, 2 files

反编译原版jar待用,在java-decompiler.jar所在的目录执行

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

命令解释:因为java-decompiler.jar中的META-INF/MANIFEST.MF并没有定义可执行的主类,所以我们并不能使用java -jar去直接运行java-decompiler.jar decompile

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

2 directories, 3 files

fuckcs4.0里面创建一个新的文件夹,名字为project, 打开Idea新建工程,直接create一个普通的java project就行(一路next),把路径设置到我们刚新建的project文件夹,在project中再创建一个文件夹decompiled_src存放我们逆向之后的源码,把刚刚反编译后的jar放到这个文件夹之后解压,之后再创建一个lib文件夹,用于存放我们的原版jar。

然后在Files --> Project Structure --> Modules里面的 Dependencies – 加入Jar or directories, 把我们lib文件夹的原版jar加入到项目中,打上勾就好了。 import jar.png

最后在Files --> Project Structure --> Artifact里面添加Jar – From modules with dependencies, Main Class可以从原版的jar里面的META-INF/MANIFEST.MF看到是aggressor.Aggressor,填进去就行了。 image.png image.png

至此准备工作已经差不多完成

改编不是乱编

example:

src目录创建你要更改的文件以及对应的目录(和decompiled_src相同的目录),如:如果我要修改入口文件,也就是aggressor/Aggressor.java,那就要在src目录创建aggressor/Aggressor.java文件和对应的目录,并在里面作对应的更改,比如在运行cs的时候弹出一个消息框,修改后的源码如下:

package aggressor;

import aggressor.dialogs.ConnectDialog;
import aggressor.ui.UseSynthetica;
import common.Authorization;
import common.License;
import common.Requirements;
import sleep.parser.ParserConfig;

import javax.swing.*;

public class Aggressor {
    public static final String VERSION = "4.0 (20191205) " + (License.isTrial() ? "Trial" : "Licensed");
    public static MultiFrame frame = null;

    public static MultiFrame getFrame() {
        return frame;
    }

    public static void main(String[] var0) {
        JOptionPane.showMessageDialog(null, "Pr0ph3t!!!!!!!!!!!!!!!!!!!!!!!!"); //修改的代码
        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();
    }
}

然后在菜单栏有Build --> Build Artifact,运行之后在out/artifacts里面会有发现新编译好的jar, 在Run --> Profile --> Edit Profile处添加一个Jar Application, Jar Path指向我们刚刚编译好的jar,VM Options填上-XX:+AggressiveHeap -XX:+UseParallelGC(如果不加的话会报错) Run之后发现还有报错,找不到cobaltstrike.auth文件 image.png 然后我们把cobaltstrike.auth文件复制到我们生成的jar同目录下,再运行,就能出现我们熟悉的框框了 :( image.png

.
├── cs_bin
│   └── cobaltstrike.jar
├── cs_src
│   └── cobaltstrike.jar
├── java-decompiler.jar
└── project
    ├── decompiled_src
    │   ├── LICENSE.txt
    │   ├── META-INF
    │   ├── NOTICE.TXT
    │   ├── aggressor
    │   ├── beacon
    │   ├── c2profile
    │   ├── cloudstrike
    │   ├── cobaltstrike.jar
    │   ├── com
    │   ├── common
    │   ├── console
    │   ├── cortana
    │   ├── data
    │   ├── de
    │   ├── dialog
    │   ├── dns
    │   ├── encoders
    │   ├── endpoint
    │   ├── eu
    │   ├── extc2
    │   ├── filter
    │   ├── graph
    │   ├── icmp
    │   ├── importers
    │   ├── java_cup
    │   ├── javax
    │   ├── kerberos
    │   ├── libicmp.so
    │   ├── libicmp64.so
    │   ├── libtapmanager.so
    │   ├── libtapmanager64.so
    │   ├── license
    │   ├── logger
    │   ├── mail
    │   ├── net
    │   ├── org
    │   ├── parser
    │   ├── pe
    │   ├── phish
    │   ├── profiler
    │   ├── proxy
    │   ├── report
    │   ├── resources
    │   ├── scripts
    │   ├── server
    │   ├── sleep
    │   ├── sleeve
    │   ├── socks
    │   ├── ssl
    │   ├── stagers
    │   ├── table
    │   ├── tap
    │   └── ui
    ├── fuckcs4.0.iml
    ├── lib
    │   └── cobaltstrike.jar
    ├── out
    │   ├── artifacts
    │   └── production
    └── src
        ├── META-INF
        ├── aggressor
        ├── beacon
        └── common

59 directories, 12 files

开始破解:

我们需要修改的东西为

  1. 绕过验证校验
  2. 过期问题
  3. 去除exit暗桩
  4. 修复x64上线问题
  • 绕过验证校验: 修改的文件在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 };

image.png

其实这时候已经是可以正常启动客户端了 image.png

但是过期、暗桩和x64上线问题我们还没有修改好

  • 过期问题: 修改的文件在common/Authorization.java

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

第76行把isValid函数改成reture true

第92行把isExpired函数改成return false

  • 去除exit暗桩: 修改的文件在beacon/BeaconData.java

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

  • 修复x64上线问题 修改的文件在aggressor/dialogs/WindowsExecutableDialog.java

第29行的dialogAction函数在生成stage可执行文件的时候并没有判断主机的架构是x86还是x64,统统都用了x86的payload,这里我们加一个判断就可以了

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);
	}
}

至此我们的大致修改就已经完成了,修改完成打包好的文件就是生成的artifacts,直接替换原版的jar文件即可,mac用户想要弄成app的话可以使用jar2app,如果想要二次开发的话其实也是和这个流程类似。

水完了,溜!继续学习

参考: ssooking coolcat snowming 零队 ca3tie1

Did you like the post? Subscribe to the feed.

Thx!