cobaltstrike DOS漏洞(CVE-2021-36798)分析
字数 1653 2025-08-04 00:38:21
CobaltStrike DOS漏洞(CVE-2021-36798)深入分析与防御指南
0x00 漏洞概述
CVE-2021-36798(又名hotcobalt)是CobaltStrike团队服务器(teamserver)中的一个拒绝服务漏洞,该漏洞存在于截屏(或键盘记录)功能的数据解析处理过程中。攻击者可以控制截屏大小参数,导致teamserver不断申请内存直至内存耗尽(OutOfMemory),从而实现拒绝服务攻击(DOS)。
0x01 影响范围
- CobaltStrike 4.2
- CobaltStrike 4.3
0x02 前置知识
CobaltStrike Beacon工作机制
Beacon是CobaltStrike运行在目标主机上的payload,用于长期控制受感染主机。其工作方式分为两种:
-
Staged Payload(分段payload):
- 先部署小型stager(通常为精短的代码)
- stager连接下载完整的Beacon payload(stage)
- 将stage注入内存执行
-
Stageless Payload(完整payload):
- 直接部署包含所有功能的完整payload
- 包括可执行文件、服务可执行文件、DLLs、PowerShell脚本等
Beacon通信流程
-
初始注册:
- Beacon运行时通过HTTP GET向teamserver发送元数据(metadata)
- 元数据包含CPU、IP、AES密钥等信息(使用RSA公钥加密)
-
任务交互:
- 攻击者通过HTTP GET向Beacon发送指令
- Beacon通过HTTP POST返回任务结果
- 通信使用初始注册时发送的AES密钥加密
关键文件
.cobaltstrike.beacon_keys:包含teamserver生成的公私钥,每个Beacon都内嵌公钥
0x03 漏洞重现
所需工具
-
伪造Beacon工具:
- CobaltStrikeParser中的
communication_poc.py
- CobaltStrikeParser中的
-
漏洞利用工具:
利用步骤
-
使用伪造Beacon工具注册假Beacon:
python3 communication_poc.py -
执行DOS攻击:
python3 CobaltStrikeDos.py http://[teamserver_ip]/
0x04 EXP流量分析
攻击流量特征:
-
初始请求:
- 请求checksum8格式的URL
-
注册阶段:
- 发送大量Beacon注册请求
-
攻击阶段:
- 发送大量包含超大截屏数据的Beacon响应
典型攻击数据包示例:
Rhm3p3/UZFiJbU0fOjQKPHcD3AoYy7OyB8p+3Py7l6WDazCa/fl/V4gCsdIhKYAT4XN60kNzUndaDbCflqqmsSjJts0rK70SjRGRdfTkBhNOASLVR34/+Cy3SuiO0CPL30yhHBDBAKRNZVo+inA3Qjvtyvu9emD9hVWwy7gkwlU=
0x05 漏洞分析
漏洞代码位置
decompiled-src/beacon/BeaconC2.java中的process_beacon_callback_decrypted方法:
else if (int1 == 3) { // 截图功能
final DataParser dataParser2 = new DataParser(CommonUtils.readAll(dataInputStream));
dataParser2.little();
final byte[] countedBytes = dataParser2.readCountedBytes(); // 取头4个字节整数作为截图大小
final int int3 = dataParser2.readInt();
final String process5 = this.getCharsets().process(s, dataParser2.readCountedBytes());
final String process6 = this.getCharsets().process(s, dataParser2.readCountedBytes());
if (countedBytes.length == 0) {
this.getCheckinListener().output(BeaconOutput.Error(s, "screenshot from desktop " + int3 + " is empty"));
return;
}
// 后续处理...
}
decompiled-src/common/DataParser.java中的readCountedBytes方法:
public byte[] readCountedBytes() throws IOException {
final int int1 = this.readInt(); // 取4个字节整数
if (int1 > 0) {
return this.readBytes(int1); // 返回这4个字节整数的大小
}
return new byte[0];
}
漏洞原理
攻击者可以伪造Beacon响应,在截屏数据包中指定一个极大的长度值(通过前4字节整数控制),导致teamserver尝试分配超大内存缓冲区,最终导致内存耗尽。
0x06 修复方案
-
官方修复:
- 升级至CobaltStrike 4.4或更高版本
-
配置防护:
- 在Malleable C2配置中设置
host_stage = false,防止Beacon设置信息被获取
- 在Malleable C2配置中设置
-
网络防护:
- 只允许可信的源访问teamserver
-
代码级防护(临时方案):
在截屏和键盘记录的处理分支中添加会话验证代码:if (this.data.isNewSession(s)) { this.getCheckinListener().output(BeaconOutput.Error(s, "Dropped responses from session. Didn't expect " + int1 + " prior to first task.")); CommonUtils.print_error("Dropped responses from session " + s + " [type: " + int1 + "] (no interaction with this session yet)"); return; }
0x07 参考资料
总结
CVE-2021-36798漏洞利用CobaltStrike对截屏数据大小验证不足的缺陷,通过伪造超大截屏数据包导致teamserver内存耗尽。防护措施应以升级到修复版本为主,同时结合网络访问控制和配置加固,全面降低被攻击风险。