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端
这里Stager是指cs的beacon类型,用的最多的就是stager和stageless这两种。
- stage (有阶段)
- stageless (无阶段)
所谓的stage(有阶段),指的是Beacon会分段的加载shellcode(具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行),stageless(无阶段),则是在生成时则包含完整的shellcode。
流程分析
上线
这里的上线指的是上图中第三步和第五步的流量通信

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

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

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

心跳包传输
这里指的是第七步

受害机会用公钥加密自身的一些信息以及伪随机生成一个AES的密钥放置到Cookie字段中(RSA是非对称加密,AES是对称加密)
这个Cookie字段中的内容我们也称为CS的元数据(metadata),这一步的数据包其实也对应心跳包或任务执行的数据包
所以我们必须得有私钥才能解密Cookie里面的值,私钥在服务端的.cobaltstrike.beacon_keys文件中,然后使用如下代码获取
1 | import sleep.runtime.Scalar; |

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

使用脚本解密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 私钥 待解密内容 |

里面就是一些受害者的基本信息,还有一些key值
任务执行
首先在响应体中发送待执行命令(如果没有命令的话,响应体是空的)

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

用这个脚本解密一下(https://github.com/DidierStevens/Beta/blob/master/cs-parse-http-traffic.py)
1 | python cs-parse-http-traffic.py -r 730c8f6e0e02f43708750e9d5c4f9dc1 2.pcapng |
成功得到命令结果