招募六边形战士队员
一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
IDEA 自动换行
File->【Settings】
*.md; *.txt; *.rst; .adoc;.java
原版CS反编译破解
jar包反编译
CobaltStrike二次开发环境初探
CobaltStrike 4.5原版 2022年5月1日 发布 + 破解及汉化加载
4.3 及之前版本的暴力替换class文件的破解方法失效
IntelliJ IDEA自带了一个反编译java的工具
IntelliJ IDEA安装目录/plugins/java-decompiler.jar
对cobaltstrike的整个jar 包进行反编译
org/jetbrains/java/decompiler/main/decompiler/
org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler 提供反编译的这个类。
因为没MANIFEST.MF中没有main class 属性,没有指定主类,
因此不能直接 使用 java -jar
如果 想要执行 java包中具体的类,要 使用 javacp输入如下命令:
java -cp 命令中 cp 指的就是 classpath。
使用该命令可以运行jar中的某个指定的测试类 使用方法 Java -cp 依赖jar或者是依赖jar库
新建两个文件
cs_bin里面放未反编译的cobaltstrike.jar
再建一个CS_source_decompiler_src 文件,这个是空文件,是为了之后放反编译后的cobaltstrike
java -cp "D:\ideaIU-2018.1.1.win\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dsg=true cobaltstrike.jar G:\code\Saft_Code\CS_source_decompiler_src
反编译后,会自动打包成jar包,右键解压后打开可以看到都是.java了,
使用这个方法会非常方便,就不需要第三方工具,这个反编译出来的接放入就可以直接放到 IDEA中,
可直接实现代码搜索,相关的交叉引用。
IDEA 创建一个默认项目,然后创建一个对应的
decompile目录,
将反编译的java源代码都放进去
lib目录将的cobaltstrike.jar(这个jar是未反编译的jar包),放进去
cobaltstrike.auth 也是
将decompile/aggressor.Aggressor.java 复制到src/aggressor.Aggressor.java
右键 make Directory as Source Root
并且将该jar包导入到依赖库中 设置依赖关系
file-->project Structure
modules dependencies选择lib目录下面的文件,确保是Compile 打勾点击apply
Artifacts--->jar--->from modules with dependencies MainClass
去新建一个Main Class Aggressor.Aggressor
名字可以在lib---->cs.jar---->meta-inf---->menifest.mf中找到
这样子可以使用菜单栏的Build里面Build Arifact进行jar打包了。结果会在out文件夹里里面。
启动文件使用打包的jar即可。
JAR Application
设置对应的VM option为 -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M
-XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC
加入测试语句
JOptionPane.showMessageDialog(null,"hello world!!!");
服务端搭建
再将decompile目录中的server.TeamServer类复制一份到src目录中
打包有问题src META-INF MANIFEST.MF 复制
E:\hack\conn\CobaltStrike\cobaltstrike.auth
E:\hack\conn\CobaltStrike\cobaltstrike.store
-Djavax.net.ssl.keyStorePassword=123456
设置对应的VM option为
-XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=D:\ALL\javaidea\cs_disassemably\lib\google.store -Djavax.net.ssl.keyStorePassword=google -server -XX:+AggressiveHeap -XX:+UseParallelGC
注意:其中google.store可以是自己生成的ssl证书
https://www.cnblogs.com/haidragon/p/16852315.html
https://github.com/jas502n/cs-agent
auth破解
先定义一下 以后修改过的地方全会标记上
//aming_change
采用全局搜索
关键字 “cobaltstrike.auth”
硬编码修改
byetes变量是密钥
对sleeve修改有帮助
protected String watermarkHash = "BeudtKgqnlm0Ruvf+VYxuw==";
public Authorization() {
try {
this.watermark=100000;
this.validto="forever";
this.valid = true;
final byte[] bytes = {-13, -114, -77, -47, -93, 53, -78, 82, -75, -117, -62, -84, -34, -127, -75, 66};
common.MudgeSanity.systemDetail("valid to", "perpetual");
common.MudgeSanity.systemDetail("id", String.valueOf(this.watermark));
SleevedResource.Setup(bytes);
}
catch (Exception ex2) {
MudgeSanity.logException("auth file parsing", ex2, false);
}
//aming_change
}
拔掉暗桩
暗桩导致进不去GUI界面
跟System.exit 有直接关系 采用全局搜索
从aggressor.Aggressor 开始看
Dlgshow在这
上面三个调用
checkGUI(
checkLicenseGUI(
initializeStarter(
ConnectDialog(
exit函数都注释掉
跟进checkGUI()
跟进initializeStarter
跟进checkLicenseGUI发现isValid()、isPerpetual()、isExpired()、isAlmostExpired()
对授权是否有效、授权是否过期进行判断
回到了参数 var0 -> new Authorization() 跳过
继续 new ConnectDialog(B)
跟进initialize(
exit去掉了 启动
初始环境效果
G:\code\Saft_Code\CobaltStrike_debug\out\artifacts\CobaltStrike_debug_jar
-javaagent:命令行关键字
class 验证
返回true即可
机器上线之后执行命令60秒自动退出
beacon/BeaconData中将shouldPad方法的值固定为false:
4个小时机器自动掉线
以下全刪除
Beacon分析
beacon payload的加载过程
beacon loader
静态分析
直接看伪代码
入口处很容易能够找到 main 函数的地址
关注这个函数
401795 这个
基于一些特征随机利用格式化字符串生成了一个字符串buffer,
同时创建了一个新的线程
执行函数为sub_401685
进 sub_4015D0
以上面生成的buffer为名字创建了一个命名管道,
然后进行判断,如果命名管道创建成功,
ConnectNamedPipe函数将等待客户端连接到管道。
如果成功连接到管道, 使用WriteFile函数将shellcode数据写入已连接的命名管道。
如果写入成功,则更新指针lpBuffer和剩余要写入的字节数nNumberOfBytesToWrite。
stageless Beacon 内存特征
无阶段的 beacon
使用 Process Hacker 分析 Beacon的特征
选中的beacon.exe,之后弹出beacon.exe(4008)属性框,选择属性框中的“线程”,可以看到线程起始地址:beacon.exe+0x14b0
单击选中的beacon.exe+0x14b0,查看线程 952 的堆栈的调用了SleepEx睡眠
内存段是rwx权限
查看 beacon.exe 所有的内存,内存段很少有是rwx权限的,我们直接定位到rwx内存段
之后,右键把内存导出到文件
用写字板形式打开beacon.exe.bin文件
内存中有 beacon 字符串
内存中有 ReflectiveLoader 字符串
stageless Beacon https 生成分析
cs如何进行构造payload
选择payload
aggressor.dialogs.WindowsExecutableStageDialog#dialogAction
点击保存
来到aggressor.dialogs.WindowsExecutableStageDialog#dialogResult,
主要有如下两个部分
ScListener var5 = ListenerUtils.getListener(this.client, var3);
获取当前listener的名称,然后生成对应的ScListener对象
this.stager = var5.export(this.client, var4);
stageless beacon http通信协议 过程分析
为了看cs 各个功能实现 以及具体的通信包结构以便自己实现beacon。
rsa 公私钥
序列化存储在.cobaltstrike.beacon_keys 里
上线&心跳get请求
beacon 上线第一个请求就是一个带有metadata 信息的get包
然后服务端再返回一个没内容的响应包。
默认这个metadata 信息是用rsa 公钥加密放在cookie 里的,
这个行为的在profile 文件的http-get.client.metadata 里定义。
后续的心跳请求也是这个,
如果服务端有命令要下发给beacon执行 就是通过心跳请求的响应包来传递。
teamserver 处理请求
teamserver 的NanoHTTPD -> run方法在获取到请求后传给WebServer.serve,
最终请求信息传递给WebServer._serve 来处理请求信息。
_serve 方法先检测User-Agent是否在黑名单里
在就把blockedByUA 设置为true,
然后又检查ua 是否在白名单里,
如果有设置白名单并且没有匹配到的话就把allowedByUA 设置我false,
allowedByUA默认为true。
boolean allowedByUA = true;
String hook;
if (this.allowedUAArray.length > 0) {
allowedByUA = false;
String[] arr$ = this.allowedUAArray;
len$ = arr$.length;
for(int i$ = 0; i$ < len$; ++i$) {
hook = arr$[i$];
if (hook.trim().length() > 0 && CSUtils.matchesSimpleGeneric(useragent, hook.trim())) {
allowedByUA = true;
}
}
}
只有当满足 allowedByUA && !blockedByUA 条件时才继续执行函数,
否则就在控制台提示然后返回404
黑白名单的ua 可以在profile的http-config 中配置,
curl/lynx/wget* 是默认黑名单
下一步就是判断请求方法是不是OPTIONS ,
是就返回200 和允许的方法再往下就是之前爆出的路径不规范泄露stager信息漏洞的地方,
这里看this.hooks里的内容如果直接传入一个类似GET stager HTTP/1.1,
这样的请求头就会泄露stager信息
Beacon C2Profile
客户端分析
exportBeaconStage 方法
把 settings 转 byte 数组,然后混淆后 Patch 的settings 的设置,可以很明显的发现四个方法 addShort、addInt、addString、addData
Beacon 端分析
实际执行的 Beacon 是由一个 Loader 加载执行
实际运行的时候,运行的是 Loader
真正核心的 beacon.dll 在 DLLMain 中干了什么事
当 fdwReason 为 1 时,实际执行的是解析 C2Profile 的操作
当 fdwReason 为 4 时,才是真正的功能执行
展示图
所以 客户端 Patch 到 Beacon 中的 C2Profile
与 Beacon 在运行时所使用的 C2Profile 长的并不是一样的
客户端
beacon
Beacon 结果回传流程分析
Beacon 在接受完命令并执行后,会将数据加密回传给 C2
C2进行解析后,并根据类型对结果的格式进行处理后,再回传给客户端文章来源:https://www.toymoban.com/news/detail-727090.html
Beacon 接收与处理
在通信相关函数上下断
HttpSendRequest 发送任务
InternetReadFile 接收任务文章来源地址https://www.toymoban.com/news/detail-727090.html
结果回传
到了这里,关于红队专题-Cobalt strike4.5二次开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!