跨平台重构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. 整体设计思路
重构时考虑的关键因素:
- 通信协议分析:深入理解CobaltStrike的通信协议,包括指令功能、服务端下发内容解析方式
- 跨平台兼容性:采用跨平台方法和库,减少重复功能实现
- 免杀实现:在功能实现上避免照搬CobaltStrike原版,结合语言特性进行免杀优化
- 稳定性保障:通过大量测试确保木马稳定性
- 体积优化:减少庞大库的调用,控制生成文件体积
3. 核心功能实现细节
3.1 命令执行功能
实现方案:
- Windows平台:使用Windows API
CreateProcess替代Go的os/exec- 有窃取/制作的Token时:使用
CreateProcessWithTokenW以Token权限执行 - 无Token时:使用
CreateProcess执行
- 有窃取/制作的Token时:使用
- Linux/Mac平台:使用
/bin/bash执行
命令类型:
shell:调用cmd执行命令run:调用执行程序本身execute:无回显执行
3.2 PowerShell执行优化
免杀实现方案:
- 原生base64编码执行:
powershell -nop -exec bypass -EncodedCommand dwBoAG8AYQBtAGkA - 内存免杀执行:
- 使用
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中的代理参数:ProxyOn = true Proxy = "http://ip:8080"
3.9 堆内存加密
实现参考:
- 基于文章《利用堆内存加密规避内存扫描》的技术
- 实现流程:
- sleep前挂起非主线程
- 遍历堆并对内存加密
- 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_WINDOW和IDLE_PRIORITY_CLASS隐藏窗口并降低优先级
4. C2Profile实现
已实现功能:
- 大部分流量侧设置
- 部分主机侧设置
未来优化方向:
- 服务端hook:允许自定义编码/加密算法
- 流量混淆:发送无规律正常流量扰乱检测
5. 免杀技术总结
关键免杀技术:
- 命令执行:避免使用易被检测的API,采用底层Windows API
- PowerShell:绕过监控使用底层.NET组件
- 内存操作:反射型加载、不落地执行
- 进程注入:优先注入自身减少可疑行为
- 流量处理:统一字符集避免异常
- 内存保护:堆内存加密技术
6. 项目维护与发展
未来计划:
- 持续维护和更新项目
- 集成更多免杀技术
- 优化流量混淆方案
- 提高各功能稳定性
7. 注意事项
- 部分功能如dllinject注入其他进程尚不稳定
- 堆内存加密可能影响程序稳定性
- 需充分测试各功能组合的兼容性
- 实际使用中应考虑目标环境调整配置
8. 参考资源
- geacon项目基础
- Reflective DLL Injection原始项目
- 堆内存加密相关技术文章
- timwhitez等师傅的相关工作
该项目通过重构CobaltStrike Beacon实现了跨平台兼容和免杀优化,在保持核心功能的同时提高了对抗主流杀毒软件的能力,为红队行动提供了新的技术选择。