简介:Cobalt Strike 4.5 是一款面向渗透测试、红队演练与安全教学场景的插件化攻击框架,支持 HTTP、DNS、SMB 等多种协议上线的 Beacon,集成提权、凭据导出、端口转发、Socket 代理、Office 攻击、文件捆绑与钓鱼等功能,也可调用 Mimikatz 等知名工具,对授权评估和攻防对抗学习均有较高实用价值。压缩包共 27 个文件、约 49.12MB,核心由 jar 服务端、exe/bat 启动脚本组成,另有 pdf 用户指南与 txt 说明文档便于查阅,cna/profile 提供扩展配置,远程桌面辅助等 dll 模块可支撑插件功能,资源内部结构清晰,部署与二次定制都较方便。已有 1573 人学习下载,属于较受欢迎的测试工具资源。借助包内汉化启动器与完整离线手册,可快速上手团队服务器搭建、监听器配置及 Beacon 上线方法;包内附带的扩展脚本与配置文件也给出可参考的默认行为样本,能帮助学习者理解工具扩展机制与典型后渗透配置思路,是入门到进阶阶段实用的一套完整资料。
1. Cobalt Strike 4.5:内网评估场景里最实用的“失陷后平台”
做过内网评估的人,大多遇到过这种尴尬:授权拿到了,命令也执行了,可连接一断你就成了瞎子,会话起不来、起得来又马上掉线,反复折腾一晚上。Cobalt Strike 4.5 就是我为这类“断线焦虑”准备的标准答案——它用 TeamServer 控制端、Beacon 会话体和多种 C2 监听协议,把上线、命令执行、横向移动和过程日志装进一个可多人协作的界面里。它是安全测试工具里的作战平台,适合有三五年渗透经验、要打真实内网爬坡场景的人,也适合蓝队拿它当攻防演练里的假想敌。一句话:它解决的是“一台主机失陷后到底能走多远”,前提是你先弄懂它的组件分工。
2. 组件分工:TeamServer、Beacon 与 Listener 各管哪一段
很多新手第一次打开 Cobalt Strike,会把它当成一个“点按钮弹shell”的工具,结果一开就是满屏的 Listener、Payload、Profile 名词,不知道从哪下手。我建议先把数据流画出来:目标机器上的 Beacon 定时向外回连,流量经由配置好的 Listener 进入 TeamServer,TeamServer 把会话状态推给 GUI 客户端;你的每一条指令,也是从 GUI 经 TeamServer 排队,等 Beacon 下一次回连时取走。理解这条链路,后面所有配置都是在决定“中间这一段流量长什么样子”。
2.1 TeamServer 与客户端:先搞清控制链路
TeamServer 是整套系统的心脏,默认监听在 50050 端口,负责维护所有 Beacon 会话、记录操作日志、把任务下发到正确的会话。它不直接接触目标网络,而是跑在你用来做控制的一台独立服务器上,比如云主机或内网跳板机。客户端是一个 Java 开发的 GUI,启动后输入 TeamServer 的 IP 和口令连上去,就能看到当前在线的会话列表。选型理由很简单:多人项目里,红队成员共用一个 TeamServer,会话状态、命令历史都在同一处存档,交报告时不用倒腾各自本机的零零碎碎。
我见过不少团队把 TeamServer 直接跑在自己日常用的笔记本上,结果目标网络一断,控制端跟着失联。正确做法是把 TeamServer 放在一张和目标网段可达、但和你日常办公网络隔离的测试机上,同时给 50050 端口做访问控制,不要让任何人拿到口令都能连进来。这个端口本身也有黑匣子属性——一旦被非授权的人接进来,你的所有命令记录和会话数据都等于裸奔。
2.2 Beacon 会话:从 Sleep 到任务执行的链路
Beacon 就是植入目标机器的轻量级“接线员”。它默认工作在低活跃模式——sleep 设置两次回连之间的间隔秒数,jitter 设置随机的浮动百分比,让回连时间点不完全规律。这一点和传统反弹 shell 有本质区别:反弹 shell 是 TCP 长连接,网络层一眼就能看到一根明显的外部连线,而 Beacon 是“定时来敲门”,每次敲门只做少量动作就断开,流量图上是零零散散的小点而不是一条长线。
任务执行是异步的。你在客户端输入 shell whoami,指令不会瞬间落地,而是先变成 Beacon 作业,等它下个周期回连时取走执行,再把输出结果带回 TeamServer。这个设计在实战里很有用,因为你可以把一堆动作排进队列,让 Beacon 一次性跑完,减少通信次数;代价是排错时不能立刻看到反馈,凡是“点了没反应”的,先检查 sleep 是不是设得太大。我一般建议初始 sleep 设在 10 到 20 秒之间,兼顾响应速度和隐藏效果,太短容易被抓,太长会把自己急死。
2.3 Listener 与 Payload 生成:先定协议再谈上线
Listener 可以理解成服务端对外开的“接线口”,它决定 Beacon 用 HTTP、HTTPS、DNS 还是 SMB 协议回来、挂在哪个端口上。最常见的是 HTTP Listener,配置简单、兼容性最好;需要加密流量就走 HTTPS;遇到出口限制严格的环境,才考虑 DNS 或 SMB。选型时要看目标网络的实际边界:如果目标只允许 443 出站,你还开 80 端口,那 Beacon 物理层面就回不来。
| Listener 类型 | 典型端口 | 适用场景 | 主要劣势 |
|---|---|---|---|
| HTTP | 80 / 8080 | 外网到内网常规回连,兼容性最好 | 明文流量,容易特征匹配 |
| HTTPS | 443 | 需要加密流量、伪装 Web 访问 | 证书与握手开销稍大 |
| DNS | 53 | 出口只放行 DNS 的封闭内网 | 速度慢,可用载荷很有限 |
| SMB | 445 | 内网横向、Beacon 间互联 | 出不了外网,仅限内网网段 |
所以选型不是越复杂越好。我一般会先开一个 HTTP Listener 把链路跑通,确认上线没问题之后,再换 HTTPS 或自定义 Profile 做精细化的流量伪装。Payload 也分 staged 和 stageless:staged 体积小、分两段加载,适合需要压缩体积的场景;stageless 一次性把完整 Beacon 塞进可执行文件,体积大但少一次“下载后续载荷”的动作,在被严格监控的下载环节里反而能少暴露一步。实战里如果对目标环境不熟,我宁可用 stageless,少一个请求就少一个被拦的窗口。
3. 部署与首个 Beacon 上线:从装服务端到看到会话
这部分我按自己每次从零搭环境的顺序写,照着走一遍就能看到第一个会话。先说结论:链路没通之前,不要动任何和流量伪装相关的配置。默认配置跑通,再一步步加花活,否则出了问题你根本分不清是监听问题还是 Profile 写错。
3.1 环境准备:授权、JDK 与文件校验
首先要明确:Cobalt Strike 是商业测试软件,正规做法是去官方渠道获取试用评估版本或正式授权,不要碰来路不明的破解包——那些包附加后门是常态,等于你还没测别人先测了你,这个后面避坑章会展开。拿到包之后先做两件事:目录里找一找有没有说明文件,核对发行文件的完整性;再确认你的控制机装有匹配的 JDK 运行环境。版本对应关系不必死记,启动失败时看报错即可,常见的报错是 JDK 版本与软件构建版本不匹配。
我习惯在干净的 Linux 机器上跑 TeamServer,而不是 Windows,原因很简单:正式授权场景下 TeamServer 的日志文件权限管理、端口绑定、进程隔离在 Linux 上都更省事。客户端可以放 Windows,也可以放 Linux,只要有图形界面能跑 Java 进程就行。如果连图形界面都没有,也可以后续用命令行方式驱动,但第一次上手还是建议先用 GUI 把整个链路看明白。
3.2 启动 TeamServer 与客户端连接
把官方包上传到控制服务器后,先给启动脚本加执行权限,然后启动 TeamServer。注意启动参数里有两个必填项:对外可见的 IP 地址和团队共享口令。
# 在控制服务器上执行,IP 写客户端将用来连接的内网/外网地址 chmod +x teamserver cobaltstrike ./teamserver 192.168.10.20 MyStrongPassw0rd # 另开一台机器或新终端,启动客户端 ./cobaltstrike第一行命令里,teamserver 脚本负责拉起 Java 进程并监听 50050 端口;第一个参数是客户端连入和 Beacon 回连都用得到的 IP 地址,第二个参数是团队共享口令,长度至少 8 位,别用弱口令,因为它决定谁能连进你的控制端。启动成功的标志是滚动日志停在一个等待连接的提示上。紧接着在客户端弹窗里输入 IP、端口 50050 和刚才的口令,就能进入主面板。看到主面板之后别急着生成 Payload,先确认左下角事件日志在正常滚动,说明客户端和服务端的链路是通的。
3.3 配置 HTTP Listener 并生成 Beacon
进入 Cobalt Strike 菜单,打开 Listeners 面板,点击 Add,类型选 HTTP,填上 HTTP Host(对外可见的 IP 或域名)和 HTTP Port。这里有一个关键认知:Listener 的地址是写给 Beacon 看的,不是你本机敲 localhost 就能自测的。如果你把 Host 填成 127.0.0.1,Beacon 在目标机器上回连的就是目标机器自己,永远到不了你的 TeamServer。
| 参数 | 填写建议 | 作用 |
|---|---|---|
| HTTP Host | 控制服务器 IP 或已解析域名 | Beacon 回连的目标地址 |
| HTTP Port | 80 或 8080 | 对外监听的端口 |
| HTTP Host Stager | 与 Host 保持一致 | 分阶段载荷的下载地址 |
| User-Agent | 保持默认 | 请求头指纹,链路通后再改 |
| Profile | 留空 | 流量模板,链路通后再挂 |
然后生成 Payload:菜单进入 Attacks、Packages、Windows Executable,Listener 选刚建好的,输出类型选 Windows 可执行文件,架构选 x64。现在目标几乎都是 x64,如果你不确定目标位数,宁可选 x86 兼顾老系统,也别在兼容性上翻车。生成的是一个 exe 文件,先拿到自己本地虚拟机里试运行,不要直接往目标环境丢。这一步是唯一推荐“先内测再实战”的环节,因为一个连自己机器都上不了线的 Payload,丢到目标里只会打草惊蛇。
3.4 执行与验证:会话落地、命令与日志
在你控制的测试机上运行生成的 exe,回到客户端界面,一两个回连周期内应该能看到一个新会话。选中会话,底部命令栏输入几条命令验证执行链路:
shell whoami shell ipconfig /all sleep 5第一、二条是验证命令执行链路正常,第三条是把回连间隔改成 5 秒,观察会话是否仍然存活。确认能正常回连后,去 TeamServer 所在机器的 logs 目录翻日志,里面以主机名和会话 ID 分目录记录了每一条命令及其输出。这一步非常重要——很多人打完一整场才发现日志没记录全,报告的取证截图全靠回忆,那是血泪经验。我从第一次正式项目起就强制自己每次上线第一件事就是打开日志目录看一眼,确认记录在滚动,而不是等到交报告前才去翻。
4. 常见问题与避坑:上线失败与断连的 4 个排查方向
这一章直接给结论:现象是什么、原因在哪、怎么解决。每一条都是我在实际项目里踩过或者看同事踩过的坑,按出现频率从高到低排。
4.1 会话上线即闪断
现象:Beacon 执行后,客户端闪了一个会话马上消失,然后一直没有回来。
原因:最常见的是 sleep 设置太短加上网络抖动,Beacon 在回连周期内没有完成数据交换就被判定超时;另一个典型原因是 Listener 用 80 端口做明文侦听,目标出口网关对非浏览器特征的流量做了拦截,Beacon 一请求就被掐断。这两种情况现象一样,但排查路径完全不同。
解决:先把 sleep 调到 10 秒以上、jitter 留 20%,排除自身节奏问题;再用 HTTPS Listener 换 443 端口重试,确认是不是明文流量被拦。如果换了协议立刻正常,那就是流量特征问题,回到第 5 章去改 Profile。不要在原 payload 上反复重试,那是浪费时间。
4.2 杀毒与 EDR 拦截导致执行失败
现象:exe 一落地就被删除,或者运行后进程存在但没有任何会话回连。
原因:默认生成的 Artifact 静态特征已经被各家引擎收录,这是必然的,因为引擎厂商天天在收录这个商业工具的默认样本;另外运行时行为,比如申请可写可执行内存、向系统进程注入,也会被行为检测拦下来。
解决:在授权测试范围内,用官方提供的 Artifact Kit 或同类方法重新定制 Payload,目标是减少内存特征而不是依赖单一混淆。这里要提醒一句:绕过检测的核心思路是降低行为特征,不是压榨某一种免杀手法。我见过有人为了过检测把 Beacon 的 sleep 调到 60 秒,结果目标机是没问题了,自己等结果等到怀疑人生,节奏全乱。
4.3 端口被占用与多客户端冲突
现象:TeamServer 启动报端口被占用,或者第二个客户端连不上、连上了又看不到完整会话列表。
原因:50050 端口已被其他进程占用,或者同一个 TeamServer 上多个客户端同时操作同一个 Beacon,后发的命令把先发的顶掉了。
解决:启动前先确认端口归属,需要的话改用其他端口启动 TeamServer。多人协作时约定每个会话用独立的标签分区,不要几个人同时往同一个 Beacon 上敲命令。尤其是横向移动任务,两个人同时跑 psexec,目标机上会出现重复的临时服务,轻则任务失败,重则被运维发现异常。
4.4 来路不明的“下载包”风险
现象:从非官方渠道下载的所谓 4.5 版本,运行后控制机明显卡顿、出现未知外连。
原因:破解包里被植入了独立的远控模块,Cobalt Strike 本身还没干活,后门先干起来了。这类情况在安全圈里并不少见,本质是“你要测别人,别人先测了你”。
解决:只从官方渠道获取评估版本或正式授权,拿到文件先核对完整性;如果必须用第三方转存的,就在隔离虚拟机里先跑第一次,确认连上的是你自己的 TeamServer、会话行为正常,再挪到工作机。从那时起我给自己定了个规矩:任何测试工具的第一运行环境永远是隔离虚拟机,这个习惯在一次红队项目里救过我,因为那个“工具包”确实不干净。
5. Malleable C2 Profile 与流量伪装:让回连更像正常请求
再强的 Beacon,如果每次回连都带着一模一样的 URL 路径和默认 User-Agent,蓝队只要翻一翻网关上的流量日志,就能把 C2 地址挖出来。Cobalt Strike 把这一层交给了 Malleable C2 Profile——一个纯文本配置文件,描述 Beacon 的请求 URI、HTTP 头、载荷编码方式以及服务端返回的响应格式。本质上就是把“流量指纹”从硬编码里拆出来,交给使用者自定义。4.x 版本对 Profile 的解析校验更严格,写错一个标点都可能让 Listener 拒绝启动,这反而倒逼人把配置彻底弄懂。
5.1 为什么 4.x 特别看重 C2 配置
市面上很多测试报告翻出来,Beacon 的回连请求基本都是同一个默认 URI 模式,蓝队拿这个当关键词就能全网揪出来。Malleable C2 的价值不在于把流量做得“看不见”,而在于把它做得“不值得看”——模仿目标环境里最常见的业务请求,让告警规则没有明显的匹配点。
我在项目里见过一个反面案例:团队把 Profile 写得很花哨,各种编码变换叠了一整屏,结果上线后蓝队一眼盯上,因为那个 URI 路径在目标站点的日志里根本不存在,显得太突兀。所以伪装的第一原则是向真实环境靠拢,而不是向复杂靠拢。
5.2 Profile 核心参数:全局段与请求块
Profile 文件的基本结构分全局参数段和按请求类型划分的块。全局段负责定义所有请求共用的特征,包括 User-Agent、sleep 间隔、jitter 比例。下面是一个最简可用的全局段示例:
set sample_name "http-normal"; set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"; set sleep_time "60000"; set jitter "20";这里 sleep_time 的单位是毫秒,60000 就是 60 秒回连一次;jitter 是百分比,20 表示每次回连间隔在 60 秒基础上随机上下浮动 20%。这两个值决定流量图上回连点的疏密程度,也是蓝队做周期性检测的核心依据。如果目标环境的访问日志里根本没有 60 秒一次的规律请求,这个数值本身就是异常信号。
http-get 块描述 Beacon 拉取任务时的请求细节。下面是一个把 Beacon 标识信息编码进 Cookie 的写法:
http-get { set uri "/api/ping"; client { header "Accept" "text/html"; metadata { base64url; header "Cookie"; } } server { header "Content-Type" "text/html"; output { print; } } }逻辑很简单:Beacon 请求 /api/ping 这个看起来像业务探活的路径,客户端把自身标识做 base64url 编码后放进 Cookie 头,服务端返回一个普通的 text/html 页面。这里的 uri 要模仿目标环境真实存在的路径,而不是自己发明一个漂亮路径;metadata 是 Beacon 第一次回连时证明身份的字段,必须和服务端约定一致,否则会话建立了也无法被识别。
5.3 加载方式与生效范围
把上面的内容存成一个 .profile 文件,两种方式让它生效:一是在创建 HTTP Listener 时,在 Profile 一栏指定文件的绝对路径;二是在启动 TeamServer 时作为第三个参数传入,这样该 TeamServer 创建的所有 Listener 默认带上这个模板。
./teamserver 192.168.10.20 MyStrongPassw0rd /path/to/http-normal.profile两种方式我都用过,推荐第二种:它保证整个测试过程中不会出现“某个 Listener 忘挂 Profile”的低级失误。启动后打开 TeamServer 日志,看到 Profile 加载成功的提示再生成 Payload。如果报错,先看行号定位,绝大多数错误是 set 语句跑到了大括号外面,或者多个块之间缺少必要的分隔符。
5.4 校验与常见报错
Profile 调试是整套工具里最像玄学的环节,但排查路径其实很固定:报错提示行号、对照官方模板、删掉改动重试。我自己的调试顺序是从简到繁——先只改 User-Agent 和 URI,跑通后加 header,再加 metadata 的编码变换,每次只改一处然后抓包看一处变化。
常见报错集中在 metadata 变换顺序上:有的编码变换组合不被允许,有的 header 字段不能放二进制数据。遇到这类报错别硬猜,把变换拆成两步,先编码成文本再放进 header,基本都能解决。抓包验证时重点看两个位置:请求行的 URI 是否匹配 Profile 里的 uri 设置,Cookie 头里是否出现编码后的标识字段。
6. 从日志与流量反向验证:确认 Beacon 行为的一个检查习惯
Profile 改完之后,只凭“会话在线”并不能证明伪装生效。我每次都会做一轮反向验证,从蓝队视角确认这台 Beacon 在外面的样子。
6.1 用 Sysmon 事件锁定注入行为
目标测试机如果装了 Sysmon,重点看 3 个事件:进程创建、网络连接、远程线程注入。Event ID 1 看进程命令行有没有明显异常参数,Event ID 3 看回连地址和端口,Event ID 8 看是否存在跨进程注入行为。
6.2 用抓包确认回连特征
控制服务器上抓一份 Beacon 回连的流量,确认请求的 URI、User-Agent、Cookie 字段与 Profile 里定义的一致:
sudo tcpdump -i eth0 host 192.168.10.20 and port 80 -A看两个点:一是回连间隔是否符合 sleep 和 jitter 的设定,二是请求头是否出现了 Profile 里定义的字段。这两点确认了,流量伪装才算真正生效。
6.3 一个习惯:每次改配置先跑一次全链路验证
以前我总在报告提交前才发现某一段命令没有日志,或者某个 Listener 忘挂 Profile。从那以后我每次上线第一件事就是打开日志目录确认在滚动,改完 Profile 强制抓包确认一次回连特征,再往后才会去跑注入和横向移动。这个习惯救过我好几回。希望帮到你。
本文还有配套的精品资源,点击获取