声明:该公众号大部分文章来自作者日常学习笔记,未经授权,严禁转载,如需转载,联系洪椒公众号。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
0x00 前言
原版的CobaltStrike已经被各大杀毒软件给标记了,很容易就会被捕获到特征。所以我们可以尝试CS 的二次开发,尝试修改一些特征,让我们的流量更加隐蔽。
0x01 反编译
首先我们需要将 CS 进行反编译得到源码。
1、反编译工具路径
“
IDEA 2022.1.3pluginsjava-decompilerlibjava-decompiler.jar
”
2、反编译命令
“
java -cp %IDEA_HOME%/plugins/java-decompiler/lib/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler-dgs=true <src.jar>
”
java -cp java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cobaltstrike.jar cs2
反编译成功后会在 cs2 文件夹里生成一个反编译后的 jar 包,用压缩软件打开后可以发现已经是 java 源文件了。
3、接着我们使用IDEA新建项目,名称随意。
4、在项目文件里新建一个lib目录,将原始未编译的jar包放入其中。
5、再新建一个decompiled_src 目录,将反编译后的 jar 包进行解压,将所有文件复制到 decompiled_src目录
6、接着需要在项目结构--->模块--->依赖--->添加库--->java类型--->选择我们lib目录的jar包,记得勾选。
7、然后需要构建工件,添加 jar 文件,选择来自具有依赖项的模块。
8、选择主类为aggressor.Aggressor,之后确定应用就行。
到这里前期工作基本上已经完成了,现在你想修改什么文件,只需要把源文件复制到 src 目录下修改即可。
0x02 默认端口修改
修改 CS 服务端的默认启动端口。
打开 teamserver 文件,修改其中的 server_port 值即可。
修改保存后,重新启动服务端,可以看见服务端启动的端口是我们刚才修改的端口。
0x03 默认证书修改
Cobalt Strike 服务端和客户端是通过 SSL 加密通讯的,默认情况下的 SSL 配置文件和代理配置文件会导致 Keystore 文件内容很容易就被防火墙识别。
可以通过 keytool -list -v -keystore cobaltstrike.store 命令查看 CS 默认证书信息如下:
可以使用 nmap 命令:nmap -p- -A -vv IP 对目标进行扫描,扫描完成后也可发现 CS 特征。
正因为默认证书信息的特征太过于明显,所有我们需要尝试修改。在进行默认证书修改前,简单介绍下 Keystone 和 keytool 。
1、什么是 Keystore
Keystore 是 Java 密钥库,是用来进行通信加密用的、比如数字签名。Keystore 就是用来保存密钥对的,比如公钥和私钥。Keystore可理解为一个数据库,可以存放很多个组数据。
2、Keystore 包含数据
主要包含两种数据
-
密钥实体(Key entity):密钥(secret key)又或者是私钥和配对公钥(采用非对称加密) -
可信任的证书实体(trusted certificate entries):只包含公钥
3、什么是 Keytool
Keytool是一个 java 数据证书的管理工具,Keytool 将密钥和证书存放在一个称为 keystore 的文件中,即.store后缀的文件中。
4、Keytool 常用命令
-alias 产生别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码(获取keystore信息所需的密码)
-keypass 指定别名条目的密码(私钥的密码)
-dname 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”
-list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码
-printcert 查看导出的证书信息 keytool -printcert -file yushan.crt
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
-storepasswd 修改keystore口令 keytool -storepasswd -keystore e:yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)
-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书
5、创建新证书
为了掩盖默认SSL证书的特征,需要重新创建一个新的不一样的证书 。
删除 CS 自带的 cobaltstrike.store,使用以下命令生成一个新的 cobaltstrike.store ,然后客户端进行连接,连接时记得修改 teamserver 文件中的证书密码。
使用以下命令创建证书:
生成证书指纹:
keytool -keystore cobaltstrike.store -storepass 密码 -keypass 密码 -genkey -keyalg RSA -alias google.com -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)"
应用证书指纹:
keytool -importkeystore -srckeystore cobaltstrike.store -destkeystore cobaltstrike.store -deststoretype pkcs12
-
生成证书指纹
keytool -keystore cobaltstrike.store -storepass Microsoft -keypass Microsoft -genkey -keyalg RSA -alias cobaltstrike -dname "CN=*.microsoft.com, OU=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=WA, C=US"
-
应用证书指纹
keytool -importkeystore -srckeystore cobaltstrike.store -destkeystore cobaltstrike.store -deststoretype pkcs12
同时因为新的证书密码被我们重新设置了,所以我们要在 teamserver 文件里修改证书密码。
重新启动后,再次使用 nmap 进行扫描,发现证书信息已经改变。
0x03 防爆破
如果未对 CS 做任何配置修改的话,默认情况下我们可以对目标 CS 服务端进行密码爆破。
项目地址:
https://github.com/ryanohoro/csbruter
我们可以通过修改 ssl/SecureServerSocket.java 中的 authenticate 函数的 48879 值来实现密码防爆破,全局搜索该值修改成其它 int 类型的值就行。PS:注意不要修改 dns/AsymmetricCrypto.java 里面的 48879 值(这个和beacon回连认证有关)
0x04 http/s上线流量特征消除
分阶段 Steger 【上线的时候先投递一个小巧的Stager Payload,然后通过 Stager 去 Beacon Staging Server 的某个 URL 下载完整的 Stage(也就是体积更大功能更复杂的Payload),并将其注入内存。】上线请求的 URL 路径是用 checksum8 算法进行随机生成的,其中 92 代表HTTP,93 代表HTTPS。
public class EchoTest {
public static long checksum8(String text) {
if (text.length() < 4) {
return 0L;
}
text = text.replace("/", "");
long sum = 0L;
for (int x = 0; x < text.length(); x++) {
sum += text.charAt(x);
}
return sum % 256L;
}
public static void main(String[] args) throws Exception {
System.out.println(checksum8("bdDR"));
}
}
既然我们知道了请求路径的规则,那么我们随意访问一个 checksum8 算法结果为 92 的字符串会怎样呢?比如我们访问a2bh,可以看到,成功访问下载。
那能访问下载后又有啥用呢?可以使用解密工具对其进行解密,解密后会得到 Public Key 和 C2 Server 解密工具项目地址:
https://github.com/zone009/CobaltStrikeParser
PS:Pubilc key 需要删除后面一堆的AAAAAA,正确的格式是MIGfXXXXXXXXXXX==。接着,我们就可以利用这些进行伪造上线了。伪造上线项目地址:
https://github.com/LiAoRJ/CS_fakesubmit
#脚本使用方法
在Public_key.txt中放入通过Beacon解密获得的Publickey
在Process_name.txt 中加入上线进程的字典
在Computer_name.txt 中加入受控机名称的字典
在User_name.txt 中加入受控机用户名的字典
可以看到,大量垃圾主机上线,极大程度上影响了攻击方。当让了,要解决这个问题,只需要修改 checksum8 函数,更改规则。
分别修改 webserver.java 和 commonutils.java,将 92L 和 93L 进行修改即可
-
adhhraaddgrtadgragrrtatrtsrtg.jpg 经过 checksum8 函数计算得到结果为 3462 -
bbbbklasdfjadjflkasdjfasdoi.jpg 经过 checksum8 函数计算得到结果为 3162
同时需要修改返回结果。
修改后重新构建,然后将生成的class文件替换一下即可。
接着我们重新启动CS生成后门,可以看到上线特征已经改变。
0x05 后记
本文主要讲了一些基础的操作,从CS的反编译到默认端口、默认证书信息的修改,同时也简单说了下防爆破和 http/s 上线流量特征的修改,希望能给各位师傅们带来帮助。
原文始发于微信公众号(洪椒攻防实验室):C2隐藏 _ 让你的流量更隐蔽(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论