Cobalt Strike横向渗透实战:从Beacon上线到域控权限

Cobalt Strike横向渗透实战:从Beacon上线到域控权限 做红队的都知道Cobalt Strike这玩意儿说白了就是一个大号远控平台但它跟普通木马远控最大的区别在于把内网横向渗透、凭据管理、隧道转发这一整套后渗透链路全揉进了Beacon模型里。常见的用法是钓鱼打点拿到主机权限然后以这台机器为跳板向内网深处横向摸进——最终目标大多是域控。只要域控被拿下整个域的账号、策略、数据库就全在你手里了。这篇文章就聊一个场景手里已经有一台加入域的主机权限Beacon还活着怎么一步步横向渗透最终控制域控主机、拿到域管权限。我会把每一步的原理、关键命令、Beacon具体怎么操作、在哪一步容易翻车全部过一遍。适合刚接触内网渗透、有过基础外网打点经验的人也适合蓝队想了解红队横向手法的兄弟参考了解对手怎么打才能知道怎么防。在开始之前先把丑话说前面所有操作必须在授权测试环境下进行。没有授权就横向说白了就是犯罪行为这篇文章不背这个锅。下面所有内容请放在企业授权的红队评估、企业内部攻防演练靶场里看。1. 环境准备与整体思路先把拓扑和工具链理顺1.1 实验拓扑与角色划分先搭建一个最小可复现的内网环境我本地一般用VMware或者Proxmox跑虚拟化三台机器起底角色主机名IP系统功能域控DC01192.168.10.10Windows Server 2019AD域服务、DNS、DHCP成员机WEB01192.168.10.20Windows Server 2016被攻陷的跳板机成员机PC01192.168.10.30Windows 10普通域用户机器攻击机KALI192.168.20.5Kali Linux跑Cobalt Strike团队服务器域信息建议规划成corp.local管理员账号Administrator设一个复杂密码至少15位以上尽量贴合真实环境。域内再建几个测试用户比如admin_svc、user01、backup_svc其中至少有一个用户加入Domain Admins或本地管理员组。这样横向测试的时候才有真实的权限边界要去绕过。在真实项目里域控很可能不止一台可能是两台AD域控做主备主AD域信息需要同步到备AD域通过AD域服务自带的拓扑复制机制完成不需要额外装工具。做主备切换测试时你会发现域控角色转移其实跟DNS注册、FSMO角色、站点拓扑都有关联。红队视角下不管是主还是备只要拿下其中一台都能通过DCsync等手法导出全量哈希。1.2 团队服务器的搭建与监听器配置Cobalt Strike装好之后先在Kali上启动团队服务器sudo ./teamserver 192.168.20.5 your_strong_pass123客户端连接后第一件事是配置Listener。这里是整个Beacon类型选型的核心。创建Listener时有几个选项HTTP/HTTPS走C2远控通信适合外网到内网的主监听用于初始上线。DNS在HTTP被流量检测卡死时备用速度极慢延迟高不推荐横向用。SMB / TCP用于内网Beacon之间的中继和数据转发横向渗透的核心通道。横向渗透时更常用的是SMB Beacon。它的原理很简单不用额外端口直接走445端口上的命名管道通信像串糖葫芦一样连起来。前提是目标机器允许SMB访问默认都开并且当前Beacon有权限访问目标机器的管道路径。实战里我一般这么干先建一个HTTP Beacon作为外部入口再在Beacon里切换委托或者Spawn生成一个SMB Listener。SMB Beacon只是让你在内网里走得更稳不是真正的外部上线通道。1.3 获得初始立足点从钓鱼到持久化标题里的前提是“已拿到一台域内主机的Beacon”那初始立足点的获取方式简单提一下——你可能会用到钓鱼邮件附件宏文档、LNK快捷方式Web漏洞利用如Log4j、永恒之蓝这种补丁打慢的老漏洞供应链投毒、恶意捆绑软件弱口令爆破RDP、SSH、Web后台不管是哪种方式目标都是让你的Beacon以SYSTEM或管理员权限运行在域内主机上。初始权限如果只是普通用户也不要慌——先尝试本地提权。Cobalt Strike提供了elevate菜单里面封装了很多常见的Windows提权漏洞利用模块比如ms14-058、ms16-135、PrintNightmare、JuicyPotato等。实测下来比较稳的是本地服务溢出、内核漏洞配合Windows Server的打印服务提权还有利用UNC路径的Potato家族。拿到SYSTEM后第一时间跑getsystem确认权限级别然后立刻通过hashdump把本地SAM哈希存好同时跑mimikatz sekurlsa::logonpasswords。这时候运气好直接就能抓到域管在跳板机上驻留过的明文密码。2. 内网信息收集与关键数据提取2.1 确认当前主机的域内身份拿到一台机器的权限只是开始横向渗透之前必须搞清楚三个问题我在哪、我能访问谁、谁是域内的高权限目标。这些信息决定了后续的横向路径。在Beacon里最顺手的就是原生命令加系统自带命令的组合。先确认身份和域环境whoami whoami /all net config workstation systeminfonet config workstation可以看到当前登录域、计算机名、用户名初步判断这台机器处于哪个域环境。接着用nltest查询域控列表和域信任关系nltest /dclist:corp.local nltest /domain_trustsdclist返回的主机名就是该域的域控列表domain_trusts能看当前域和其他域是否有信任关系。如果存在跨域信任那横向路径就不止本域这一条路可能还要考虑双向信任带来的外域渗透路径。再通过Beacon的原生命令快速摸网络shell net view /domain shell net view /domain:corp.local shell net group /domainnet view列出域内所有主机和共享资源net group /domain能看到域内所有安全组。这是判断内网规模最粗暴的一条命令。2.2 域内拓扑和ACL侦察光有网段还不行横向渗透更像打牌得看清牌面。经典三板斧DHCP/DNS信息从当前主机网卡配置入手拿到DNS后缀和DNS服务器。SPN扫描Kerberos协议服务主体名称这是Kerberoasting攻击的前提也能用来识别域内关键服务分布在哪台机器上。LDPA查询域控上开389端口红队一般用adfind或PowerView去枚举域对象、组策略、ACL关系。PowerView是我非常依赖的内网域信息收集脚本简单说就是一个封装了ADSI查询的PowerShell脚本放到Beacon里通过powershell-import导入后用Get-DomainUser、Get-DomainGroup、Find-DomainLocalAdmin等命令能快速把所有域对象关系拉出来。powershell-import C:\Tools\PowerView.ps1 powershell Get-DomainUser -SPN powershell Get-DomainGroupMember -Identity Domain Admins powershell Find-DomainLocalAdmin这些命令的核心价值是回答“谁有权限管理哪台机器”这个问题。比如Find-DomainLocalAdmin会遍历域内机器找出每个机器的本地管理员组成员。如果某个服务账号被加入了多台服务器的本地管理员组拿它的哈希就能横到一片。2.3 凭据提取hashdump与mimikatz的实战用法凭据是Windows内网横向的“硬通货”。在Windows系统里攻击路径经常是拿到一台机器的SYSTEM权限 → 抓取本机明文密码或哈希 → 尝试用同一密码登录其他机器。所以横向渗透的第一步基本就是把凭据先抓全。Beacon里内置的hashdump会直接调用注册表读取本地SAM文件导出本地账户的NT哈希。输出格式通常是Administrator:500:e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c:::中间冒号隔开的是RID、LM哈希、NT哈希。现在LM哈希基本都是空值或无效值重点看NT哈希。拿到这个哈希后可以直接配合psexec、wmi做Pass-the-Hash哈希传递横向前提是对方账号密码和本地管理员密码相同或者目标机器上存在相同密码的账户。mimikatz抓取明文密码是另一条路。在Beacon里执行mimikatz sekurlsa::logonpasswords这个命令会遍历当前机器内存中的登录会话把缓存的明文密码和哈希都拉出来。注意它只能抓“当下或之前登录过的用户”凭据。所以我经常在每一天早上刚到目标机器的时候抓一下等域管悄悄登录的时候就有可能抓到他留下的明文密码。重要的问题来了——为什么要先抓明文因为哈希传递只能用于NTLM认证Kerberos环境下面某些协议比如WinRM、RDP默认不支持哈希传递。而且有些工具需要明文密码才能完成认证流程。所以能抓到明文密码最好在目标机器不换密码之前它一直是你的通行证。3. 横向渗透的核心手法从单点到域内批量控制3.1 为什么横向首选SMB Beacon在内网里如果你只有HTTP Beacon每一次指令都要回连到外网C2服务器流量绕一圈速度慢还容易被出口设备检测发现。SMB Beacon就不一样它通过命名管道把命令转发给上一级Beacon再由上一级Beacon统一出口。数据链路上看起来就是内网机器之间的SMB流量隐蔽性高很多。具体做法是在C2客户端先创建一个SMB Listener比如名字叫smb-door然后在已有Beacon上右键 → Spawn → 选择smb-door接着在目标机器上通过link命令连接它link 192.168.10.20 smb-doorSMB Beacon的代码是通过IPC共享和命名管道部署到目标进程中的。比如默认的命名管道路径可能是\\192.168.10.20\pipe\msagent_xxx。如果目标机器上恰好跑着杀软它会盯命名管道创建和进程行为所以实际项目中建议自定义管道路径别用默认值。横向到一台机器后第一件事是确认Beacon是否以SYSTEM权限在跑然后快速执行信息收集、凭据提取。如果目标机器没装杀软还可以用inject注入到信任进程里增加隐蔽性——这又是另一个话题了。3.2 psexec原理与Beacon操作细节psexec是横向渗透里最经典的利用方式原理一句话通过SMB的ADMIN$共享上传一个服务二进制文件然后调用Windows服务控制管理器创建一个远程服务执行二进制最后删除服务。Cobalt Strike的psexec支持三种载荷方式psexec上传一个可执行EXE最传统。psexec_psh上传PowerShell脚本并通过PowerShell执行体积小绕过一些文件检测。psexec6464位可执行文件适合64位系统。操作路径是Beacon右键目标主机 → Jump → psexec或者直接命令jump psexec 目标IP 监听器。目标IP要填写内网IP监听器选择你提前创建的SMB或TCP监听器账号密码可以填明文也可以直接用哈希Pass-the-Hashjump psexec 192.168.10.20 smb-door admin_svc Password123 jump psexec 192.168.10.20 smb-door CORP\\admin_svc e52cac67419a9a224a3b108f3fa6cb6d这里有两个易错点。第一psexec连接的目标账号必须有本地管理员权限或者域账号在目标机器的本地管理员组里。第二目标机器必须开放TCP 445并且防火墙允许文件和打印共享这个在Windows默认域环境中是开的。3.3 WMI、WinRM、DCOM等替代手法psexec虽然好使但最近几年蓝队的检测能力上来了对服务创建和服务删除对应日志ID 7045和104盯得特别死。所以横向渗透手法的核心是“不要只依赖psexec”要多路线并行哪个被拦就换一个。WMI横向通过Windows Management Instrumentation调用远程WMI服务执行进程启动。在Beacon里对应wmi模块底层调用wmic /node:目标IP process call create 命令。WMI走的是TCP 135端口初始化然后动态分配一个高位端口给WMI服务通信。防火墙策略比SMB更宽松一些很多域环境管理员只堵了445端口但忘了135。WinRM横向基于HTTP/HTTPS默认端口5985/5986是微软标准远程管理协议。域环境下默认开启Windows Server 2012、Windows 10。在Beacon里对应winrm模块前面说过WinRM默认不支持哈希传递必须用明文密码所以有些情况下它就是卡脖子的一步。DCOM横向利用Windows分布式组件对象模型DCOM来远程实例化一个COM对象然后调用对象方法执行命令。比较常见的是通过MMC20.Application或者ShellWindows对象。DCOM横向的特点是不需要创建服务、不需要写文件到目标磁盘但需要目标开放TCP 135端口并且当前账号权限够高。在我实际项目里横向手法的优先级大致是这样的手法端口需管理员依赖文件写盘哈希传递日志特征psexec445是是是服务创建7045WMI135是否是WMI活动WinRM5985/5986是否否WinRM日志DCOM135是否是进程链异常3.4 横向渗透的权限链普通域用户怎么变成域管还有一个很典型的场景你手里拿到的只是普通域用户连Local Admin都不是横向都横不动。这时候就要回头看ACL。在AD域环境中ACL决定了谁能改谁的属性、谁能重置谁的密码、谁能向哪些组添加成员。PowerView的Find-InterestingDomainAcl就是干这个的它能通过枚举所有域对象的ACL找到“过度授权”的关系。比如某普通用户对另一个高权限用户有GenericAll权限那就等于能直接重置该用户的密码。powershell Find-InterestingDomainAcl -ResolveGUIDs这类ACL滥用很容易被忽略所以我给红队新手的第一条建议就是不要只盯着域管那几个人想硬碰硬多看看ACL关系软柿子往往就是高权限周围的人。4. 冲击域控从普通机器到域管权限4.1 Kerberoasting不需要SYSTEM就能离线破域管密码Kerberoasting是目前内网渗透里利用Kerberos协议本身特性获取高权限账号密码哈希的经典手法。原理是任何域用户都可以向域控请求一个特定服务SPN的Kerberos服务票据TGS。这个TGS是使用服务账户的密码哈希加密的攻击者拿到加密后的票据后可以在本地离线爆破跑一个字典或暴力破解它。如果这个服务账户恰好是域管或者密码很弱那结果就是直接拿下域管权限。在Cobalt Strike里执行powershell Get-DomainUser -SPN或者用Rubeusexecute-assembly C:\Tools\Rubeus.exe kerberoast /outfile:hashes.txt跑完之后会生成一个以$krb5tgs$开头的哈希文件扔给hashcathashcat -m 13100 hashes.txt rockyou.txt我实测过最怕的是SPN绑定在域管账号上很多运维图省事会拿域管当服务运行账号而域管密码又设得不够长。这种环境下Kerberoasting一打一个准。4.2 DCsync让域控“亲自”把所有密码哈希交给你拿到域管或者拥有复制目录权限的账号后最霸道的域控拿法就是DCsync。它的原理是模拟域控发起目录复制请求DRSUAPI让目标域控把ntds.dit里的用户哈希全量同步出来。整个过程不需要在域控上执行任何代码属于纯协议层面的滥用。在Beacon里通过mimikatz执行mimikatz lsadump::dcsync /domain:corp.local /user:krbtgt mimikatz lsadump::dcsync /domain:corp.local /all /csv/user:krbtgt是单独导出一个用户一般为KRBTGT/all是导出全部用户哈希。拿到krbtgt的哈希后意味着你可以伪造任意用户的TGT票据这就是著名的“黄金票据”。注意DCsync的权限要求并不一定非得是域管。只要账号具有“复制目录更改”和“复制目录更改所有项”权限通常这就是Domain Admins、Enterprise Admins、或域控机器账户默认拥有的权限。某些情况下运维会给备份组或服务账号过度授权这些人也能DCsync。我不止一次见到有项目就是靠一个备份服务账号拿下整个域。权限这个东西永远别低估默认组和特殊组的配置。4.3 黄金票据与域管的持久化拿到krbtgt密码哈希后可以伪造一个任意的TGT也就是黄金票据。因为Kerberos域内默认信任krbtgt签发的票据伪造一个能让你本人“变成”域管的TGT几乎是永久的后门。在Beacon里执行mimikatz kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-xxx /krbtgt:hash /ptt其中/ptt表示直接注入当前会话。之后访问域内任何资源都自带域管身份。若想做到跨域甚至整个森林内漫游还需要注意SID History的利用——在伪造票据时加入Enterprise Admins组的SID就能在信任域内横着走。但从防御角度说黄金票据最大的弱点在于不能长期维持。krbtgt密码默认180天自动轮换一次只要管理员定期重置krbtgt密码两次你的伪造票据就会失效。所以红队通常会把它当作应急兜底的手段同时保留更隐蔽的持久化方式比如AdminSDHolder权限修改、GPO计划任务植入等。AdminSDHolder的持久化是域内权限维持的经典操作。该对象是域内受保护组的权限模板每60分钟Security Descriptor PropagatorSDProp就会将受保护组的ACL重置为AdminSDHolder中的ACL。攻击者只要在AdminSDHolder对象中给自己添加一个完全控制权限60分钟内该权限会自动传播到所有受保护组包括Domain Admins。这是一个极其隐蔽的持久化手段蓝队通常很难发现根因。5. 横向渗透中的排查难点与规避思路5.1 为什么横向到一半连不上目标在真实环境中横向渗透失败的原因远比漏洞利用失败多。总结一下我踩过最深的几个坑账号权限不够目标机器本地管理员组里根本没这个账号用psexec直接Access Denied。这时候先回头收集信息看哪个账号有权限而不是反复重试。防火墙拦截目标机器上跑了第三方防火墙拦截了445、135等端口。先用扫描确认端口状态再选WinRM或DCOM等替代协议。杀软实时保护上传服务二进制或PowerShell执行时被实时防护拦截。我遇到过很多次jump psexec一直卡在连接阶段后来发现是目标机器装了EDR直接拦截了服务创建。这种情况可以换WMI绕过脚本或者用内存加载的方式执行载荷。口令过期横向凭据里用的域账号密码过期了。这个很常见AD域密码策略90天强制改密横向前最好先验证一遍凭据的时效性。网络隔离调研发现很多企业在域控和用户区之间做了VLAN隔离或ACL限制只有运维网段能访问域控。遇到这种横向路径就要先摸到运维网段的跳板机然后再打域控。排查时我会先把目标主机的端口、防火墙、账号权限做一个快速快照再根据失败的具体返回信息调整方案。最忌讳的是拿到一个密码就全网扫一遍那是在给蓝队刷警报不是在做渗透。5.2 蓝队视角这些行为会留下什么日志如果站在蓝队角度反推红队的行为Cobalt Strike横向渗透会留下大量可检测的痕迹。事件日志是默认开启的你可以按以下EventID作为检测线索EventID含义检测点4624登录成功检测审计日志中非交互式登录Type 3的频率4672特殊权限登录管理员登录频繁出现于多台机器4688进程创建检测可疑进程从网络共享启动如\\IP\ADMIN$7045新服务安装服务名称随机、服务路径包含PowerShell/MSBuild等4104PowerShell脚本块日志检测PowerShell远程下载执行、脚本块混淆5156Windows过滤器平台连接检测到命名管道、WMI远程调用的网络连接EDR产品现在普遍会对Cobalt Strike的内存特征、Beacon网络特征、命名管道名、进程注入行为进行全方位检测。所以很多经验丰富的红队会提前做Beacon的配置文件混淆、内存特征清理、睡眠时间随机化、自定义命名管道名等工作尽量规避行为特征。作为防御方最实际的建议是重点盯住域控的4624和4672登录日志、7045服务创建日志以及所有主机上Beacon常用的命名管道访问。像IPC$共享访问数量在短时间内的剧增就是一个很好的横向渗透报警信号。5.3 域控攻击失败后还有哪几条备用路径如果域控的密码哈希、SPN爆破、ACL利用都没搞定也不要立刻放弃这个目标。域控因为防御严密打不下来不代表整个域拿不下。还有几条备用路径值得尝试DNS Admin滥用DNS管理员权限默认可以重置域控上所有DNS配置有人研究过利用DNS Admin权限编写恶意DLL加载到DNS服务进程中从而实现提权到SYSTEM。前提是你已经拿到了DNSAdmins组或本地管理员权限。GPO组策略劫持域管通常把大量安全策略通过GPO下发到域内所有机器。如果你能通过某种途径获得GPO编辑权限比如备份操作员账户配置了GPO管理权限修改GPO中的计划任务或启动脚本就能在域控下次刷新策略时自动执行你的代码。AD Certificate Services滥用如果域里部署了ADCSAD证书服务可以检查是否存在ESC1、ESC2、ESC3、ESC8等证书模板配置错误利用证书模板的注册权限获取域控机器账户的证书然后伪造登录。这类攻击在近两年的攻防演练中出镜率极高。Exchange服务很多企业域控和Exchange服务器都在同一内网段而Exchange服务器一般拥有WriteDacl或者GenericWrite到域对象的权限。拿下Exchange就等于拿下域的入口。最经典的是PrivExchange攻击CVE-2018-8581以及计划任务后门。6. 实操心得如何把横向渗透做得更稳最后聊几点我个人经验层面的东西适合那些准备把这条路走通的新手参考。**Beacon进程迁移和睡眠时间设得合理一点。**内网横向过程中如果所有Beacon都在同一个父进程下蓝队看进程树一眼就能串起来。建议Spawn之后把睡眠时间间隔设成30秒到60秒之间加一点抖动jitter不要低于5秒。睡眠太短流量特征明显太长影响操作效率30到60秒是攻防场景下体验和隐蔽性的平衡点实测下来比较稳。**操作节奏一定要慢下来。**很多人拿到一台机器就急着横向扫一片结果23点EDR告警刷屏第二天一早蓝队溯源报告就贴出来了。横向渗透更像是在走钢丝每执行一条高危命令之前先想想它会不会产生告警、字符能不能混淆掉。**能不用明文命令就不用明文命令。**多配合PowerShell脚本块的混淆、进程空心化、反射加载别让PC上到处是psexec 192.168.1.1 admin password这种命令行参数。一旦EDR捕获到这类参数整个内网的账号密码就等于裸奔了。**多做几层权限的备份。**拿下域控之后不要立刻把所有精力放在业务数据上先做权限备份导出krbtgt哈希、保存域管账号、放置AdminSDHolder后门、验证黄金票据是否可用。只有这些保底手段到位了后面的数据获取才谈得上从容不迫。回到开头说的那个场景你现在手里有一台域内主机实际上你已经站在了内网最核心的攻防舞台中央。接下来走向域控的那几步路拼的从来不是谁的工具多而是在信息收集、凭据利用、手法切换、日志规避这几件事上谁做得更精细。希望这篇文章能帮你把这套链路看透也帮蓝队兄弟意识到自己在域内该盯住哪些关键节点——对手最常走的路往往就藏在那些最不起眼的默认配置和过度授权里。