GCP <--> Workspace Pivoting

学习并练习AWS Hacking:HackTricks 培训 AWS 红队专家 (ARTE) 学习并练习GCP Hacking: HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks

从 GCP 到 GWS

域范围委托基础知识

Google Workspace 的域范围委托允许一个身份对象,可以是来自 Google Workspace Marketplace 的外部应用,也可以是内部的GCP 服务账号,代表用户跨 Workspace 访问数据

这基本上意味着,在一个组织的 GCP 项目中的服务账号可能能够冒充同一组织的 Workspace 用户(甚至来自不同组织)。

有关此工作原理的更多信息,请查看:

GCP - Understanding Domain-Wide Delegation

窃取现有委托

如果攻击者窃取了对 GCP 的某些访问权限并且知道了公司一个有效的 Workspace 用户邮箱(最好是超级管理员),他可以枚举所有项目枚举所有项目的 SAs,检查他可以访问哪些服务账号,并重复所有这些步骤以每个可以冒充的 SA。 有了他可以访问所有服务账号列表Workspace 邮箱列表,攻击者可以尝试用每个服务账号冒充用户

请注意,在配置域范围委托时不需要 Workspace 用户,因此只需知道一个有效用户足以进行冒充。 但是,将使用被冒充用户的权限,因此如果是超级管理员,您将能够访问所有内容。如果没有任何访问权限,则这将是无用的。

这个简单的脚本将生成一个 OAuth 令牌作为被委托用户,然后您可以使用它来访问其他 Google API,无论是否使用 gcloud

# Impersonate indicated user
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file>

# Impersonate indicated user and add additional scopes
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file> --scopes "https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid"

这是一个工具,可以执行以下攻击步骤:

  1. 使用资源管理器 API 枚举 GCP 项目

  2. 针对每个项目资源进行迭代,并使用 GetIAMPolicy 枚举初始 IAM 用户具有访问权限的 GCP 服务账户资源

  3. 针对每个服务账户角色进行迭代,并查找具有目标服务账户资源上 serviceAccountKeys.create 权限的内置、基本和自定义角色。值得注意的是,编辑者角色本质上具有此权限。

  4. 为在 IAM 策略中找到相关权限的每个服务账户资源创建一个新的 KEY_ALG_RSA_2048 私钥。

  5. 针对每个新服务账户创建一个 JWT 对象,该对象由 SA 私钥凭据和一个 OAuth 作用域组成。创建新 JWT 对象的过程将迭代所有现有的 OAuth 作用域组合,以便找到所有的委托可能性。列表 oauth_scopes.txt 已更新,其中包含我们发现用于滥用 Workspace 身份的所有相关 OAuth 作用域。

  6. _make_authorization_grant_assertion 方法揭示了声明一个目标 Workspace 用户(称为 subject)以在 DWD 下生成 JWT 的必要性。虽然这似乎需要一个特定用户,但重要的是要意识到DWD 影响域内的每个身份。因此,为任何域用户创建 JWT 会影响该域内的所有身份,与我们的组合枚举检查一致。简而言之,一个有效的 Workspace 用户足以继续前进。 可以在 DeleFriend 的 config.yaml 文件中定义此用户。如果目标 Workspace 用户尚未知晓,该工具通过扫描在 GCP 项目上具有角色的域用户来自动识别有效的 Workspace 用户。需要注意的是 JWT 是特定于域的,不会为每个用户生成;因此,自动流程针对每个域的单个唯一身份。

  7. 枚举并为每个 JWT 创建一个新的承载访问令牌,并针对 tokeninfo API 验证令牌。

Gitlab 创建了此 Python 脚本,可以执行两项操作 - 列出用户目录并创建一个新的管理账户,同时指示一个包含 SA 凭据和要冒充的用户的 json。以下是如何使用它:

# Install requirements
pip install --upgrade --user oauth2client

# Validate access only
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com

# List the directory
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--list

# Create a new admin account
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--account pwned

创建新委托(持久性)

可以在https://admin.google.com/u/1/ac/owl/domainwidedelegation检查域范围委托

