1. 项目概述从单机到森林的战场转移干了这么多年渗透测试我越来越觉得拿下单台服务器就像攻破了一个前哨站真正的宝藏和指挥中枢往往藏在后面的“大本营”里——也就是企业的域环境。很多新手朋友在拿到一个Webshell或者一个普通用户权限后就觉得万事大吉其实这才刚刚摸到门边。域渗透简单说就是把攻击从针对单台机器升级到针对整个由域控制器Domain Controller, DC管理的网络环境。这个环境里有成百上千台电脑、服务器、用户账号它们通过一套集中式的认证和策略管理体系Active Directory连接在一起。你的目标不再是某个具体的漏洞而是整个体系的信任关系和权限逻辑。为什么域渗透这么重要因为一旦你控制了域控制器就相当于拿到了整个网络王国的“玉玺”。你可以随意创建、删除用户可以给任何一台域内机器下发策略可以访问所有域用户可能有权访问的共享文件和数据库。很多红队评估项目核心目标就是证明能够最终攻陷域控。这不仅仅是技术上的挑战更是对整个企业安全防御纵深的一次全面检验。网上常说的“dc1靶机渗透测试里面5个flag”其设计逻辑就是模拟一个完整的域环境引导你一步步从外部突破到内网横向移动最终夺取域控权限每一个flag都代表攻击链上的一个关键里程碑。所以今天我们不聊那些基础的SQL注入或XSS我们深入内网聊聊在已经拿到某个立足点比如一台域成员服务器的工作权限后如何在这个庞大的“域森林”里披荆斩棘直捣黄龙。我会结合常见的实战手法和原理把那些听起来高大上的攻击手段掰开揉碎了讲给你听。2. 域环境攻击的核心思路与前置认知在真正动手之前我们必须把思路理清楚。域环境攻击不是无脑丢exp它更像一场精心策划的间谍行动核心思路可以概括为信息收集 - 权限提升 - 横向移动 - 权限维持 - 目标达成获取域控权限。这是一个循环迭代的过程每一步的发现都可能为下一步打开新的通道。2.1 信息收集摸清你的战场进入域环境后第一件事不是横冲直撞而是静静地观察和倾听。你需要画出一张“网络地图”。这里的信息收集远比外网渗透时复杂和深入。基础网络与主机发现使用ipconfig /all查看当前机器的详细网络配置重点关注DNS服务器地址它很可能就是域控制器的IP。通过netstat -ano查看当前的网络连接寻找与可疑端口如389 LDAP, 636 LDAPS, 88 Kerberos, 445 SMB建立的连接这能帮你定位关键服务和服务器的位置。使用内网扫描工具如nmap、masscan进行ARP扫描或ICMP扫描但要注意动作尽量轻缓避免触发IDS/IPS。域内信息枚举这是重头戏。你需要尽可能多地了解这个域的结构。当前域信息net view /domain查看当前所在的域net view /domain:域名查看指定域内的机器列表。用户与组信息net user /domain枚举所有域用户。net group “domain admins” /domain查看域管理员组成员——这是你的终极目标列表。net group “domain computers” /domain查看所有域内计算机。信任关系nltest /domain_trusts或通过PowerShell的Get-ADTrust查看域与域之间的信任关系。在大型企业可能存在父子域、林根域等复杂结构信任关系决定了你的攻击路径是否可以跨域延伸。组策略信息组策略GPO是域控管理所有客户端和服务器配置的核心。通过gpresult /R或Get-GPOReport可以查看应用到当前计算机的策略里面可能包含共享路径、计划任务、甚至遗留的凭据信息。Active Directory 详细查询使用PowerShell的ActiveDirectory模块是更强大的方式。例如Get-ADUser -Filter * -Properties *可以获取所有用户的详细信息包括上次登录时间、密码过期时间、描述描述字段里有时会直接写密码。Get-ADComputer -Filter *获取所有计算机对象。Get-ADGroupMember “Domain Admins”精确获取域管理员组成员。注意大量的LDAP查询特别是带*属性的可能会在域控日志中产生大量4662事件。在实战中需要根据情况权衡信息的完整性和隐蔽性。可以尝试使用低频、分批查询的方式。2.2 权限提升从普通用户到本地管理员在域内你初始获得的权限往往只是一个普通域用户。这个用户可能只在当前机器上有普通权限。为了横向移动你通常需要先在这台“跳板机”上获得本地管理员权限这样才能进行后续的凭据窃取、哈希传递等操作。本地漏洞利用和常规渗透一样检查系统补丁情况寻找未修复的本地提权漏洞。使用诸如Windows-Exploit-Suggester、Watson等工具辅助识别。这是最直接的方法但依赖于特定漏洞的存在。凭据窃取与滥用这是域内最经典、最高效的手段之一。核心在于许多管理员为了便利会在多台机器上使用相同的本地管理员密码或者将域管理员账户用于登录某些服务器。内存抓取使用Mimikatz是最著名的工具。在获得管理员权限后运行privilege::debug提升权限然后sekurlsa::logonpasswords可以抓取当前系统内存中所有登录用户的明文密码、NTLM哈希、Kerberos票据。这是获取高权限凭据的黄金手段。SAM文件与LSA Secrets如果无法直接抓内存可以尝试转储本地SAM数据库获取本地用户哈希或读取LSA Secrets其中可能存储着服务账户密码、自动登录密码等。Mimikatz的lsadump::sam和lsadump::secrets命令可以完成此操作。凭据管理器与保存的RDP连接检查用户的Credential Manager和保存的RDP连接文件.rdp里面可能保存着连接其他服务器使用的凭据。服务与计划任务滥用检查当前用户是否有权限修改某些服务sc config 服务名 binPath “你的恶意命令”或创建计划任务schtasks。如果这些服务或任务是以SYSTEM或高权限账户运行的修改其执行路径就能获得相应权限。组策略首选项GPP漏洞这是一个历史遗留但依然可能发现的宝藏。早期管理员会通过组策略来批量部署本地管理员密码。这些密码会被加密后存储在域共享的SYSVOL目录下的XML文件中。然而加密密钥是公开的。你可以搜索SYSVOL目录下的Groups.xml、Services.xml等文件如果找到包含cpassword字段的直接用gpp-decrypt工具就能解密出明文密码。虽然微软早已发布补丁并建议不再使用此功能但在一些老旧或疏于管理的环境中仍可能发现。3. 横向移动在域内机器间穿梭拿到一台机器的本地管理员权限并窃取到一些凭据后你就可以开始横向移动了。目标是接触更多的机器特别是那些域管理员可能登录过的机器以获取更高价值的凭据。3.1 基于共享与服务的探测SMB共享扫描使用net view \\计算机名或smbclient、crackmapexec等工具列出目标机器的共享文件夹。重点关注ADMIN$、C$、IPC$等默认管理共享如果你有相应权限可以直接访问。WMI与WinRMWindows远程管理WinRM和Windows管理规范WMI是强大的远程管理协议。如果你有目标机器的本地管理员凭据用户名和密码/哈希可以使用wmic或PowerShell的Invoke-Command在远程机器上执行命令。crackmapexec在此场景下非常好用crackmapexec smb 目标IP -u 用户名 -H NTLM哈希 -x “whoami”。3.2 传递攻击无需解密的艺术这是域渗透的精髓。在Windows网络中很多时候系统认证依赖的是密码的哈希值NTLM Hash或Kerberos票据而非明文密码。传递攻击允许你直接使用这些哈希值进行认证绕过对明文密码的需求。哈希传递当你获取了某个用户的NTLM哈希例如通过Mimikatz抓取而该用户在另一台机器上也有权限时你可以直接使用这个哈希进行认证。这就是Pass-the-Hash (PtH)。工具使用Mimikatz的sekurlsa::pth功能可以创建带有注入哈希的登录会话。更常用的是crackmapexeccrackmapexec smb 目标IP -u 用户名 -H 哈希值 -M mimikatz可以尝试传递哈希并在目标上执行Mimikatz抓取更多凭据。限制需要目标服务如SMB支持基于NTLM的认证且目标账户在目标机器上有登录权限。此外从Windows Server 2012 R2开始默认限制了本地管理员账户的远程登录除非启用“内置管理员账户的本地管理员密码解决方案”LAPS但其他管理员账户或普通账户的PtH可能依然有效。票据传递在Kerberos认证域环境中用户会从域控制器获得一个票据授予票据TGT用于申请访问特定服务的服务票据ST。如果你能窃取到某个高权限用户的TGT存储在内存中你就可以冒充该用户申请访问任何服务的ST。这就是Pass-the-Ticket (PtT)。黄金票据这是最强大的攻击之一。它需要你获取到krbtgt账户的NTLM哈希这个账户是域控用来签署所有TGT的。一旦获得你就可以伪造任意用户的TGT包括不存在的用户并且可以设置任意长的有效期。这意味着你可以完全掌控整个域随时生成任何用户的票据。获取krbtgt哈希通常需要已经获得域控的权限所以它更多是用于权限维持。白银票据与黄金票据对应白银票据是伪造针对特定服务的服务票据ST。它不需要krbtgt哈希而是需要目标服务账户如cifs/、http/的NTLM哈希。由于白银票据是直接发给服务的不经过KDC验证因此更难被检测。但它只能访问特定的服务权限相对受限。实操使用Mimikatz的kerberos::golden或kerberos::silver命令可以生成票据然后用kerberos::ptt将票据注入当前会话。之后你就可以用net use或psexec等工具访问对应资源了。实操心得在真实环境中哈希传递PtH的成功率往往高于票据传递PtT因为Kerberos的环境配置和约束委派等策略可能会限制票据的使用。优先尝试PtH。同时crackmapexec工具链是横向移动的瑞士军刀它集成了SMB、WinRM、MSSQL等多种协议的攻击并能自动识别可用的登录方式非常高效。4. 攻击域控制器直取核心横向移动的最终目标是定位并攻陷域控制器。除了常规的漏洞利用如MS14-068、ZeroLogon在已经获得一定权限的域内环境中有更多“曲线救国”的方法。4.1 利用域管理员活动痕迹域管理员也需要管理服务器他们会在某些成员服务器上留下登录痕迹。你的核心任务就是找到这些服务器。PSLoggedOn NetSess使用PsLoggedon工具或net session命令可以查看当前有哪些用户远程登录到了本机。反过来如果你能登录多台服务器并执行此命令就有可能发现域管理员的活跃会话。日志分析在拥有本地管理员权限的机器上可以查看安全事件日志Event ID 4624登录成功、4625登录失败、4672特殊权限登录。筛选出登录类型为3网络登录、且用户名为域管理员账户的事件其源IP地址就是域管理员登录的来源很可能就是他的工作站或者他管理的另一台服务器。攻击那台机器捕获其凭据的机会更大。SPN扫描与Kerberoasting服务主体名称SPN是服务实例的唯一标识符。许多服务如MSSQL、IIS会以域用户账户运行。使用setspn -T 域名 -Q */*可以列出所有注册的SPN。如果一个高权限域账户如属于域管理员组的账户被注册为SPN那么任何用户都可以向KDC请求该服务的ST服务票据。这个ST是用该服务账户的哈希加密的。我们可以请求这个票据然后尝试离线破解它因为加密强度取决于账户密码强度这种攻击称为Kerberoasting。如果成功我们就拿到了一个高权限域用户的明文密码。4.2 资源委派滥用这是相对高级但威力巨大的攻击。约束委派如果某个服务账户被配置了“约束委派”意味着它可以代表用户去请求访问指定的其他服务。如果你控制了这样一个服务账户你就可以伪造任意用户包括域管理员去访问被委派的服务。攻击的关键在于识别被配置了约束委派的账户Get-ADComputer或Get-ADUser查看msDS-AllowedToDelegateTo属性。基于资源的约束委派这是Windows Server 2012以后引入的更安全模型但配置不当同样存在问题。攻击者可以通过控制一个拥有“在目标计算机上创建计算机对象”权限的账户默认域用户即可然后利用S4U2Self和S4U2Proxy扩展协议最终获得目标计算机甚至是域控的本地管理员权限。这个攻击链稍微复杂但工具如Powermad和Rubeus可以自动化完成。4.3 直接漏洞利用当上述“社工”或逻辑漏洞方法行不通时我们回归技术漏洞本身。但针对域控的漏洞往往影响巨大补丁部署较快。MS14-068一个经典的Kerberos漏洞允许任何域用户伪造票据将自己提升为域管理员。需要知道用户的SID。利用工具如pykek可以轻松完成。但在如今的环境中基本都已修复。ZeroLogon这是一个震撼性的漏洞CVE-2020-1472。它利用了Netlogon协议中一个加密逻辑缺陷允许攻击者在不提供任何凭据的情况下将域控的计算机账户密码置空。然后你就可以以空密码连接域控并dump出所有哈希。虽然官方有紧急补丁但很多机构修补并不及时。利用工具如zerologon_tester和secretsdump.py可以自动化攻击。注意利用此漏洞会重置计算机密码可能导致域控与其他服务脱域产生破坏性影响在授权测试中需极度谨慎。PrintNightmare近年的另一个严重漏洞CVE-2021-1675/CVE-2021-34527允许普通用户通过RPC调用打印服务以SYSTEM权限执行任意DLL。如果域控开启了打印服务这可以成为一条直接的攻击路径。5. 权限维持与防御绕过拿下域控不是终点如何稳固地控制它而不被发现是另一个挑战。5.1 创建隐蔽后门账户直接在Domain Admins组里加一个新账户是最蠢的。更隐蔽的做法是影子账户创建一个与内置账户如Guest同名但末尾带$的账户如Guest$并加入管理员组。在命令行下net user看不到带$的账户但在AD用户管理器中或通过Get-ADUser可以。或者修改一个不活跃的、低权限现有用户的属性如description将其加入管理员组并更改其密码。SID历史攻击每个用户都有一个唯一的安全标识符SID。当用户从一个域迁移到另一个域时旧SID会保留在SIDHistory属性中以便资源访问。攻击者可以篡改一个普通用户的SIDHistory为其添加域管理员组的SID。这样该用户就拥有了域管理员权限但在成员列表里却看不到。使用Mimikatz的sid::add功能可以实现。5.2 金票与银票的持久化如前所述制作一张有效期长达10年的黄金票据将其保存在本地。需要访问域资源时随时注入内存即可。这种方式不直接在AD中留下账户变更痕迹非常隐蔽。5.3 防御规避技巧日志清理在域控上使用wevtutil或PowerShell清除相关安全日志如Security, PowerShell Operational。但要注意集中式日志服务器SIEM可能已经收集了这些日志。隐藏进程与连接使用rootkit技术或内存注入如Process HollowingProcess Doppelgänging来隐藏恶意进程。使用加密通道或伪装成正常协议如HTTPS进行C2通信。对抗AV/EDR使用混淆、加密的Payload利用合法的系统管理工具PsExec,WMI,PowerShell进行“无文件”攻击减少磁盘落盘。PowerShell脚本可以只存在于内存中IEX下载执行。6. 常见问题与排查技巧实录在实际操作中你会遇到各种各样的问题。这里记录一些常见的坑和解决思路。问题1使用Mimikatz抓取密码时返回“ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory”错误。原因与排查这通常是因为权限不足。Mimikatz需要DEBUG权限来读取lsass进程的内存。首先确保你以管理员身份运行了命令行。其次即使以管理员运行某些系统策略也可能移除了该权限。可以尝试在Mimikatz中先执行privilege::debug如果返回Privilege ‘20’ OK则成功如果失败可能需要先提权。解决如果privilege::debug失败尝试使用其他提权漏洞先获得更高权限。或者考虑使用其他不需要DEBUG权限的凭据获取方法如转储LSASS进程内存到磁盘后再用Mimikatz分析但这会触发更多告警或使用Procdumpfrom Sysinternals工具procdump.exe -ma lsass.exe lsass.dmp然后将dump文件下载到本地用Mimikatz的minidump模块读取。问题2哈希传递攻击失败提示“STATUS_LOGON_FAILURE”。原因与排查这是最常见的错误意味着凭据无效或登录被拒绝。请按以下顺序排查哈希是否正确确认你使用的NTLM哈希是完整的32位十六进制字符串且来自正确的用户。用户是否有权限登录目标目标机器可能限制了远程登录通过“拒绝从网络访问此计算机”策略。特别是本地管理员账户受LAPS或默认策略影响可能被禁止。目标服务是否可用SMB服务445端口是否开放防火墙是否阻止是否启用了SMB签名如果目标服务器强制要求SMB签名而你的攻击工具不支持或未配置签名也会失败。账户是否被锁定或禁用多次失败尝试可能导致账户被临时锁定。解决使用crackmapexec时可以添加—verbose参数查看详细错误。尝试使用其他协议如WinRM5985端口。如果目标是本地管理员账户尝试使用其他已知的本地管理员账户或域账户。问题3Kerberoasting攻击中使用Rubeus请求的票据无法用Hashcat破解。原因与排查票据格式问题Rubeus输出的票据默认是Base64编码的.kirbi格式。需要用Rubeus的tgtdeleg功能或kirbi2john.py脚本将其转换为John the Ripper或Hashcat可识别的格式通常是$krb5tgs$开头的哈希。加密类型不匹配Hashcat模式需要指定正确。Kerberos 5 TGS-REP etype 23 (RC4-HMAC) 对应Hashcat模式13100。如果域环境强制使用AES加密etype 17或18破解难度会极大增加RC4是相对容易破解的。密码强度过高如果服务账户使用了非常复杂的长密码字典攻击和暴力破解可能无效。解决确保转换步骤正确。使用命令hashcat -m 13100 hash.txt wordlist.txt进行破解。优先使用强大的密码字典如rockyou.txt的变体、公司名相关词汇组合等。问题4在利用ZeroLogon漏洞时成功将计算机密码置空但后续使用secretsdump.py时连接失败。原因与排查ZeroLogon漏洞利用分为两步第一步将计算机账户的密码置空第二步利用空密码进行DCSync攻击dump哈希。失败可能发生在第二步。网络问题确保与域控的445端口连通。同步问题密码置空后可能需要等待几秒钟或强制触发一次认证同步。可以尝试使用net use \\域控IP\ipc$ “” /user:”计算机名$”建立一个空密码的IPC连接然后再执行secretsdump.py。补丁或缓解措施目标系统可能已经安装了缓解措施允许空密码认证但限制了后续操作。或者在dump过程中触发了其他安全机制。解决严格按照工具链的步骤操作。考虑使用wmiexec.py或smbexec.py等Impacket套件中的其他脚本利用空密码先获取一个shell然后在shell里执行本地dump命令如使用Mimikatz的lsadump::dcsync。问题5所有攻击尝试都无效环境似乎“坚不可摧”。原因与排查你可能遇到了一个安全意识较强、防护体系完善的环境。这可能包括全面的补丁管理无已知高危漏洞。网络分段严格跳板机无法直接访问核心区域。终端检测与响应EDR部署完善行为监控严格Mimikatz等工具一运行就被拦截。强制使用强认证如Smart Card限制了密码/哈希的使用。对域管理员账户进行了严格限制如仅允许从特定堡垒机登录。解决思路回归基础进行更细致的信息收集。寻找“人”的弱点网络钓鱼获取高权限账户的Smart Card PIN社会工程获取VPN或堡垒机的访问权限寻找供应链攻击入口如第三方供应商的接入点或者检查那些“例外”的、老旧的非Windows系统如Linux服务器它们可能以较弱的方式集成到AD中成为突破口。在高度安全的环境下攻击往往从最薄弱的非技术环节开始。域渗透是一场斗智斗勇的持久战没有一成不变的公式。最重要的不是记住所有的工具和命令而是理解其背后的协议原理和信任模型。每一次失败都是一次学习告诉你这个环境在哪个环节设置了防御。保持好奇心不断尝试从攻击者的角度思考你才能更好地理解如何防御。最后务必记住所有这些技术都必须在合法授权的范围内进行测试未经授权的攻击是违法行为。