0%

CS流量分析

Cobalt Strike简介

Cobalt Strike 是一款GUI的框架式渗透工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成,office宏病毒生成,木马捆绑;钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等等。

Cobalt Strike工作流程

Cobalt Strike是以C/S架构为基础的渗透测试软件,分为clint端、server端和被控端。

1.被控端发送心跳包

2.server端收到心跳包并记录被控端主机信息

3.被控端再次发送心跳包询问server端是否有指令

4.clint端发送指令给server端

5.server端接受指令并加密,发送给被控端

6.被控端接受指令并解密,把执行结果返回到server端

1722952100_66b229a4acd64c19f3206.png!small

这里Stager是指cs的beacon类型,用的最多的就是stager和stageless这两种。

  • stage (有阶段)
  • stageless (无阶段)

所谓的stage(有阶段),指的是Beacon会分段的加载shellcode(具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行),stageless(无阶段),则是在生成时则包含完整的shellcode。

流程分析

上线

这里的上线指的是上图中第三步和第五步的流量通信

image-20241220171334422

受害端请求了一个特殊的URI,这个是根据受害机器的架构随机生成的,将这四个字符的ascii码相加,并mod256,如果是93,那么为x64,92,则为x32

image-20241220171612537

下面的响应体就是完整的shellcode,我们可以通过这个python脚本获取一些信息:https://github.com/minhangxiaohui/CSthing/blob/master/1768_v0_0_8/1768.py

image-20241220173954906

点击里面的HTTP,选择对应的流量并导出

image-20241220174033518

心跳包传输

这里指的是第七步

image-20241220174944877

受害机会用公钥加密自身的一些信息以及伪随机生成一个AES的密钥放置到Cookie字段中(RSA是非对称加密,AES是对称加密)

这个Cookie字段中的内容我们也称为CS的元数据(metadata),这一步的数据包其实也对应心跳包或任务执行的数据包

所以我们必须得有私钥才能解密Cookie里面的值,私钥在服务端的.cobaltstrike.beacon_keys文件中,然后使用如下代码获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sleep.runtime.Scalar;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.KeyPair;
import java.util.Base64;

public class test {
public static void main(String[] args) throws Exception {
ObjectInputStream var2 = new ObjectInputStream(new FileInputStream(".cobaltstrike.beacon_keys"));
Scalar var3 = (Scalar) var2.readObject();
var2.close();
KeyPair keyPair1 = (KeyPair) var3.objectValue();

System.out.println("private key: " + new String(Base64.getEncoder().encode(keyPair1.getPrivate().getEncoded())));
System.out.println("public key: " + new String(Base64.getEncoder().encode(keyPair1.getPublic().getEncoded())));
}
}
image-20241220180532785

需将两个jar包添加为库,将得到的公钥进行base64转hex的操作,发现和刚刚拿到的是一致的

image-20241220180648744

使用脚本解密cookie值:https://github.com/minhangxiaohui/CSthing/blob/master/cs-decrypt-metadata_V0_0_1/cs-decrypt-metadata.py

1
python2 cs-decrypt-metadata.py -p 私钥 待解密内容
image-20241220181455038

里面就是一些受害者的基本信息,还有一些key值

任务执行

首先在响应体中发送待执行命令(如果没有命令的话,响应体是空的)

image-20241220182919873

然后受害端通过POST请求体返回执行结果

image-20241220183032071

用这个脚本解密一下(https://github.com/DidierStevens/Beta/blob/master/cs-parse-http-traffic.py)

1
python cs-parse-http-traffic.py -r 730c8f6e0e02f43708750e9d5c4f9dc1 2.pcapng

image-20241220195157644

成功得到命令结果