拥有在GCP项目中创建服务账号GWS超级管理员特权的攻击者可以创建新的委托,允许服务账号冒充一些GWS用户:

  1. 生成新的服务账号和相应的密钥对: 在GCP上,可以通过控制台交互式地创建新的服务账号资源,也可以使用直接API调用和CLI工具进行编程生成。这需要角色iam.serviceAccountAdmin或任何配备iam.serviceAccounts.create 权限的自定义角色。一旦服务账号创建完成,我们将继续生成相关的密钥对(**iam.serviceAccountKeys.create**权限)。

  2. 创建新的委托: 重要的是要了解只有超级管理员角色具有在Google Workspace中设置全局域委托的能力,域委托不能通过编程方式设置,只能通过Google Workspace 控制台进行手动创建和调整。

    • 规则的创建可以在页面API控制 → 在Google Workspace管理控制台中管理域委托下找到。

  3. 附加OAuth范围权限: 在配置新委托时,Google只需要2个参数,即客户端ID,即GCP服务账号资源的OAuth ID,以及定义委托需要的OAuth范围

    • 可以在这里找到完整的OAuth范围列表,但这里有一个建议:https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid

  4. 代表目标身份行事: 现在,在GWS中我们有一个正常运行的委托对象。现在,使用GCP服务账号私钥,我们可以执行API调用(在OAuth范围参数中定义的范围内)来触发它,并代表Google Workspace中存在的任何身份行事。正如我们所了解的,服务账号将根据其需要生成访问令牌,并根据其对REST API应用程序的权限进行操作。

    • 检查前一节以了解一些工具来使用此委托。

跨组织委托

OAuth SA ID是全局的,可用于跨组织委托。尚未实施任何限制以防止跨全局委托。简单来说,来自不同GCP组织的服务账号可以用于在其他Workspace组织上配置域委托。这将导致只需要对Workspace具有超级管理员访问权限,而不需要访问相同的GCP账户,因为对手可以在其个人控制的GCP账户上创建服务账号和私钥。

创建用于枚举Workspace的项目

默认情况下,Workspace 用户具有创建新项目的权限,当创建新项目时,创建者将获得Owner角色

因此,用户可以创建一个项目启用API来在他的新项目中枚举Workspace,并尝试枚举它。

为了使用户能够枚举Workspace,他还需要足够的Workspace权限(不是每个用户都能够枚举目录)。

# Create project
gcloud projects create <uniq-projec-name> --name=proj-name
# Set project
gcloud config set project <uniq-projec-name>
# Enable svcs
gcloud services enable admin.googleapis.com
gcloud services enable cloudidentity.googleapis.com
# Get org ID
gcloud organizations list
# Get currents email user groups (at least you can check the groups and members of the groups you belong to)
gcloud identity groups memberships search-transitive-groups --member-email <email> --labels=cloudidentity.googleapis.com/groups.discussion_forum
gcloud identity groups memberships list --group-email=g<group-email>

# FROM HERE THE USER NEEDS TO HAVE ENOUGH WORKSPACE ACCESS
gcloud beta identity groups preview --customer <org-cust-id>

检查更多枚举

GCP - IAM, Principals & Org Policies Enum

滥用 Gcloud

您可以在以下位置找到有关gcloud登录流程的更多信息:

GCP - Non-svc Persistance

如上所述,gcloud 可以请求范围https://www.googleapis.com/auth/drive,这将允许用户访问用户的驱动器。 作为攻击者,如果您已经物理入侵了用户的计算机且用户仍然登录帐户,您可以生成一个具有访问驱动器权限的令牌进行登录:

gcloud auth login --enable-gdrive-access

如果攻击者入侵了用户的计算机,他还可以修改文件 google-cloud-sdk/lib/googlecloudsdk/core/config.py,在 CLOUDSDK_SCOPES 中添加作用域 'https://www.googleapis.com/auth/drive'

因此,下次用户登录时,他将创建一个具有访问驱动器权限的令牌,攻击者可以利用这个令牌访问驱动器。显然,浏览器将指示生成的令牌将具有访问驱动器的权限,但由于用户将调用 gcloud auth login,他可能不会怀疑任何事情

列出驱动器文件:curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://www.googleapis.com/drive/v3/files"

从 GWS 到 GCP

访问特权的 GCP 用户

如果攻击者完全控制了 GWS,他将能够访问具有对 GCP 特权访问权限的组,甚至用户,因此从 GWS 到 GCP 的移动通常更加“简单”,因为在 GWS 中的用户对 GCP 有很高的特权

Google Groups 特权升级

默认情况下,用户可以自由加入组织的 Workspace 组,这些组可能分配了 GCP 权限(检查您的组在 https://groups.google.com/)。

通过滥用google groups privesc,您可能能够升级到具有某种特权访问权限的 GCP 组。

参考资料

学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks

Last updated