跨平台重构CobaltStrike的Beacon并使行为对主流杀软免杀
字数 2497 2025-08-26 22:11:45

跨平台重构CobaltStrike Beacon并实现免杀行为的技术解析

1. 项目背景与概述

该项目基于geacon项目进行开发,使用Golang实现了CobaltStrike Beacon的大部分功能,同时针对主流杀毒软件进行了行为免杀优化。主要实现了两个版本:

  • geacon_pro:适配CobaltStrike 4.1+版本
  • geacon_plus:适配CobaltStrike 4.0版本

2. 整体设计思路

重构时考虑的关键因素:

  1. 通信协议分析:深入理解CobaltStrike的通信协议,包括指令功能、服务端下发内容解析方式
  2. 跨平台兼容性:采用跨平台方法和库,减少重复功能实现
  3. 免杀实现:在功能实现上避免照搬CobaltStrike原版,结合语言特性进行免杀优化
  4. 稳定性保障:通过大量测试确保木马稳定性
  5. 体积优化:减少庞大库的调用,控制生成文件体积

3. 核心功能实现细节

3.1 命令执行功能

实现方案:

  • Windows平台:使用Windows API CreateProcess替代Go的os/exec
    • 有窃取/制作的Token时:使用CreateProcessWithTokenW以Token权限执行
    • 无Token时:使用CreateProcess执行
  • Linux/Mac平台:使用/bin/bash执行

命令类型:

  • shell:调用cmd执行命令
  • run:调用执行程序本身
  • execute:无回显执行

3.2 PowerShell执行优化

免杀实现方案:

  1. 原生base64编码执行
    powershell -nop -exec bypass -EncodedCommand dwBoAG8AYQBtAGkA
    
  2. 内存免杀执行
    • 使用C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation目录下的System.Management.Automation.dll
    • 通过execute-assembly执行小工具powershell-bypass

3.3 PowerShell模块导入

实现思路:

  1. 在目标主机开放端口存放module内容
  2. 执行命令时从该端口下载module内容
  3. 进行不落地执行以避免杀软查杀

注意:部分Windows系统默认不开启模块导入功能,需要管理员权限

3.4 Execute-Assembly实现

原版CobaltStrike实现:

  1. 拉起rundll32.exe进程
  2. 注入patch过的反射型dll(用于建立.NET环境)
  3. 注入.NET程序并执行

重构优化方案:

  • 使用Go原生实现execute-assembly
  • 避免远程线程注入操作(易被杀软检测)
  • 解决执行回显获取问题

3.5 反射型DLL注入

技术细节:

  • 原版CobaltStrike的dll已被patch,可直接作为shellcode执行
  • 用户自定义dll需要手动定位ReflectiveLoader函数
  • 实现方案:
    1. 解析PE文件获取导出函数
    2. 查找ReflectiveLoader函数偏移
    3. 分配内存并写入dll内容
    4. 修改内存保护属性为可执行
    5. 创建线程执行

关键代码优化:

  • ExitProcess替换为ExitThread以避免进程退出
  • 支持参数传递

3.6 进程注入

两种注入类型:

  1. shinject:注入shellcode到其他进程
  2. dllinject:注入反射型dll到其他进程

实现区别:

  • 根据内容判断注入类型(检查reflectiveloader字样)
  • 目前主要支持注入到自身进程

3.7 令牌(Token)操作

功能实现:

  1. 令牌窃取:保存窃取的Token句柄
  2. 令牌模拟:使用ImpersonateLoggedOnUser模拟上下文权限
  3. 进程创建:使用CreateProcessWithTokenW以窃取权限创建进程

3.8 内网主机上线

解决方案:

  • 通过边缘主机代理上线
  • 配置config.go中的代理参数:
    ProxyOn = true
    Proxy = "http://ip:8080"
    

3.9 堆内存加密

