干货 | 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
逆向流程
反编译步骤
-
切换Java版本到Java 11:
sudo update-alternatives --config java -
执行反编译命令:
java -cp java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cs_bin/cobaltstrike.jar cs_src/
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文件:
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/Helpercommon/Startercommon/Starter2beacon/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漏洞
-
下载并导入:
commons-lang3-3.13.0.jarcommons-text-1.10.0.jar
-
修改
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.gif和resources/armitage-logo.gif
使用FlatLaf主题
- 下载FlatLaf主题jar包
- 导入到lib文件夹
- 在
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归属地显示
- 使用qqwry-java库
- 将
qqwry.dat放到resources目录 - 修改
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();
}
}
- 在
toMap()中调用:
var1.put("address", this.getIpAddress(this.ext)); // add address
编译与运行
- 修改完成后,选择
Build->Build Artifacts->Build进行编译 - 编译后的文件在
out/artifacts/cs_jar/cs.jar - 配置运行参数:
- VM options:
-XX:+AggressiveHeap -XX:+UseParallelGC
- VM options: