GCP - IAM, Principals & Org Policies Enum

Support HackTricks

서비스 계정

서비스 계정에 대한 소개는 다음을 확인하세요:

열거

서비스 계정은 항상 프로젝트에 속합니다:

gcloud iam service-accounts list --project <project>

Users & Groups

GCP에서 Users & Groups가 작동하는 방식에 대한 소개는 다음을 확인하세요:

Enumeration

권한 serviceusage.services.enable 및 **serviceusage.services.use**를 사용하면 프로젝트에서 서비스를 활성화하고 사용할 수 있습니다.

기본적으로, Workspace 사용자에게는 Project Creator 역할이 부여되어 새 프로젝트를 생성할 수 있는 권한이 주어집니다. 사용자가 프로젝트를 생성하면, 그는 해당 프로젝트에 대해 owner 역할이 부여됩니다. 따라서, 그는 Workspace를 열거하기 위해 이 서비스들을 프로젝트에서 활성화할 수 있습니다.

그러나 이러한 API를 호출하기 위해서는 Workspace에서 충분한 권한이 필요하다는 점에 유의하세요.

만약 admin 서비스활성화할 수 있고, 사용자가 Workspace에서 충분한 권한을 가지고 있다면, 다음 줄을 사용하여 모든 그룹 및 사용자열거할 수 있습니다. **identity groups**라고 하더라도, 그룹이 없는 사용자도 반환됩니다:

# 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

이전 예제에서 --labels 매개변수가 필요하므로 일반 값을 사용합니다 (API를 직접 사용한 경우에는 필요하지 않습니다, PurplePanda가 여기서 하는 것처럼).

관리자 서비스가 활성화되어 있어도, 손상된 워크스페이스 사용자가 충분한 권한이 없기 때문에 나열하는 동안 오류가 발생할 수 있습니다:

IAM

IAM에 대한 기본 정보는 여기에서 확인하세요.

기본 권한

문서에서: 조직 리소스가 생성되면, 도메인의 모든 사용자에게 기본적으로 청구 계정 생성자프로젝트 생성자 역할이 부여됩니다. 이러한 기본 역할은 사용자가 Google Cloud를 즉시 사용하도록 허용하지만, 조직 리소스의 일반 운영에 사용하기 위한 것이 아닙니다.

역할권한을 부여합니다:

  • billing.accounts.createresourcemanager.organizations.get

  • resourcemanager.organizations.getresourcemanager.projects.create

또한 사용자가 프로젝트를 생성할 때, 그는 문서에 따라 자동으로 해당 프로젝트의 소유자가 됩니다. 따라서 기본적으로 사용자는 프로젝트를 생성하고 그 위에서 어떤 서비스든 실행할 수 있습니다 (채굴자? 워크스페이스 나열? ...)

GCP 조직에서 가장 높은 권한은 조직 관리자 역할입니다.

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

대부분의 서비스에서 add-iam-policy-binding 또는 set-iam-policy 메서드를 사용하여 리소스에 대한 권한을 변경할 수 있습니다. 주요 차이점은 add-iam-policy-binding이 기존 IAM 정책에 새로운 역할 바인딩을 추가하는 반면, set-iam-policy는 이전에 부여된 권한을 삭제하고 명령에 지정된 권한만 설정한다는 것입니다.

나열

# 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 Enumeration

이 서비스를 사용하여 다양한 리소스(조직, 폴더, 프로젝트 등)에서 사용자의 모든 권한을 확인하는 방법이 여러 가지 있습니다.

  • 권한 **cloudasset.assets.searchAllIamPolicies**는 리소스 내의 모든 iam 정책을 요청할 수 있습니다.

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 정책을 요청할 수 있습니다.

# 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 관련 리소스(예: 역할)가 포함됩니다.

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**는 프로젝트와 같은 리소스에 영향을 미치는 정책을 검색하는 데에도 유용할 수 있습니다.

gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
  • 나는 권한 **cloudasset.assets.queryIamPolicy**가 주체의 권한을 찾는 데 접근을 제공할 수 있다고 생각한다.

# 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 열거

이전 방법을 사용하여 IAM 정보에 접근할 수 없는 경우 Red Team에 있다면, 현재 권한을 무차별 대입하기 위해 도구 https://github.com/carlospolop/bf_my_gcp_perms 를 사용할 수 있습니다.

단, 서비스 **cloudresourcemanager.googleapis.com**가 활성화되어 있어야 합니다.

Privesc

다음 페이지에서 IAM 권한을 악용하여 권한을 상승시키는 방법을 확인할 수 있습니다:

인증되지 않은 열거

포스트 익스플로잇

지속성

높은 권한이 있는 경우 다음을 수행할 수 있습니다:

  • 새로운 SAs(또는 Workspace에 있는 경우 사용자) 생성

  • 자신이 제어하는 주체에게 더 많은 권한 부여

  • 취약한 SAs에 더 많은 권한 부여(SSRF in vm, vuln Cloud Function…)

조직 정책

조직 정책이 무엇인지에 대한 소개는 다음을 확인하세요:

IAM 정책은 역할을 통해 주체가 리소스에 대해 가지는 권한을 나타내며, 역할은 세분화된 권한을 부여합니다. 조직 정책은 이 서비스들이 어떻게 사용될 수 있는지 또는 어떤 기능이 비활성화되는지를 제한합니다. 이는 GCP 환경 내 각 리소스의 최소 권한을 개선하는 데 도움이 됩니다.

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

Privesc

다음 페이지에서 조직 정책 권한을 악용하여 권한 상승하는 방법을 확인할 수 있습니다:

HackTricks 지원하기

Last updated