许多文章介绍Shadow Credentials利用可能都当做一种权限维持的方式,其实再Windows Server 2016功能级别下还可以配合Relay等,相当于可以把之前的配置RBCD换为配置Shadow Credentials。
申请TGT之前有一个过程叫做pre-auth,客户端可以告知KDC使用 DES、RC4、AES128 或 AES256 加密请求,或使用非对称(使用证书)预认证。预认证的不对称方式就称为 PKINIT(这是2016引入的)。
比如说普通的可以看到加密方式为AES256:
PKINIT 是不太常见的非对称密钥方法。客户端有一个公私钥对,并用他们的私钥对预认证数据进行加密,KDC 用客户端的公钥对其进行解密。此外,KDC 还有一个公私密钥对,允许交换会话密钥。
Windows Server2016域功能级别中,LDAP有一个名为 msDS-KeyCredentialLink
的属性,可以在其中设置公钥。当使用 PKINIT 进行预认证时,KDC 将检查认证用户是否知道匹配的私钥,如果匹配,将发送 TGT。
所以说如果我们可以控制能够编辑其他对象的 msDS-KeyCredentialLink
属性的帐户的话,那么这允许我们创建密钥对,附加到该属性中的公钥,并获得对目标对象(可以是用户或计算机)的持久和隐秘访问。
位于域功能级别为 Windows Server 2016 或更高版本的域中(或至少一个运行 Windows Server 2016 或更高版本的域控制器)
DC拥有自己的密钥对(用于会话密钥交换)(例如,在启用 AD CS 或存在证书颁发机构 (CA) )
可以控制编辑目标对象的 msDs-KeyCredentialLink
属性的帐户
开启PKINIT支持
并且微软还引入了一个Key Trust模式,以支持在不支持证书信任的环境中进行无密码身份验证。在 Key Trust 模式下,PKINIT 身份验证是基于原始密钥数据,而不是证书建立的。
客户端的公钥存储在名为 msDS-KeyCredentialLink
的多值属性中,但是DC还是需要用于密钥交换的证书,所以说条件2还是必须的。
所以说基于这个Key Trust模式,我们上述的攻击才可以成立。
有权限修改msDs-KeyCredentialLink
属性的帐户有:
msDs-KeyCredentialLink
属性使用工具:
https://github.com/eladshamir/Whisker
https://github.com/ShutdownRepo/pywhisker
Whisker.exe add /target:"TARGET_SAMNAME" /domain:"FQDN_DOMAIN" /dc:"DOMAIN_CONTROLLER" /path:"cert.pfx" /password:"pfx-password"
pywhisker.py -d "FQDN_DOMAIN" -u "user1" -p "CERTIFICATE_PASSWORD" --target "TARGET_SAMNAME" --action "list"
msDs-KeyCredentialLink
属性可以使用常规relay方法,比如我们知道机器账户可以自己给自己新增,那么:
python3 ntlmrelayx.py --shadow-credent --shadow-target 'dc2$' -t ldap://dc1 --remove-mic
还可以relay特殊用户、DA的NTLM请求,因为高权限用户也可以修改这个属性。
略,懂就懂。
PKINIT 协议文档:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-pkca/d0cf1763-3541-4008-a75f-a577fa5e8c5b