干货 | CS4.4二开基础
字数 1689 2025-08-10 12:17:54

Cobalt Strike 4.4 二次开发基础教程

前言

本教程详细讲解Cobalt Strike 4.4版本的二次开发流程,包括破解流程、漏洞修复、主题修改和新增功能实现。教程基于浙银网络安全创新工作室的原创内容整理而成。

环境准备

工具清单

  • Idea 2023
  • java-decompiler.jar
  • CS 4.4
  • CrackSleeve

目录结构

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

逆向流程

反编译步骤

  1. 切换Java版本到Java 11:

    sudo update-alternatives --config java
    
  2. 执行反编译命令:

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

IDEA项目配置

  1. 新建Java项目,命名为"cs"

  2. 创建两个文件夹:

    • decompiled_src:存放反编译后的文件
    • lib:存放原版CS
  3. 配置依赖关系:

    • 将反编译后的cobaltstrike.jar复制到decompiled_src并解压
    • 将原版cobaltstrike.jar复制到lib
  4. 设置Main Class:

    • 查看lib/META-INF/MANIFEST.MF中的Main Class值(通常为aggressor.Aggressor
  5. 配置Artifacts:

    • 选择"From modules with dependencies"
    • Main Class填写aggressor.Aggressor

破解许可证

永久许可修改

修改/src/common/Authorization.java文件:

public Authorization() {
    try {
        this.watermark=999999;
        this.validto="forever";
        this.valid = true;
        final byte[] bytes = {94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42};
        MudgeSanity.systemDetail("valid to", "perpetual");
        MudgeSanity.systemDetail("id", this.watermark + "");
        SleevedResource.Setup(bytes);
    } catch (Exception ex2) {
        MudgeSanity.logException("auth file parsing", ex2, false);
    }
}

去除暗桩

需要修改以下文件中的exit调用:

  • common/Helper
  • common/Starter
  • common/Starter2
  • beacon/CommandBuilder

漏洞修复

修复错误路径泄漏stage

修改cloudstrike/WebServer.java,新增对uri的判断:

else if (!uri.startsWith("/")) {
    return this.processResponse(uri, method, header, param, false, null, new Response("404 Not Found.","text/html"));
}

修复CVE-2022-39197 RCE漏洞

  1. 下载并导入:

    • commons-lang3-3.13.0.jar
    • commons-text-1.10.0.jar
  2. 修改common/BeaconEntry.java,使用StringEscapeUtils.escapeHtml4进行转义:

import org.apache.commons.text.StringEscapeUtils;

HashMap var1 = new HashMap();
var1.put("external", StringEscapeUtils.escapeHtml4(this.ext));
var1.put("internal", StringEscapeUtils.escapeHtml4(this.intz));
// 其他字段同理...

主题修改

修改配置界面提示

修改aggressor/dialogs/ConnectDialog文件。

修改teamserver文件

if [ -e ./cobaltstrike.store ]; then
    echo "Will use existing X509 certificate and keystore (for SSL)"
else
    echo "Generating X509 certificate and keystore (for SSL)"
    keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias cobaltstrike -dname "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=baccala@freesoft.org"
fi

修改客户端About和图标

  • 介绍部分位置:resources/about.html
  • 许可部分位置:resources/credits.txt
  • 图标位置:resources/armitage-icon.gifresources/armitage-logo.gif

使用FlatLaf主题

  1. 下载FlatLaf主题jar包
  2. 导入到lib文件夹
  3. aggressor/Aggressor.java中调用主题:
FlatLightLaf.setup();
// 确保这行代码在super.initializeStarter(this.getClass());之前

界面修复

Session显示修复

修改aggressor/browsers/Sessions.java

// repair session show
this.table.getColumnModel().getColumns().asIterator().forEachRemaining(new Consumer<TableColumn>() {
    public void accept(TableColumn tableColumn) {
        tableColumn.setCellRenderer(new TableCellRenderer() {
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component tableCellRendererComponent = table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                ((JLabel) tableCellRendererComponent).setIcon(null);
                ((JLabel) tableCellRendererComponent).setHorizontalAlignment(JLabel.CENTER);
                return tableCellRendererComponent;
            }
        });
    }
});

Target显示修复

修改aggressor/browsers/Targets.java

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
this.table.getColumn("address").setCellRenderer(centerRenderer);
this.table.getColumn("name").setCellRenderer(centerRenderer);
this.table.getColumn("note").setCellRenderer(centerRenderer);

文件浏览器修复

修改aggressor/Aggressor.java

