# GCP - IAM、プリンシパルと組織ポリシーの列挙

{{#include ../../../banners/hacktricks-training.md}}

## サービスアカウント

サービスアカウントについてのイントロは以下を確認してください：

{{#ref}}
../gcp-basic-information/
{{#endref}}

### 列挙

サービスアカウントは常にプロジェクトに属します：
```bash
gcloud iam service-accounts list --project <project>
```
## ユーザーとグループ

GCPにおけるユーザーとグループの動作についてのイントロは以下を確認してください：

{{#ref}}
../gcp-basic-information/
{{#endref}}

### 列挙

**`serviceusage.services.enable`** および **`serviceusage.services.use`** の権限があれば、プロジェクト内で **サービスを有効にする** ことができます。

> [!CAUTION]
> デフォルトでは、Workspaceユーザーには **Project Creator** の役割が付与され、新しいプロジェクトを **作成する** アクセス権が与えられます。ユーザーがプロジェクトを作成すると、彼はそのプロジェクトに対して **`owner`** の役割が付与されます。したがって、彼は **Workspaceを列挙するためにこれらのサービスをプロジェクトで有効にする** ことができます。
>
> ただし、これらのAPIを呼び出すためには **Workspace内で十分な権限を持っている必要がある** ことに注意してください。

もし **`admin` サービスを有効にする** ことができ、ユーザーが **Workspace内で十分な権限を持っている** なら、以下の行を使って **すべてのグループとユーザーを列挙する** ことができます。\
**`identity groups`** と表示されていても、**グループに属さないユーザー** も返されます：
```bash
# Enable admin
gcloud services enable admin.googleapis.com
gcloud services enable cloudidentity.googleapis.com

# Using admin.googleapis.com
## List all users
gcloud organizations list #The DIRECTORY_CUSTOMER_ID is the Workspace ID
gcloud beta identity groups preview --customer <workspace-id>

# Using cloudidentity.googleapis.com
## List groups of a user (you can list at least the groups you belong to)
gcloud identity groups memberships search-transitive-groups --member-email <email> --labels=cloudidentity.googleapis.com/groups.discussion_forum

## List Group Members (you can list at least the groups you belong to)
gcloud identity groups memberships list --group-email=<email>
### Make it transitive
gcloud identity groups memberships search-transitive-memberships --group-email=<email>

## Get a graph (if you have enough permissions)
gcloud identity groups memberships get-membership-graph --member-email=<email> --labels=cloudidentity.googleapis.com/groups.discussion_forum
```
> [!TIP]
> 前の例では、パラメータ `--labels` が必要であるため、一般的な値が使用されています（APIを直接使用した場合は必要ありません、例えば [**PurplePandaがここで行っているように**](https://github.com/carlospolop/PurplePanda/blob/master/intel/google/discovery/disc_groups_users.py)）。

管理者サービスが有効になっていても、侵害されたワークスペースユーザーに十分な権限がないため、列挙中にエラーが発生する可能性があります：

<figure><img src="../../../images/image (193).png" alt=""><figcaption></figcaption></figure>

## IAM

[**IAMに関する基本情報はこちらを確認してください**](../gcp-basic-information/#iam-roles)。

### デフォルトの権限

[**ドキュメント**](https://cloud.google.com/resource-manager/docs/default-access-control)から：組織リソースが作成されると、ドメイン内のすべてのユーザーに**請求アカウント作成者**および**プロジェクト作成者**の役割がデフォルトで付与されます。これらのデフォルトの役割により、ユーザーはすぐにGoogle Cloudを使用開始できますが、組織リソースの通常の運用には使用されることを意図していません。

これらの**役割**は**権限**を付与します：

- `billing.accounts.create` および `resourcemanager.organizations.get`
- `resourcemanager.organizations.get` および `resourcemanager.projects.create`

さらに、ユーザーがプロジェクトを作成すると、[ドキュメント](https://cloud.google.com/resource-manager/docs/access-control-proj)に従って、そのプロジェクトの**オーナーが自動的に付与されます**。したがって、デフォルトでは、ユーザーはプロジェクトを作成し、その上で任意のサービスを実行できるようになります（マイナー？ワークスペースの列挙？...）

> [!CAUTION]
> GCP組織における最高の権限は**組織管理者**の役割です。

### set-iam-policy vs add-iam-policy-binding

ほとんどのサービスでは、**`add-iam-policy-binding`**または**`set-iam-policy`**メソッドを使用してリソースに対する権限を変更できます。主な違いは、**`add-iam-policy-binding`は既存のIAMポリシーに新しい役割バインディングを追加する**のに対し、**`set-iam-policy`は以前に付与された権限を**削除し、**コマンドで指定されたものだけを設定します**。

### 列挙
```bash
# Roles
## List roles
gcloud iam roles list --project $PROJECT_ID # List only custom roles
gcloud iam roles list --filter='etag:AA=='

## Get perms and description of role
gcloud iam roles describe roles/container.admin
gcloud iam roles describe --project <proj-name> <role-name>

# Policies
gcloud organizations get-iam-policy <org_id>
gcloud resource-manager folders get-iam-policy <folder-id>
gcloud projects get-iam-policy <project-id>

# MISC
## Testable permissions in resource
gcloud iam list-testable-permissions --filter "NOT apiDisabled: true" <resource>
## Grantable roles to a resource
gcloud iam list-grantable-roles <project URL>
```
### cloudasset IAM 列挙

このサービスを使用して、異なるリソース（組織、フォルダー、プロジェクトなど）内のユーザーのすべての権限を確認する方法はいくつかあります。

- 権限 **`cloudasset.assets.searchAllIamPolicies`** は、リソース内の **すべての IAM ポリシー** を要求できます。
```bash
gcloud asset search-all-iam-policies #By default uses current configured project
gcloud asset search-all-iam-policies --scope folders/1234567
gcloud asset search-all-iam-policies --scope organizations/123456
gcloud asset search-all-iam-policies --scope projects/project-id-123123
```
- パーミッション **`cloudasset.assets.analyzeIamPolicy`** は、リソース内のプリンシパルの **すべての IAM ポリシー** を要求できます。
```bash
# Needs perm "cloudasset.assets.analyzeIamPolicy" over the asset
gcloud asset analyze-iam-policy --organization=<org-id> \
--identity='user:email@hacktricks.xyz'
gcloud asset analyze-iam-policy --folder=<folder-id> \
--identity='user:email@hacktricks.xyz'
gcloud asset analyze-iam-policy --project=<project-name> \
--identity='user:email@hacktricks.xyz'
```
- パーミッション **`cloudasset.assets.searchAllResources`** は、組織、フォルダー、またはプロジェクトのすべてのリソースをリストすることを許可します。IAM関連のリソース（ロールなど）が含まれます。
```bash
gcloud asset search-all-resources --scope projects/<proj-name>
gcloud asset search-all-resources --scope folders/1234567
gcloud asset search-all-resources --scope organizations/123456
```
- 権限 **`cloudasset.assets.analyzeMove`** は、プロジェクトのようなリソースに影響を与えるポリシーを取得するのにも役立ちます。
```bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
```
- **`cloudasset.assets.queryIamPolicy`** パーミッションは、プリンシパルのパーミッションを見つけるためのアクセスを提供する可能性があります。
```bash
# But, when running something like this
gcloud asset query --project=<proj> --statement='SELECT * FROM compute_googleapis_com_Instance'
# I get the error
ERROR: (gcloud.asset.query) UNAUTHENTICATED: QueryAssets API is only supported for SCC premium customers. See https://cloud.google.com/security-command-center/pricing
```
### testIamPermissions 列挙

> [!CAUTION]
> もし前述の方法で **IAM 情報にアクセスできない** 場合、あなたが Red Team にいるなら、**ツール**[ **https://github.com/carlospolop/bf_my_gcp_perms**](https://github.com/carlospolop/bf_my_gcp_perms) **を使用して現在の権限をブルートフォースすることができます。**
>
> ただし、サービス **`cloudresourcemanager.googleapis.com`** を有効にする必要があります。

### Privesc

次のページでは **IAM 権限を悪用して特権を昇格させる方法** を確認できます：

{{#ref}}
../gcp-privilege-escalation/gcp-iam-privesc.md
{{#endref}}

### 認証されていない列挙 <a href="#service-account-impersonation" id="service-account-impersonation"></a>

{{#ref}}
../gcp-unauthenticated-enum-and-access/gcp-iam-principals-and-org-unauthenticated-enum.md
{{#endref}}

### ポストエクスプロイト <a href="#service-account-impersonation" id="service-account-impersonation"></a>

{{#ref}}
../gcp-post-exploitation/gcp-iam-post-exploitation.md
{{#endref}}

### 永続性

高い権限を持っている場合、あなたは：

- 新しい SA（または Workspace にいる場合はユーザー）を作成する
- 自分が管理するプリンシパルにより多くの権限を与える
- 脆弱な SA により多くの特権を与える（vm の SSRF、脆弱な Cloud Function…）
- …

## Org ポリシー

Org ポリシーが何であるかのイントロについては、次を確認してください：

{{#ref}}
../gcp-basic-information/
{{#endref}}

IAM ポリシーは、役割を介してプリンシパルがリソースに対して持つ権限を示し、役割には細かい権限が割り当てられています。組織ポリシーは **これらのサービスの使用方法や無効にされる機能を制限します**。これは、GCP 環境内の各リソースの最小権限を向上させるために役立ちます。
```bash
gcloud resource-manager org-policies list --organization=ORGANIZATION_ID
gcloud resource-manager org-policies list --folder=FOLDER_ID
gcloud resource-manager org-policies list --project=PROJECT_ID
```
### プライベートエスカレーション

次のページでは、**組織ポリシーの権限を悪用して特権を昇格させる方法**を確認できます：

{{#ref}}
../gcp-privilege-escalation/gcp-orgpolicy-privesc.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