实现参考:

  • 基于文章《利用堆内存加密规避内存扫描》的技术
  • 实现流程:
    1. sleep前挂起非主线程
    2. 遍历堆并对内存加密
    3. sleep结束后解密并恢复线程

注意事项:

  • 可能影响持久性任务(如keylogger、portscan)
  • Go的time.Sleep在挂起线程后可能存在问题,改用windows.SleepEx

3.10 字符集处理

解决方案:

  • 统一使用UTF-8字符集通信
  • 回传时对GBK结果进行转换:
    func CodepageToUTF8(b []byte) ([]byte, error) {
        if !utf8.Valid(b) {
            reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
            d, e := ioutil.ReadAll(reader)
            if e != nil {
                return nil, e
            }
            return d, nil
        }
        return b, nil
    }
    

3.11 自删除功能

Windows平台实现方案:

  • 使用CreateProcess创建新进程
  • 通过cmd执行删除命令:
    "c"+"m"+"d"+".e"+"x"+"e"+"/c"+" d"+"e"+"l "+filename
    
  • 设置CREATE_NO_WINDOWIDLE_PRIORITY_CLASS隐藏窗口并降低优先级

4. C2Profile实现

已实现功能:

  • 大部分流量侧设置
  • 部分主机侧设置

未来优化方向:

  1. 服务端hook:允许自定义编码/加密算法
  2. 流量混淆:发送无规律正常流量扰乱检测

5. 免杀技术总结

关键免杀技术:

  1. 命令执行:避免使用易被检测的API,采用底层Windows API
  2. PowerShell:绕过监控使用底层.NET组件
  3. 内存操作:反射型加载、不落地执行
  4. 进程注入:优先注入自身减少可疑行为
  5. 流量处理:统一字符集避免异常
  6. 内存保护:堆内存加密技术

6. 项目维护与发展

未来计划:

  • 持续维护和更新项目
  • 集成更多免杀技术
  • 优化流量混淆方案
  • 提高各功能稳定性

7. 注意事项

  1. 部分功能如dllinject注入其他进程尚不稳定
  2. 堆内存加密可能影响程序稳定性
  3. 需充分测试各功能组合的兼容性
  4. 实际使用中应考虑目标环境调整配置

8. 参考资源

  1. geacon项目基础
  2. Reflective DLL Injection原始项目
  3. 堆内存加密相关技术文章
  4. timwhitez等师傅的相关工作

该项目通过重构CobaltStrike Beacon实现了跨平台兼容和免杀优化,在保持核心功能的同时提高了对抗主流杀毒软件的能力,为红队行动提供了新的技术选择。

