Cobaltstrike反制方法小结

本文仅作为学习记录,如有侵权,请联系删除!

0x01 批量伪装上线:


以HTTP Beacon为例,在CS的上线过程中,有一串很明显的加密Cookie,是非对称RSA加密类型,需要一个私钥Private Key才能对其进行解密,实际情况里我们并拿不到

可以利用以下代码来提取Private Key与Public Key:

import java.io.File;
import java.util.Base64;
import common.CommonUtils;
import java.security.KeyPair;

class DumpKeys
{   
    public static void main(String[] args)
    {
        try {
            File file = new File(".cobaltstrike.beacon_keys");
            if (file.exists()) {
                KeyPair keyPair = (KeyPair)CommonUtils.readObject(file, null);
                System.out.printf("Private Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())));
                System.out.printf("Public Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())));
            }
            else {
                System.out.println("Could not find .cobaltstrike.beacon_keys file");
            }
        }
        catch (Exception exception) {
           System.out.println("Could not read asymmetric keys");
        }
    }
}

把这个java文件放置在CS服务器的CS文件夹下,在JDK11版本下运行:

java -cp cobaltstrike.jar Dumpkeys.java

继续沿着思路展开,数据包中的核心是加密后的Cookie,那么我们能否进行伪造,达到假主机上线的效果。

上线包的请求Cookie值是受控主机元数据经过非对称加密后的密文,CS服务器接收到Cookie值后进行解密从而获取到受控主机信息。受控主机元数据包含了若干敏感信息:

HTTP型Beacon 上线包的核心在于Cookie,Cookie是对受控主机元数据的非对称加密的密文

一般攻击者会自定义Malleable C2 Profile修改默认流量特征,这里以jQuery为例,尝试通过重放数据包,观察Server是否成果响应了我们的请求,last是否被重制为1s

但这里有个限制,只能伪造已经上线的主机,不能伪造新的受控主机。但若我们了解上线的整个过程,数据是如何被加密的,就有可能在短时间内大量伪造假主机上线。

以Stager型Beacon为例,回顾下CS上线流程:

  • 攻击者利用CS Server生成新的Beacon监听(包括一对非对称公私钥)并生成Stager;
  • 攻击者投递Stager到受控主机;
  • 受控主机在Exploit阶段执行小巧的Stager;
  • 受控主机根据Stager Url请求特征向Beacon Staging Server下载体积较大更复杂的Stage到本地,Beacon Staging Server会校验Url的合法性;
  • Stage解密并解析Beacon配置信息(比如公钥PublicKey、C2 Server信息);
  • Stage通过公钥PublicKey加密主机的元数据并发送至C2 Server;
  • C2 Server用私钥解密数据获取主机元数据。

其中核心在于两个部分:Stager Url校验算法Beacon配置的解密算法

  • Stager Url校验算法:

关键函数包括:checksum8、MSFURI、isStager
MSFURI函数从大小写字母+数字的字符数组中随机指定长度的字符序列并调用checksum8函数计算字符序列的ASCII和与256的模是否等于固定值(32位Stage与64位Stage分别使用92、93作为固定值)

也就是说,我们可以通过生成4位的随机校验码,通过checksum8算法获取文件,这里以7vv9为例:55+118+118+57-256=92

  • Beacon配置的解密算法:

利用以下几个项目进行解密:
https://github.com/Sentinel-One/CobaltStrikeParser
https://blog.didierstevens.com/2021/06/15/update-1768-py-version-0-0-7/

Public key别忘了要删点后面的无效Padding
正确的格式是MIGfXXXXXXXXXXXXXXXX==,后面那一堆AAAAA要删掉
注意:第二个项目解出来的是十六进制字符串,无法还原成原始字符串,菜是原罪

从解密数据中获取到PublicKey和C2 Server地址

最后就是伪造上线了,利用项目地址:
https://github.com/LiAoRJ/CS_fakesubmit
https://github.com/hariomenkel/CobaltSpam

由于红队会使用各式各样的C2 Profile来混淆通信流量,需要根据捕获到的C2上线流量或者根据Beacon配置解密信息对代码进行适当修改,以jQuery Profile为例,需要对请求头进行补充:

实战环境下可以写循环语句,不停模拟上线操作,让攻击者即使能够上线也无法执行命令

实现效果图:

  • 红队防御措施:

修改CS代码上述2种算法的逻辑,阻止虚假主机上线和C2挖掘

0x02 CVE-2022-39197:


该漏洞允许攻击者通过在Beacon配置中设置假用户名,触发XSS,进而在 CS Server上造成远程代码执行。

影响版本:Cobalt Strike <= 4.7

漏洞的本质是swing html的问题,在内容的开头插入标签后续的内容就会被格式化为html文档进行解析,但很多标准标签在swing这个场景里或多或少都受到一些功能限制

利用上述的CS伪造上线的脚本:CS_fakesubmit
把user字段改为,当图片不在的话,就会显示断裂

补充:还会存在一定的拒绝服务的效果,攻击之后再操作CS客户端会非常卡

这里利用的话可以通过劫持ntlm-hash,然后利用hastcat等工具破解密码,以MSF为例:

use auxiliary/server/capture/smb
run

发送payload后,成功获取到ntlm-hash:

以Responder为例:python3 Responder.py -I eth0,成功了一次,后面都失败了。。。

hashcat破解成功获取密码:hashcat -m 5600 SWS::SWS-PC:303b0cd3404fabc9:8cd2c75c6ebe62df193c9fc5b0..... pass.txt

后续在VPS上复现的时候,发现国内厂商基本都禁止445端口开放到互联网,尝试本地端口转发也不行,那么劫持ntlm-hash这条路似乎就走不通了,萌新求带

参考如下:


反击CobaltStrike(一) 以假乱真 - SecPulse.COM | 安全脉搏
奇安信攻防社区-CS反制之批量伪装上线
cobaltstrike RCE-part1
域内窃取哈希一些技术

你可能感兴趣的:(Cobaltstrike反制方法小结)