// repair file explorer
Object DirIcon = UIManager.get("FileView.directoryIcon");
Object DirIcon2 = UIManager.get("FileView.fileIcon");
// ...其他图标获取...

FlatIntelliJLaf.setup();
UIManager.put("FileView.directoryIcon",DirIcon);
UIManager.put("FileView.fileIcon",DirIcon2);
// ...其他图标设置...

Listeners显示修复

修改aggressor/windows/ListenerManager.java

// Add the cell renderer
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
for (int i = 0; i < this.table.getColumnCount(); i++) {
    this.table.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
}

新增功能

Session新增IP归属地显示

  1. 使用qqwry-java
  2. qqwry.dat放到resources目录
  3. 修改common/BeaconEntry.java
/* add address */
private static QQWry qqwry;
static {
    try {
        byte[] data = CommonUtils.readResource("resources/qqwry.dat");
        qqwry = new QQWry(data);
    } catch (Exception e) {
        // Handle the exception...
    }
}

public static String getIpAddress(String ipaddress) {
    if (ipaddress.length() > 15 || ipaddress.equals("unknown") || ipaddress.equals("")) {
        return "未知";
    }
    try {
        IPZone ipzone = qqwry.findIP(ipaddress);
        return ipzone.getMainInfo();
    } catch (Exception e) {
        return "Exception: " + e.getMessage();
    }
}
  1. toMap()中调用:
var1.put("address", this.getIpAddress(this.ext)); // add address

编译与运行

  1. 修改完成后,选择Build->Build Artifacts->Build进行编译
  2. 编译后的文件在out/artifacts/cs_jar/cs.jar
  3. 配置运行参数:
    • VM options: -XX:+AggressiveHeap -XX:+UseParallelGC

参考链接

Cobalt Strike 4.4 二次开发基础教程 前言 本教程详细讲解Cobalt Strike 4.4版本的二次开发流程,包括破解流程、漏洞修复、主题修改和新增功能实现。教程基于浙银网络安全创新工作室的原创内容整理而成。 环境准备 工具清单 Idea 2023 java-decompiler.jar CS 4.4 CrackSleeve 目录结构 逆向流程 反编译步骤 切换Java版本到Java 11: 执行反编译命令: IDEA项目配置 新建Java项目,命名为"cs" 创建两个文件夹: decompiled_src :存放反编译后的文件 lib :存放原版CS 配置依赖关系: 将反编译后的 cobaltstrike.jar 复制到 decompiled_src 并解压 将原版 cobaltstrike.jar 复制到 lib 设置Main Class: 查看 lib/META-INF/MANIFEST.MF 中的Main Class值(通常为 aggressor.Aggressor ) 配置Artifacts: 选择"From modules with dependencies" Main Class填写 aggressor.Aggressor 破解许可证 永久许可修改 修改 /src/common/Authorization.java 文件: 去除暗桩 需要修改以下文件中的exit调用: common/Helper common/Starter common/Starter2 beacon/CommandBuilder 漏洞修复 修复错误路径泄漏stage 修改 cloudstrike/WebServer.java ,新增对uri的判断: 修复CVE-2022-39197 RCE漏洞 下载并导入: commons-lang3-3.13.0.jar commons-text-1.10.0.jar 修改 common/BeaconEntry.java ,使用 StringEscapeUtils.escapeHtml4 进行转义: 主题修改 修改配置界面提示 修改 aggressor/dialogs/ConnectDialog 文件。 修改teamserver文件 修改客户端About和图标 介绍部分位置: resources/about.html 许可部分位置: resources/credits.txt 图标位置: resources/armitage-icon.gif 和 resources/armitage-logo.gif 使用FlatLaf主题 下载FlatLaf主题jar包 导入到lib文件夹 在 aggressor/Aggressor.java 中调用主题: 界面修复 Session显示修复 修改 aggressor/browsers/Sessions.java : Target显示修复 修改 aggressor/browsers/Targets.java : 文件浏览器修复 修改 aggressor/Aggressor.java : Listeners显示修复 修改 aggressor/windows/ListenerManager.java : 新增功能 Session新增IP归属地显示 使用 qqwry-java 库 将 qqwry.dat 放到 resources 目录 修改 common/BeaconEntry.java : 在 toMap() 中调用: 编译与运行 修改完成后,选择 Build->Build Artifacts->Build 进行编译 编译后的文件在 out/artifacts/cs_jar/cs.jar 配置运行参数: VM options: -XX:+AggressiveHeap -XX:+UseParallelGC 参考链接 Cobalt Strike破解过程 GitHub - LztCode/cobaltstrike4.5_ cdf geacon_ pro