跨平台重构CobaltStrike Beacon并实现免杀行为的技术解析 1. 项目背景与概述 该项目基于geacon项目进行开发,使用Golang实现了CobaltStrike Beacon的大部分功能,同时针对主流杀毒软件进行了行为免杀优化。主要实现了两个版本: geacon_ pro:适配CobaltStrike 4.1+版本 geacon_ plus:适配CobaltStrike 4.0版本 2. 整体设计思路 重构时考虑的关键因素: 通信协议分析 :深入理解CobaltStrike的通信协议,包括指令功能、服务端下发内容解析方式 跨平台兼容性 :采用跨平台方法和库,减少重复功能实现 免杀实现 :在功能实现上避免照搬CobaltStrike原版,结合语言特性进行免杀优化 稳定性保障 :通过大量测试确保木马稳定性 体积优化 :减少庞大库的调用,控制生成文件体积 3. 核心功能实现细节 3.1 命令执行功能 实现方案: Windows平台:使用Windows API CreateProcess 替代Go的 os/exec 有窃取/制作的Token时:使用 CreateProcessWithTokenW 以Token权限执行 无Token时:使用 CreateProcess 执行 Linux/Mac平台:使用 /bin/bash 执行 命令类型: shell :调用cmd执行命令 run :调用执行程序本身 execute :无回显执行 3.2 PowerShell执行优化 免杀实现方案: 原生base64编码执行 : 内存免杀执行 : 使用 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation 目录下的 System.Management.Automation.dll 通过 execute-assembly 执行小工具 powershell-bypass 3.3 PowerShell模块导入 实现思路: 在目标主机开放端口存放module内容 执行命令时从该端口下载module内容 进行不落地执行以避免杀软查杀 注意:部分Windows系统默认不开启模块导入功能,需要管理员权限 3.4 Execute-Assembly实现 原版CobaltStrike实现: 拉起 rundll32.exe 进程 注入patch过的反射型dll(用于建立.NET环境) 注入.NET程序并执行 重构优化方案: 使用Go原生实现execute-assembly 避免远程线程注入操作(易被杀软检测) 解决执行回显获取问题 3.5 反射型DLL注入 技术细节: 原版CobaltStrike的dll已被patch,可直接作为shellcode执行 用户自定义dll需要手动定位 ReflectiveLoader 函数 实现方案: 解析PE文件获取导出函数 查找 ReflectiveLoader 函数偏移 分配内存并写入dll内容 修改内存保护属性为可执行 创建线程执行 关键代码优化: 将 ExitProcess 替换为 ExitThread 以避免进程退出 支持参数传递 3.6 进程注入 两种注入类型: shinject :注入shellcode到其他进程 dllinject :注入反射型dll到其他进程 实现区别: 根据内容判断注入类型(检查 reflectiveloader 字样) 目前主要支持注入到自身进程 3.7 令牌(Token)操作 功能实现: 令牌窃取 :保存窃取的Token句柄 令牌模拟 :使用 ImpersonateLoggedOnUser 模拟上下文权限 进程创建 :使用 CreateProcessWithTokenW 以窃取权限创建进程 3.8 内网主机上线 解决方案: 通过边缘主机代理上线 配置 config.go 中的代理参数: 3.9 堆内存加密 实现参考: 基于文章《利用堆内存加密规避内存扫描》的技术 实现流程: sleep前挂起非主线程 遍历堆并对内存加密 sleep结束后解密并恢复线程 注意事项: 可能影响持久性任务(如keylogger、portscan) Go的 time.Sleep 在挂起线程后可能存在问题,改用 windows.SleepEx 3.10 字符集处理 解决方案: 统一使用UTF-8字符集通信 回传时对GBK结果进行转换: 3.11 自删除功能 Windows平台实现方案: 使用 CreateProcess 创建新进程 通过cmd执行删除命令: 设置 CREATE_NO_WINDOW 和 IDLE_PRIORITY_CLASS 隐藏窗口并降低优先级 4. C2Profile实现 已实现功能: 大部分流量侧设置 部分主机侧设置 未来优化方向: 服务端hook:允许自定义编码/加密算法 流量混淆:发送无规律正常流量扰乱检测 5. 免杀技术总结 关键免杀技术: 命令执行 :避免使用易被检测的API,采用底层Windows API PowerShell :绕过监控使用底层.NET组件 内存操作 :反射型加载、不落地执行 进程注入 :优先注入自身减少可疑行为 流量处理 :统一字符集避免异常 内存保护 :堆内存加密技术 6. 项目维护与发展 未来计划: 持续维护和更新项目 集成更多免杀技术 优化流量混淆方案 提高各功能稳定性 7. 注意事项 部分功能如dllinject注入其他进程尚不稳定 堆内存加密可能影响程序稳定性 需充分测试各功能组合的兼容性 实际使用中应考虑目标环境调整配置 8. 参考资源 geacon项目基础 Reflective DLL Injection原始项目 堆内存加密相关技术文章 timwhitez等师傅的相关工作 该项目通过重构CobaltStrike Beacon实现了跨平台兼容和免杀优化,在保持核心功能的同时提高了对抗主流杀毒软件的能力,为红队行动提供了新的技术选择。