反击CobaltStrike

原创
09/03 13:37
阅读数 326

 

背景

CobaltStrike(简称CS)作为一款渗透测试神器,采用C/S架构,可进行分布式团队协作。CS集成了端口转发、服务扫描、自动化溢出、多模式端口监听、Windows exe与dll 木马生、Java 木马生成、Office 宏病毒生成、木马捆绑等强大功能,深受广大红队同学的喜爱。为了规避侦测,红队往往会对CS采用一些隐匿手段,常见方式有云函数和CDN等。这些隐匿手段隐匿了CS的真实IP,诸如DDoS之类的流量无法穿透CDN到达CS,常规的攻击方式难以对CS服务器形成有效干扰和打击。只能止步于此了吗?有没有反击CS的奇技淫巧?答案当然是肯定的!接下来带各位看官体验一种批量伪造肉鸡来戏耍CS的新方法,希望各位蓝队同学引(付)以(诸)为(实)戒(践)。

 

CS上线流量特征分析

首先,我们先研究下CS上线的流量有无特征。图1使用Wireshark分析HTTP型Beacon的上线包。

图1

肉眼来看,上线包的敏感信息隐藏到了Cookie中,特征非常明显。通过进一步分析,我们发现上线包的请求Cookie值是受控主机元数据经过非对称加密后的密文,CS服务器接收到Cookie值后进行解密从而获取到受控主机信息。受控主机元数据包含了若干敏感信息,如图2所示:

图2

此处划重点,HTTP型Beacon 上线包的核心在于Cookie,而Cookie是对受控主机元数据的非对称加密的密文。

 

 HTTP Beacon重放实验

由于HTTP属于明文传输协议,HTTP型Beacon的上线过程存在中间人重放的可能。

我们做了一个简单的测试,验证了这种可能性(此处迫于运营小姐姐压力,稍微有凑字数嫌疑)。

首先抓取测试环境中的HTTP Beacon上线请求,使用Python脚本(如:图3)进行重放(注意:Header头信息不能错误,CS Server对Header头检查非常严格)。

图3

结果显示,重放Response符合我们的预期,CS Server成功响应了我们的请求。(如:图4)

图4

此外,红队同学在使用CS时候会自定义Malleable C2 Profile修改默认流量特征,但是这个对中间人重放没有影响。

新的问题产生了。

中间人重放的方法,只能伪造已经上线的主机,不能伪造新的受控主机。

这句话翻译过来就是,没啥鸟用。

好了,字数凑够了。书接上回,言归正传。

现在聚焦最迫切的问题:有没有办法伪造全新的受控主机呢?

答案当然是肯定的。

 

新主机伪造

我们先看一个效果图(如:图5)。

 

图5

短时间内大量主机上线。想想1分钟上线了千八百个主机,红队同学是不是有点慌?这是如何做到的呢?

我们以Stager型Beacon为例,按照KillChain模型从攻击者角度回顾下CS上线流程(如:图6)。

图6

攻击者利用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用私钥解密数据获取主机元数据。

从上述流程中,我们能Get到2个核心点:

Stager Url校验算法

Beacon配置的解密算法

与CS Server合法通信的问题等价转换为获取Stager Url和Beacon解密问题,即:

CS/C2 Server合法通信 = (Stager Url校验算法,Beacon解密算法)

只要拿到了(Stager Url校验算法,Beacon解密算法),相当于我们掌握了与CS/C2 Server合法通信的凭据。我们分别对上述2个核心点进行分析。

 

 Stager Url校验算法

Stager Url校验算法在公开的NSE脚本中可以找到,关键函数包括:checksum8、MSFURI、isStager。

其中,MSFURI函数从大小写字母+数字的字符数组中随机指定长度的字符序列并调用checksum8函数计算字符序列的ASCII和与256的模是否等于固定值(32位Stage与64位Stage分别使用92、93作为固定值),如果相等返回字符序列,否则继续直至找到符合条件的字符序列。MSFURI(如:图7)、checksum8(如:图8)、isStager(如:图9)函数的定义:

图7

图8

图9

如果找到符合条件的字符序列,则作为Stager Url向Beacon Staging Server发送下载请求。Beacon Staging Server在_serve函数中校验Url的合法性,如:图10。

图10

至此,我们获取到了Stager Url的校验算法,手动下载Stager。下载效果如图11下:

图11

很好!已经成功一半了。接下来,我们再来研究Beacon配置的解密算法。

 Beacon配置解密算法

感谢前人栽树!

之前已经有人发布了Beacon配置的解密算法,比如JPCERT的Volatility插件cobaltstrikescan(https://github.com/jpcertcc/aa-tools/blob/master/cobaltstrikescan.py)、美国SentinelOne安全公司开源的CobaltStrikeParser工具(https://github.com/Sentinel-One/CobaltStrikeParser)等。

具体的解密算法此处不再赘述,感兴趣的同学可参考上述的开源工具。解密结果如图12所示:

 

图12

从解密的配置中可以看到PublicKey和C2 Server地址。

OK!2个算法我们都已经搞定,接下来就该反击CS了!

 

反击!

万事俱备,只欠东风!

想象以下场景:蓝队同学防守时获取到了一个CS的上线地址。

首先,构造Stager Url下载Stage,如果在抓到CS上线地址的同时抓到了Stage,此步可跳过。

然后,解析Stager Beacon的配置文件,得到了PublicKey公钥与C2 Server地址。

最后,构造虚假主机元数据,加密发送至C2 Server。

Github上开源的CobaltSpam(https://github.com/hariomenkel/CobaltSpam)已实现此功能,但CobaltSpam上线的主机信息都是随机生成,很容易被识破。因此,需要将主机信息伪造的更加准确,提高混淆度。

最终,通过修改CobaltSpam代码,添加自定义的更加精准的主机信息,达到了我们想要的效果,如:图13。

图13

最终效果见下图(图14)!!!

图14

 

结语

通过这种以假乱真的方法,蓝队同学可很好的混淆红队同学的视线,以此来反制攻击者。

对于低级的攻击者而言,目前不能够很好的防御这种攻击手段。

同样,上面提及的2种算法可用于Beacon Staging Server和C2 Server的挖掘。

目前,防御上述反制的方法,可通过修改CS代码上述2种算法的逻辑,阻止虚假主机上线和C2挖掘。

在HVV过程中,如果发现红队的CS木马样本或者CS服务器,我们可以用上述方法来混淆红队同学的视线、拖延他们的时间,让红队同学陷入怀疑人生的地步。

 

网络安全学习资料笔记

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部