前言
前几天上线时被流量设备拦住了,才想起这件拖了许久的任务。
去除特征
端口号
sed -i 's/50050/10080/g' teamserver
挺玄学的,有没有用看天意
证书
证书生成在teamserver文件内,删掉已有的证书文件cobaltstrike.store,执行sed -i 's!-alias cobaltstrike -dname "CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"!-alias microsoft.com -dname "CN=Microsoft Windows, OU=MOPR, O=Microsoft Corporation, L=Redmond, ST=Washington, C=US"!g' teamserver
,下次开启teamserver时就会生成一个不带特征的证书
HTTPS证书
上面的证书是VPS远控端口的证书,而Beacon所用的http证书并非同一个。所以要另签一份。
但自己签太麻烦,喜欢偷懒的我选择直接使用github上的C2伪装脚本Malleable-C2-Profiles
执行时./teamserver [external IP] [password] [/path/to/my.profile]
再次抓包就能看到流量带上了相应伪装的标记
stager
Beacon Staging Server的作用是为了防止Payload过大或者适应不同的攻击场景,可以分阶段进行payload投递。
首先通过投递一个被称为stager的小巧的payload,然后去Beacon staging server下载体积较大更复杂的stage,并且访问stage的URL通过checksum8进行校验。
路径大概长这样
/x9cI/
/fYKR/
/Mrm0/
/wQPD/
/yDHX/
/BCre/
/WHVh/
也就是说实际上蓝队可以通过分析流量,找到C2服务器的地址。再对URL的算法进行分析,算法如下
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 boolean isStager(String uri)
{
return checksum8(uri) == 92L;
}
public static boolean isStagerX64(String uri)
{
return (checksum8(uri) == 93L) && (uri.matches("/[A-Za-z0-9]{4}"));
}
在url后拼接四位随机字符就能下载到payload文件,文件中使用一个默认的异或字符进行加密,cs3.x版本的配置信息是通过异或0x69解密出的,4.x版本的配置信息是通过异或0x2e解密出的。再使用CobaltStrikeParser对下载的文件进行解密。解密后我们的C2服务器的配置就会暴露。
首先反编译CobaltStrike.jar,在/beacon/BeaconPayload.class,将反编译出的代码copy出来,拷贝到BeaconPayload.java,修改0x2E为0x4E。
编译:javac -encoding UTF-8 -classpath cobaltstrike.jar BeaconPayload.java
改完代码层面,现在要开始对dll文件做修改
看零队大佬写的博客 Bypass cobaltstrike beacon config scan
在我修改的时候出现的问题是密钥找不到,我已经升级到了4.4,密钥的生成规则改了,找不到密钥无法解密。只能放弃。
Comments | NOTHING