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 使用一种较为复杂的搜索算法来确定在域内搜索主体时,哪个用户将用于身份验证。该算法可在此处找到。
Pasted image 20260120152521.png

  • 搜索算法会同时检查 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的服务
Pasted image 20260120155625.png

reference: