前言

前几天上线时被流量设备拦住了,才想起这件拖了许久的任务。

去除特征

端口号

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,密钥的生成规则改了,找不到密钥无法解密。只能放弃。


"孓然一身 , 了无牵挂"