
简介Cobalt Strike 4.5是面向渗透测试、红队评估与安全研究的C2框架支持HTTP/HTTPS/DNS/SMB等多种协议上线主机内置提权、凭据导出、端口转发、Socket代理、Office攻击、文件捆绑、钓鱼等功能并可调用Mimikatz等外部工具完成内网横向渗透。资源为zip压缩包共27个文件、约49.12MB包含jar主程序、Windows/Linux启动脚本、bat/vbs辅助脚本、dll插件、properties/cna配置、txt说明文档以及4.5/4.6版本英文用户指南PDF覆盖从部署、上线到插件扩展的主要环节。已有1573人学习下载。借助该包可快速配置团队协作服务器与中文化启动环境理解各文件类型在二次开发和插件加载中的用途适合具备网络安全基础、希望系统掌握CS工具链的渗透测试人员和红队成员。1. Cobalt Strike 4.5红队项目里那些“还在跑老版本”的真相Cobalt Strike 4.5 是很多红队项目里仍在运行的商业 C2 协作平台尽管新版本已经出了好几代可我在实际评估里遇到最多的反而就是 4.5。它要解决的是“一次授权评估里多人、多机、多协议的 C2 会话如何统一管理和协同作业”的问题。对红队队员来说它负责 Beacon 上线、命令下发和数据回传对蓝队来说4.5 也是锻炼检测能力最好的靶子。这篇就是写给那些刚拿到 4.5 授权包、想快速搭起来并跑通一轮验证的从业者先不追求花哨扩展只把环境、配置和排错思路理清楚。2. 部署前先搞清楚版本与运行环境Java 与 Teamserver 的匹配检查在装 4.5 之前先别急着双击启动。这个版本对运行环境的敏感程度超过你的预期我见过太多“为什么连不上”最后查出来是 Java 版本不对的情况。更麻烦的是部署阶段出现的很多提示长得像 Cobalt Strike 自身的问题实际上却是 Java、系统库或端口环境的问题。2.1 Java 版本决定 4.5 能不能跑起来Cobalt Strike 4.5 的 Server 端和 Client 端都走 Java官方要求 Java 11或者更高版本。4.5 发布时主流环境是 Java 11如果你机器上默认的 Java 是 8启动时多半会报 Java 版本错误或者直接没有任何反应。我一般会在启动前先执行java -version除了看清版本号还要确认传入的是 OpenJDK 还是 Oracle JDK。在纯内网环境里很多 Linux 发行版自带的是 OpenJDK这没问题真正让 Teamserver 起不来的是你没装图形库导致 Client 端连 UI 都打不开。4.5 的 Client 要在带桌面会话的 Windows 或 macOS 上跑Server 则不需要桌面但别忘了给 Server 装字体和时区数据否则在生成报告或处理中文路径时会出现乱码。检查完 Java 版本后我还会确认环境变量JAVA_HOME指向的是同一个版本。特别是用容器部署时重启容器后环境变量被改写teamserver脚本里写死的老路径会让你排查到崩溃。如果你同时装了多个 JDK不要只依赖PATH在启动脚本里显式指定export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH java -version这段是为了确保后续所有调用都用同一个 Java。4.5 的启动脚本不会自己检查JAVA_HOME它直接调用java所以在 PATH 上的版本必须是 Java 11。很多团队用了 Ansible 或 Docker 部署镜像里默认是 Java 8烧录进去之后才暴露这一点必须一开始写进环境准备清单。注意如果你在 Server 上开了防火墙先检查常用端口是否被占。端口冲突的报错信息和 Java 版本错误完全不一样别混淆。我见过有人在排查半天之后发现是 8080 被监控系统占用了。2.2 Server 端与 Client 端分离部署的注意点红队项目里最常用的部署方式是 Server 放一台 Linux 跳板机Client 装在每个人的本机上。4.5 的 Teamserver 需要一个密码多个 Client 连同一个 Server 时这个密码就是团队准入凭证。启动命令一般是./teamserver server-ip password c2profile.profile解释一下第一个参数是 Server 的 IP不是域名第二个参数是团队共享密码第三个参数是可选的 Malleable C2 配置。如果省略第三个参数默认走 4.5 内置流量模板但那样容易被防守方一眼认出来。参数说明server-ip决定了 Client 连接时输入的主机名或 IP也决定了 Beacon 回连的 Host。很多人在这里踩坑——Server 有多个网卡如果你用内网 IP 绑定那其他网段的机器连不上如果你用0.0.0.0又可能把服务暴露到不该暴露的网段。我一般会按评估范围单独指定不给0.0.0.0并在 Server 上做白名单访问控制。启动 Teamserver 时建议用nohup或screen托管避免 SSH 断掉后整个服务跟着下线nohup ./teamserver 10.10.1.5 S3cr3t team.profile /var/log/cs.log 21 日志文件很重要。4.5 不会把启动信息完整打到屏幕上如果端口被占用或者 Profile 解析失败看/var/log/cs.log最快。启动成功的标志是看到Connection received之类的日志出现并且进程一直不退出。如果日志里出现Failed to bind to port说明端口被占如果出现Unable to load profile说明第三个参数路径写错或语法有误。Client 端连 Teamserver 时启动cobaltstrike.jar会弹输入框填 Server 的 IP 和密码。如果连不上先分两层查第一层从 Client 到 Server 的 TCP 端口通不通第二层Server 端的 Java 进程是否还活着。很多团队卡在这不是 Cobalt Strike 问题是网络策略。用下面这条命令排查telnet 10.10.1.5 5005050050 是 4.5 默认的 Teamserver 通信端口。能连上但立即断可能是密码错误完全连不上则是网络或端口问题。2.3 从 4.4 迁移到 4.5配置兼容性核对清单如果你之前用的是 4.4想平滑升级到 4.5别指望直接拷贝整个目录。我踩过几次坑之后总结了一个核对清单Aggressor 脚本的版本兼容。4.5 调整了一些脚本 API你现有的alias和on事件如果用了旧字段加载时会报错甚至失去功能。修改过的 C2 Profile 文件里有些字段在 4.5 中做了新解析。比如http-get的metadata参数4.5 支持更多可变格式但旧写法依旧能跑只是效果不同。旧版本的数据文件比如.cobaltstrike.store不建议直接拿给 4.5 用。4.5 的激活和密钥体系没有变化但存储文件格式有过调整省得后面出现版本不兼容提示。第三方插件很多团队插件在 4.5 上需要重新编译或更新。别因为一个插件就卡住整个项目。以上几点我建议迁移后专门跑一轮最小验证启动 Server、用 Client 连上、开一个本地 HTTP Listener、让测试机器上线整套走通之后再迁正式任务。迁移过程中如果出现“项目文件弹出提示不支持 4.5”的情况多半不是文件损坏而是版本跨度太大4.5 已经无法解析旧项目的结构。这时候不要花时间修复旧文件直接新建项目并在此基础上重新挂 Listener 和脚本效率更高。3. 用 4.5 搭起一份可用的项目配置Listener、权限与 Beacon 命令当你把 Teamserver 跑起来后主要工作开始进入 Listener 和 Beacon 配置。4.5 的可视化操作很直观但直接在图形界面里点出来的配置往往缺少对参数边界的理解。我建议你在正式立项前先用手动方式把一套最小的 HTTP Listener 配通再慢慢加东西。4.5 的 Listener 和 Beacon 配置本质上就是解决两个问题Beacon 用什么协议回连以及回连后用什么命令和数据格式跟 Server 说话。下面按我的习惯逐步展开。3.1 Listener 类型怎么选从 HTTP 到 SMB 的取舍Cobalt Strike 4.5 提供多种 Listener常见的有 HTTP、HTTPS、DNS、SMB 和 TCP。我一直以来的选择逻辑是如果目标环境允许出站 HTTP/HTTPS优先用 HTTPS如果网络策略严格用 DNS如果只是为了内网横向移动中把数据从主机带出来SMB 或 TCP 更合适因为它们不额外创建新的出站连接。这里有一张我长期贴在工位旁边的选型表Listener 类型适用场景需要放行的端口主要坑点HTTP允许出站 HTTP 的宽松环境任意流量特征太明显防守方容易规则命中HTTPS更精细的环境443/8443证书配置繁琐需要额外维护密钥DNS只有 DNS 出站的环境53 UDP/TCP回传速度慢不适合大文件传输SMB内网横向连接445不能直接用于初始接入TCP内网专用自定义同样不适合跨网络场景听上去很清晰但参数组合才是坑。以 HTTPS Listener 为例配置里要填的字段包括HTTP HostBeacon 回连的域名或 IP。如果填域名你需要保证域名能解析到 Teamserver如果填 IP就要考虑这个 IP 在整个评估期间会不会变化。HTTP 端口443 或 8443 等。这个端口必须在你 Server 的防火墙策略里放行。证书信息4.5 支持配置证书一般用自签证书就要注意客户端信任问题。Beacon 不会校验证书但防守方的网络监测设备会。我一般会先把 HTTP Listener 跑通再换 HTTPS。因为 HTTP 排错容易抓包一眼能看出请求是否到达 ServerHTTPS 一旦证书配置错误抓包只能看到 TLS 握手失败定位耗时翻倍。如果只是快速验证环境直接用 HTTP 最省事。实际创建时在菜单栏选Listening Command填入名称比如http-local选 HTTP填上 Host 和端口保存即可。但要注意Beacon 生成时的回连地址用的是 Listener 里存的 Host而不是你当前输入框里的 IP。如果你在本地用127.0.0.1测试生成的 exe 到目标机器上就会回连127.0.0.1直接翻车。所以我通常把 Host 填成 Teamserver 的网卡 IP测试时再单独加一条 DNS 映射。3.2 用 Aggressor 脚本给 4.5 加上团队习惯4.5 的一个重要能力是 Aggressor 脚本。它不只是扩展菜单更可以让整个团队遵守同样的代码路径。比如我通常会在脚本里定义一套最快的权限检查快捷键选择一个 Beacon执行myinfo就能在输出窗口显示当前进程权限、当前用户、域信息。给一个最小脚本骨架alias myinfo { bshell($1, whoami hostname); }逻辑说明alias在 Aggressor 脚本里用于注册菜单命令$1是当前 Beacon 的 IDbshell($1, ...)让指定 Beacon 在目标上运行命令并回传输出。这里用了连接两条命令适合快速查看身份和主机名不产生大量噪音。参数说明如果你想看更多系统信息可以把命令换掉但最好不要用一整段systeminfo输出太长会在日志里刷屏。实际项目里我常用的组合是whoami、ipconfig /all和net config workstation每个字段短关键信息明确适合在多人协作时快速同步资产状态。加载脚本的方式很简单在 Client 菜单里Script Manager点Load选脚本文件。如果脚本版本和 4.5 不兼容界面会弹出错误。这时候优先查函数名是否在 4.5 里被重命名而不是怀疑脚本逻辑。4.5 对旧脚本的兼容性比 4.4 要好但也不是 100% 通吃。3.3 Beacon 交互中的团队协作命令与参数4.5 的 Beacon 命令很多但真正在团队协作里高频使用的是sleep、note、spawn和download。比如刚上线时我会让所有队员先执行sleep 5说明把回连间隔调成 5 秒便于快速确认链路。等确认链路正常之后再调回 60 秒或更久减少网络痕迹。注意 4.5 的sleep是以秒为单位最小可设 1但设太短会让目标机器上的 Beacon 频繁出网日志量变大。另一个常用命令是note给当前会话打备注比如“这是 HR 域控”。这个备注会同步给整个 Teamserver 上的队友。有了它多人同时操作时不容易重复登记同一台机器。我见过很多团队不写 note结果两小时后所有人都在问“这台机器谁打的”这属于典型协作成本问题。还有spawn从当前 Beacon 派生一个新的 Beacon 进程通常用于从当前权限稳定的主机上生成一个新的 HTTP 或 HTTPS 会话。注意spawn需要指定监听器名称4.5 中可以在图形菜单里选。如果没选择默认沿用当前监听器会在目标上多留一个进程。多留进程不是问题问题是目标环境如果有 EDR新进程创建事件很容易被捕捉。所以我一般只在需要切换 Listener 时才用spawn。Beacon 的命令输出都在 Console 面板。4.5 默认不会把每台主机的历史操作合并到一个时间线里所以建议队员自己维护一份简单的清单把上线时间、IP、账号、权限级别记录在案。配合note命令这个流程能让项目收尾时少很多返工。4. 4.5 现场常见问题与避坑从“不支持 4.5”提示到回连不上的排查这一章我按真实环境里最容易翻车的几条经验来写每一条都是“现象 → 原因 → 解决”的结构。把这些搞清楚比多记几个命令更有用。4.1 旧项目文件弹“不支持 4.5”的提示现象你用 4.5 的 Client 打开一个之前由 3.x 或 4.0 创建的项目文件界面直接弹“unsupported version”或“不支持 4.5”之类的提示。原因项目文件里存在版本标记4.5 的解析器无法识别过于老旧的格式。很多时候是之前版本的 Aggressor 脚本或 Listener 配置残留导致文件结构不兼容。解决不要尝试修复旧文件。正确的做法是新建一个项目然后把旧项目里还在用的 C2 Profile、Listener 设置和脚本手动移植过去。如果你保存过自己的脚本可以直接重新加载如果没保存那就只能重新写。我通常会在每次迭代前把脚本放进 Git 仓库避免这种“找不到原始脚本”的尴尬。遇到这个提示时优先确认你手里拿到的是不是官方原版压缩包而不是来源不明的整合包——有些整合包会捆绑旧配置启动时更容易触发版本提示。4.2 Teamserver 日志正常但 Beacon 始终不上线现象Teamserver 日志里能看到连接请求但目标机器上生成的 Beacon 始终没有上线图标。原因最常见的是 Malleable C2 Profile 里的http-get或http-post字段和 Listener 端口不匹配。比如 Listener 监听在 8080但 Profile 里写死了一个不存在的set uri路径Beacon 每次请求都打在一个空端口上自然上不了线。另一种可能是目标环境的防火墙只放行了 80 端口而你的 Listener 在 8080。解决先做一个隔离测试。在 Teamserver 上用curl模拟一次请求curl -v http://127.0.0.1:8080/check如果返回了 404 或 200说明端口是通的如果连接被拒绝说明 Teamserver 没监听成功回查防火墙或 Java 进程。然后去检查 Profile 里的 URL 路径拿 4.5 自带默认 Profile 重跑一遍确认不是自定义 Profile 的锅。注意Beacon 默认不会在目标机器上打印日志。如果你不确定它有没有跑起来可以看它是否创建了互斥体。但很多 EDR 已经能检测互斥体所以这步要做在隔离环境里。4.3 Listener 端口明明设为 8443抓包看到的却是 443现象你在图形界面里把 HTTPS Listener 配成 8443生成的 Beacon 也用了同一个 Listener但防守方抓包看到目标机器在访问 443 端口。原因你八成没有改干净。4.5 的 Beacon 生成时会自动把 Listener 配置里的HTTP Port写入可执行文件但如果你在生成时手动选择了某个模板模板里可能覆盖了端口号。特别是用Artifact和Payload Generator生成 exe 时窗口里有一个独立的端口字段它优先级更高。解决生成 payload 之前重点检查生成窗口里显示的最终端口而不是 Listener 配置页里的端口。两个地方不一致以生成窗口为准。更可靠的做法是生成后用十六进制编辑器搜一下端口号对应的二进制值确认写进去的是 8443。别问我是怎么知道的——我第一次带项目时也在这上面花了半天。4.4 高并发会话时 Client 端卡死或假死现象同时有二十几个 Beacon 在线Console 界面滚动很慢切换主机标签要等好几秒偶尔直接无响应。原因4.5 的 Client 是 Java 桌面应用占用内存和 CPU 都有限。默认内存上限可能只有 512MB 或 1GB当 Beacon 事件日志积压时UI 线程会变得极度卡顿。解决启动 Client 时手动调大内存java -XX:ParallelGCThreads4 -Xmx2048M -jar cobaltstrike.jar-Xmx2048M表示最大堆内存 2GB。如果机器内存 16GB可以给到 4GB再多没必要。内存调大后还需要控制 Console 输出量设置sleep不要太短减少不必要的bshell长输出。还有一个习惯是定期在 Teamserver 端清理历史日志4.5 会把事件写到本地文件文件越大 UI 越慢。4.5 有些 Windows 主机上线后没有权限执行命令现象Beacon 图标亮了但执行shell whoami返回Access denied或者压根没有回显。原因生成的 Beacon 进程是以普通用户权限运行的。4.5 默认不会自动提权如果你通过鱼叉或文档模板打进去进程上下文就是那个点击文档的用户。很多基础命令读不到安全日志和注册表是因为权限不到位。解决先用help看是否有提权插件再用getsystem尝试提权或者换一种进程注入方式。如果getsystem失败不要反复试容易触发行为检测。更稳妥的做法是换一个 Listener 类型重新生成 payload利用当前会话spawn一个新进程争取在高权限进程中运行。注意提权失败多半是目标系统补丁更新过不是 4.5 的问题排查方向别跑偏。5. 从蓝队视角反读 4.5 的流量特征检测与加固思路4.5 虽然是个老版本但防守方对它的检测规则反而最成熟。写这章的目的是让你在做红队评估时知道自己会暴露在哪里而不是教你绕检测。只有理解了流量特征才能正确评估手头工具的风险边界。5.1 4.5 默认 Beacon 在流量里长什么样4.5 的默认 HTTP Beacon 有很明显的特点User-Agent 通常是Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)URL 路径固定且短。回连时先发一个 GET 请求拉取任务有数据回传时再发一个 POSTPOST 的 body 里是加密后的数据长度在几百字节上下波动。防守方把这些特征拆出来就能写规则特定 URI、特定 UA、特定请求频率。所以如果你直接用默认配置打外网大概率会被流量检测设备识别。这也是为什么 4.5 一定要配 Malleable C2 Profile 的原因。但注意Malleable 只能改变应用层特征改不了行为层的固定频率和数据包大小模式。5.2 Malleable C2 配置是双刃剑Malleable C2 Profile 可以把流量伪装成正常的 API 调用、登录请求或静态资源访问。4.5 对 Profile 的解析能力比早期版本强支持自定义http-get、http-post、set字段和响应头。但这也带来一个问题如果你用了网上公开的 Profile防守方只需要查每个公开 Profile 的指纹就能精准签字。我见过防守团队把常用的 JQuery Profile、Google 字体 Profile、Microsoft Update Profile 全部做成指纹库红队什么都没做就暴露了。所以真正有效的 Profile 需要针对目标环境做小改动比如把 UA 改成目标企业默认的浏览器 UA把请求路径改成真实存在的业务路径。这不是让你抄配置而是让你理解“模拟的对象和真实环境越接近越难区分”。5.3 防守方可以从中沉淀哪些规则如果你是蓝队建议从三个维度做检测。第一看长连接Beacon 每 60 秒回连一次连接频率稳定没有人为抖动。第二看响应头很多自定义 Profile 会刻意补响应头来模仿业务系统但状态码和头部字段顺序会露馅。第三看进程链Beacon 多数是通过 Office 宏或漏洞利用进程拉起进程启动参数里经常带奇怪的时间戳和路径。4.5 的 HTTPS Beacon 还有一层证书问题官方演示证书被大量使用防守方可以直接拉黑这个证书的负载均衡特征。所以如果你在 4.5 里用了默认证书那基本都是被点名状态。我在自己的项目里证书一定是单独生成的至少做到每个评估环境不重复。6. 把 4.5 的重复劳动收进一个 Aggressor 脚本可复现的扩展流程前面讲的都是基础部署和配置最后一章我讲讲自己受益最多的习惯把重复劳动收进 Aggressor 脚本。4.5 的脚本 API 不算新但足够把日常验证流程自动化。我常用的一段脚本是给新上线 Beacon 自动打标签on beacon_initial { println(New beacon: . beacon_id); }这段在 4.5 里含义很直接当一个 Beacon 首次上线时Console 立即打印它的 ID。真正的生产级脚本不会这么简单但你可以从这里开始把alert、note等行为串起来。比如收到新 Beacon 后自动执行note填入当前时间戳效果如下on beacon_initial { note($1, online at . formattedtime(now(), yyyy-MM-dd HH:mm:ss)); }逻辑说明$1是新会话的 IDnote给它加备注formattedtime格式化当前时间。这样团队里任何一个人打开 Beacon 列表都能看到上线时间不用翻日志。参数说明时间格式按 4.5 支持的格式写建议用 24 小时制避免上下车歧义。写完后在Script Manager里加载如果语法没问题右下角会提示脚本已加载。如果报错八成是函数名大小写或者字段名不对4.5 对大小写敏感第一行报错最常见。延伸一步我还会写一个命令把当前所有 Beacon 的 IP 和最后回连时间导到 CSV。这里不贴完整代码思路是遍历beacons()返回的 ID 列表逐个取info或metadata字段再用file_append写入本地文件。这个 CSV 在项目结束写报告时非常有用能避免手动翻 UI。这套习惯坚持下来最大的收益不是省几秒钟而是让每个项目从第一天起就有一致的脚本、备注和日志格式最后交付时不用靠回忆补记录。做安全评估结果要可复现过程更要可追溯。希望帮到你。本文还有配套的精品资源点击获取