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,用于长期控制受感染主机。其工作方式分为两种:

  1. Staged Payload(分段payload):

    • 先部署小型stager(通常为精短的代码)
    • stager连接下载完整的Beacon payload(stage)
    • 将stage注入内存执行
  2. Stageless Payload(完整payload):

    • 直接部署包含所有功能的完整payload
    • 包括可执行文件、服务可执行文件、DLLs、PowerShell脚本等

Beacon通信流程

  1. 初始注册

    • Beacon运行时通过HTTP GET向teamserver发送元数据(metadata)
    • 元数据包含CPU、IP、AES密钥等信息(使用RSA公钥加密)
  2. 任务交互

    • 攻击者通过HTTP GET向Beacon发送指令
    • Beacon通过HTTP POST返回任务结果
    • 通信使用初始注册时发送的AES密钥加密

关键文件

  • .cobaltstrike.beacon_keys:包含teamserver生成的公私钥,每个Beacon都内嵌公钥

0x03 漏洞重现

所需工具

  1. 伪造Beacon工具

  2. 漏洞利用工具

利用步骤

  1. 使用伪造Beacon工具注册假Beacon:

    python3 communication_poc.py
    
  2. 执行DOS攻击:

    python3 CobaltStrikeDos.py http://[teamserver_ip]/
    

0x04 EXP流量分析

攻击流量特征:

  1. 初始请求

    • 请求checksum8格式的URL
  2. 注册阶段

    • 发送大量Beacon注册请求
  3. 攻击阶段

    • 发送大量包含超大截屏数据的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 修复方案

  1. 官方修复

    • 升级至CobaltStrike 4.4或更高版本
  2. 配置防护

    • 在Malleable C2配置中设置host_stage = false,防止Beacon设置信息被获取
  3. 网络防护

    • 只允许可信的源访问teamserver
  4. 代码级防护(临时方案):
    在截屏和键盘记录的处理分支中添加会话验证代码:

    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 参考资料

  1. SentinelOne HotCobalt分析
  2. CobaltStrikeParser工具
  3. CobaltStrikeDos利用工具
  4. CobaltStrike官方文档
  5. Beacon通信解密工具

总结

CVE-2021-36798漏洞利用CobaltStrike对截屏数据大小验证不足的缺陷,通过伪造超大截屏数据包导致teamserver内存耗尽。防护措施应以升级到修复版本为主,同时结合网络访问控制和配置加固,全面降低被攻击风险。

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 漏洞利用工具 : CobaltStrikeDos 利用步骤 使用伪造Beacon工具注册假Beacon: 执行DOS攻击: 0x04 EXP流量分析 攻击流量特征: 初始请求 : 请求checksum8格式的URL 注册阶段 : 发送大量Beacon注册请求 攻击阶段 : 发送大量包含超大截屏数据的Beacon响应 典型攻击数据包示例: 0x05 漏洞分析 漏洞代码位置 decompiled-src/beacon/BeaconC2.java 中的 process_beacon_callback_decrypted 方法: decompiled-src/common/DataParser.java 中的 readCountedBytes 方法: 漏洞原理 攻击者可以伪造Beacon响应,在截屏数据包中指定一个极大的长度值(通过前4字节整数控制),导致teamserver尝试分配超大内存缓冲区,最终导致内存耗尽。 0x06 修复方案 官方修复 : 升级至CobaltStrike 4.4或更高版本 配置防护 : 在Malleable C2配置中设置 host_stage = false ,防止Beacon设置信息被获取 网络防护 : 只允许可信的源访问teamserver 代码级防护 (临时方案): 在截屏和键盘记录的处理分支中添加会话验证代码: 0x07 参考资料 SentinelOne HotCobalt分析 CobaltStrikeParser工具 CobaltStrikeDos利用工具 CobaltStrike官方文档 Beacon通信解密工具 总结 CVE-2021-36798漏洞利用CobaltStrike对截屏数据大小验证不足的缺陷,通过伪造超大截屏数据包导致teamserver内存耗尽。防护措施应以升级到修复版本为主,同时结合网络访问控制和配置加固,全面降低被攻击风险。