CobaltStrike的心跳通信是其与受害者主机(即Beacon)之间保持连接并传输命令的重要方式。以下是对CobaltStrike心跳通信的详细解析:
一、心跳通信的基本概念
心跳通信是一种用于检测网络连接状态的机制。在CobaltStrike中,Beacon(即CobaltStrike在受害者主机上部署的后门程序)会定期向CobaltStrike的C2服务器(即TeamServer)发送心跳包,以确认双方的网络连接仍然有效,并询问C2服务器是否有新的命令需要执行。
1. 第一次请求时, beacon.exe 程序请求下载完整的 payload;
2. 下好 payload 就直接在内存里运行,也就是说 beacon 开始运行,它做了如下操作:
(1)收集主机信息,生成用于协商的原始密钥 raw key,还有一些其他数据;
(2)用 RSA 公钥加密这些数据,将其存储在请求包的 cookie 中,然后发送给 CS 服务器。
这是第一次心跳,之后 beacon 进入睡眠时间。而CS 服务器收到后,做以下操作:
(1)用 RSA 私钥解开密文,从中提取主机信息和 raw key;
(2)在 target 列表生成一个新的主机;
(3)基于 raw key 生成 AES KEY 和 HMAC KEY,用于后续的加密通信。
3. 睡眠时间过后,beacon 再次发送心跳包,这次发送的目的是询问 CS 服务器是否有命令下发。
如果有,CS 服务器将包含命令的数据用 AES 加密得到密文,以及用 HMAC KEY 计算出 hash ,以 (AES 密文+hash) 的格式存放在 response 报文的响应体中。
如果没有,就跟第一次心跳一样,返回响应体为空的 response 报文。
4. 如果 beacon 收到命令,就在受害者主机上执行。执行完后,将命令执行结果发送给 CS 服务器,并重新进入睡眠时间。
二、心跳通信的过程
- Beacon上线:
- Beacon首次启动时会向C2服务器发送上线请求,这个请求通常包含了用RSA公钥加密的受害者主机信息。
- C2服务器收到请求后,会使用RSA私钥解密信息,并基于解密后的信息生成AES密钥和HMAC密钥,用于后续的加密通信。
- 心跳包发送:
- 在Beacon上线并成功建立加密通信后,它会进入睡眠状态,等待一段时间后再次发送心跳包。
- 心跳包的主要目的是询问C2服务器是否有新的命令需要执行。如果没有新命令,C2服务器会返回一个空的响应包;如果有新命令,C2服务器会将命令加密后包含在响应包中发送给Beacon。
- 命令执行与结果返回:
- Beacon收到命令后会在受害者主机上执行,并将执行结果加密后发送给C2服务器。
- C2服务器收到结果后,会进行解密并展示给攻击者。
三、心跳通信的加密与解密
- 加密:CobaltStrike使用AES加密和HMAC签名来确保通信过程中的数据安全和完整性。AES密钥和HMAC密钥是在Beacon上线过程中基于受害者主机信息生成的。
- 解密:C2服务器使用对应的AES密钥和HMAC密钥来解密接收到的数据包,并验证数据的完整性。
四、心跳通信的自定义配置
- CobaltStrike允许攻击者通过修改配置文件来自定义Beacon的心跳间隔、检查频率等参数,以适应不同的攻击场景和需求。
- 攻击者还可以利用CobaltStrike提供的流量伪装功能来隐藏或伪装Beacon的心跳通信流量,以逃避安全检测。
1、cobalt strike malleable C2配置文件:
通过cobalt strike maleable C2配置文件可以修改框架内的各种默认值,操作者可以修改Beacon的内存占用,更改其检入的频率等等,甚至可以修改 Beacon的网络流量。
因此想要实现流量伪装,需要去整一个Malleable-C2-Profiles配置文件加载,脚本下载地址:
2、配置malleable:
解压后打开profile文件就可以在里面修改
参考文章:深入研究cobalt strike malleable C2配置文件 - 先知社区
3、执行:
修改完(或编写完)之后将profies上传到C2服务器上,先使用c2lint文件查看cobalt strike malleable C2配置文件(也就是上面的amazon.profile)有没有异常
五、总结
CobaltStrike的心跳通信是其实现远程控制受害者主机的重要机制之一。通过定期发送心跳包并加密传输命令和结果数据,CobaltStrike能够确保与受害者主机之间的网络连接稳定且安全。同时,攻击者还可以通过自定义配置来优化心跳通信的性能和隐蔽性。