反編譯
首先磺芭,我們需要一個(gè)確認(rèn)無(wú)改動(dòng)的官方原包
官方HEX
https://verify.cobaltstrike.com/
# Cobalt Strike 4.3 (March 17, 2021) [bug fixes]
c3c243e6218f7fbaaefb916943f500722644ec396cf91f31a30c777c2d559465 Cobalt Strike 4.3 Licensed (cobaltstrike.jar)
certutil -hashfile cobaltstrike.jar SHA256
SHA256 的 cobaltstrike.jar 哈希:
c3c243e6218f7fbaaefb916943f500722644ec396cf91f31a30c777c2d559465
目前成熟的反編譯方案粘都,借助idea自帶的反編譯工具完成:
在idea安裝目錄中找到反編譯工具java-decompiler.jar
IDEAPATH\plugins\java-decompiler\lib\java-decompiler.jar
新建Decompile用來(lái)存放反編譯后的jar包寨典,并進(jìn)行反編譯爷贫,時(shí)間略久
java -cp java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cobaltstrike.jar Decompile/
將反編譯后生成的cobaltstrike.jar文件解壓即可调鬓,不再是class文件艇炎,而是java文件
查看Decompile\cobaltstrike\META-INF\MANIFEST.MF
其主類(lèi)如下:
Main-Class: aggressor.Aggressor
#aggressor.Aggressor
package aggressor;
import aggressor.dialogs.ConnectDialog;
import aggressor.ui.UseSynthetica;
import common.Authorization;
import common.License;
import common.Requirements;
import sleep.parser.ParserConfig;
public class Aggressor {
public static final String VERSION = "4.3 (20210317) " + (License.isTrial() ? "Trial" : "Licensed");
public static final String VERSION_SHORT = "4.3";
public static MultiFrame frame = null;
public static MultiFrame getFrame() {
return frame;
}
public static void main(String[] var0) {
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();
}
}
新建Java項(xiàng)目,此處為MyCS腾窝,并在src下配置package aggressor
將Decompile\cobaltstrike\aggressor\Aggressor.java 放入軟件包并添加原始cobaltstrike.jar作為依賴(lài)
為后門(mén)二次編譯順便在這里創(chuàng)建工件缀踪,指定主類(lèi):
啟動(dòng)報(bào)錯(cuò),我們按照命令行啟動(dòng)加入相關(guān)參數(shù)
有個(gè)小坑坑燕锥,新版idea默認(rèn)隱藏辜贵,手動(dòng)勾上,并輸入 -XX:+AggressiveHeap -XX:+UseParallelGC
至此归形,反編譯完成托慨,進(jìn)入認(rèn)證破解。
順便一提再編譯暇榴,這里我們僅拉取了主類(lèi)進(jìn)行測(cè)試厚棵,實(shí)際魔改中根據(jù)需求拉取,建議使用到什么文件拉什么文件蔼紧,不然所有代碼中有因Java版本及語(yǔ)法兼容問(wèn)題導(dǎo)致構(gòu)建不通過(guò)婆硬。
因?yàn)樯厦嬉呀?jīng)進(jìn)行了工件配置和主類(lèi)的指定,直接構(gòu)建工件即可重新打包生成自己的cobaltstrike.jar
MyCS\out\artifacts\MyCS_jar\MyCS.jar
https://mp.weixin.qq.com/s/cRlHoilJa8HPX9L2ZNE77A CobaltStrike二次開(kāi)發(fā)環(huán)境初探
破解
生成并替換authkey.pub文件
關(guān)鍵點(diǎn)在于key值奸例,這里抄下師傅們的作業(yè)彬犯,生成腳本可在文中獲得
https://f4x.me/archives/50.html CobaltStrike 4.3 破解及Sleeve相關(guān)問(wèn)題
https://bbs.ichunqiu.com/thread-61581-1-1.html Cobalt Strike破解思路
demo:4.0 data
byte[] decrypt = {
-54, -2, -64, -45, 0, 0, //文件頭
1, -55, -61, 127, //時(shí)間
0, 0, 0, 1, //水印
50, //版本
16, //key長(zhǎng)度
27, -27, -66, 82, -58, 37, 92, 51, 85, -114, -118, 28, -74, 103, -53, 6 //key
};
4.1的key為:
byte[] key41 = {-128, -29, 42, 116, 32, 96, -72, -124, 65, -101, -96, -63, 113, -55, -86, 118 };
4.2的key為:
byte[] key42 = {-78, 13, 72, 122, -35, -44, 113, 52, 24, -14, -43, -93, -82, 2, -89, -96};
4.3的key為:
byte[] key43 = {58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103};
================================================================================================
將 .auth 文件讀取成 byte[],處理之后得出 26 位的 byte[]查吊,將其拆分為:
4位 -> 經(jīng)過(guò)有符號(hào)轉(zhuǎn)換 int谐区,結(jié)果為29999999 -> 用于判斷是否永久有效(是否為發(fā)行版)
4位 -> 經(jīng)過(guò)有符號(hào)轉(zhuǎn)換 int,結(jié)果不為 0 即可 -> 水印
1位 -> 該 byte 值必須是大于 40 且小于 128 -> 判斷認(rèn)證是否適合 4.x
1位 -> 該 byte 值必須是 16 -> key 的長(zhǎng)度
16位 -> 該 key 理論上無(wú)法逆推
要注意的是:處理 .auth 文件的時(shí)候逻卖,還需要判斷文件頭...宋列,因此還需要填充文件頭,但按照分析下來(lái)评也,是 4 個(gè)字節(jié)炼杖,但在實(shí)測(cè)過(guò)程中灭返,發(fā)現(xiàn)是 6 個(gè)字節(jié)
因此 .auth 文件的必要數(shù)據(jù)是 32 位 -> 6 + 4 + 4 + 1 + 1 + 16
修改源碼中authkay.pub的md5值
certutil -hashfile authkey.pub MD5
MD5 的 authkey.pub 哈希:
1d311afeca0476a7eda972611fb27bcc
# common.AuthCrypto line28
if (!"1d311afeca0476a7eda972611fb27bcc".equals(CommonUtils.toHex(var2))) {
CommonUtils.print_error("Invalid authorization file");
System.exit(0);
}
修改過(guò)期時(shí)間
common.Authorization line9
// protected boolean valid = false;
protected boolean valid = true;
修復(fù)becon/BeaconData.class中暗樁
beacon.BeaconData line49
public void shouldPad(boolean var1) {
// this.shouldPad = var1;
this.shouldPad = false;
this.when = System.currentTimeMillis() + 1800000L;
}
坑點(diǎn)一
[-] [Sleeve] Bad HMAC on 209952 byte message from resource
這個(gè)問(wèn)題參考上面給到的f4x師傅的文章對(duì)key進(jìn)行處理。
坑點(diǎn)二
在idea中替換原來(lái)的authkey.pub后坤邪,需要重建項(xiàng)目熙含,否則你會(huì)發(fā)現(xiàn)公鑰校驗(yàn)部分"resources/authkey.pub"沒(méi)有使用你替換的,而且使用了原始jar包中的公鑰
如果你明明替換了罩扇,卻一直提示Invalid authorization file婆芦,那就是這樣了~
byte[] var1 = CommonUtils.readAll(CommonUtils.class.getClassLoader().getResourceAsStream("resources/authkey.pub"));
byte[] var2 = CommonUtils.MD5(var1);
System.out.println(CommonUtils.toHex(var2));
至此,CS完成破解喂饥。