利用配置错误的IAM策略窃取云函数访问令牌(GCP)

本文详细介绍了Google Cloud Platform中IAM策略配置错误导致云函数访问令牌暴露的安全风险,包括攻击步骤、工具使用和缓解策略,涵盖身份验证、权限枚举和令牌提取等实战技术。

利用配置错误的IAM策略窃取云函数访问令牌(GCP)

IAM策略配置错误如何导致Google Cloud中云函数访问令牌暴露和利用

在身份和访问管理(IAM)中,策略是一组规则,通过指定谁可以对哪些资源执行什么操作来定义访问控制。这些策略帮助管理员在环境中有效管理权限。

在Google Cloud Platform(GCP)中,策略通常包含三个主要组件:

  • 成员 — 通常是用户、服务账户和群组。
  • 角色/权限 — 定义成员可以对特定资源执行的操作。
  • 资源 — 这些策略应用的实际资产,如项目、云函数、存储桶、计算实例等。基本上是GCP提供的任何资源或服务。

任何IAM策略中的配置错误,如果允许意外访问,都可能导致安全风险。

在本博客文章中,我们将探讨一个场景:云函数IAM策略中的配置错误使攻击者能够窃取服务账户的访问令牌。该场景假设我们已经获得对GCP环境的访问权限。

演示步骤将使用CyberWarFare Labs的Google Cloud红队专家(CGRTS)培训。这是一个很棒的培训项目,涵盖了许多真实场景。

让我们开始吧!

目录

  • 理解云函数
    • 角色
    • 权限
  • 更新云函数的IAM策略变更
  • 所需工具
  • 利用步骤
  • 缓解策略
  • 参考文献
  • GCP渗透测试系列

理解云函数

GCP中的云函数类似于AWS Lambda,是由事件驱动操作触发的代码块。这些无服务器函数允许开发人员自动化流程,如图像调整大小、将文件上传到存储桶或在数据库记录修改时发送通知。

我们可以通过不同方式触发云函数 — 直接使用gcloud functions call命令调用、使用Google Cloud控制台,或向函数的URL发送GET或POST请求。

某些函数由特定事件自动触发,例如在Cloud Storage中创建、删除或修改文件时,或在Firestore(NoSQL数据库)中添加或删除记录时。

要调用云函数,用户或服务账户必须在项目级别或直接在云函数本身的IAM策略中被分配适当的IAM角色或权限。

以下是用户或服务账户更新/调用云函数所需的角色和权限:

角色

  • Cloud Function Admin: roles/cloudfunctions.admin
  • 部署/更新云函数: roles/cloudfunctions.developer
  • 调用云函数: roles/cloudfunctions.invoker

权限

  • 调用云函数: cloudfunctions.functions.invoke
  • 更新云函数代码: cloudfunctions.functions.update
  • 创建新云函数: cloudfunctions.functions.create

更新云函数的IAM策略变更

过去,任何被分配cloudfunctions.admin或cloudfunctions.developer角色的用户或服务账户都可以直接对函数进行更改。然而,Google更改了IAM策略,现在只有服务账户可以更新函数。

要更新函数:

  • 服务账户必须具有cloudfunctions.developer角色或cloudfunctions.admin角色。

如果用户想要更新函数,他们需要iam.serviceAccountUser角色或iam.serviceAccounts.actAs权限。这允许他们模拟具有管理员或开发者角色的服务账户并进行更新。

所需工具

对于本实验,我们需要在测试机器上安装gcloud CLI。您可以直接从Google Cloud安装,或设置RedCloud-OS,这是CWL组装的VMware机器,预装了云渗透测试评估(GCP、Azure、AWS)所需的所有必要工具。

安装选项:

利用步骤

现在我们理解了IAM策略、云函数和所需权限,可以探索潜在的配置错误。

在本实验场景中,我们使用名为auditor-srv-acc的服务账户获得了立足点。其中一个可访问的函数运行代码,当调用时,检索绑定到该函数的服务账户的访问令牌,允许我们横向移动到另一个账户。

值得注意的是,并非所有函数代码都包含访问令牌。然而,在某些用例中,函数可能需要检索一个。例如,函数可能获取访问令牌以验证API调用或安全地与其他服务连接。

然而,暴露这些访问令牌通常是环境中令牌管理方式配置错误的结果。在以下步骤中,我们将演示如何提取访问令牌。

1. 使用服务账户进行身份验证

首先,第一步是使用gcloud auth命令进行身份验证,并提供服务账户JSON文件进行身份验证。

1
gcloud auth activate-service-account --key-file [JSON密钥文件]

以下是通常包含在JSON文件中的信息示例,用于使用CLI身份验证方法向GCP平台进行身份验证。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "type": "SERVICE_ACCOUNT",
  "project_id": "my-gcp-project",
  "private_key_id": "abcd1234abcd1234abcd1234abcd1234",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIE.\n-----END PRIVATE KEY-----\n",
  "client_email": "my-service-account@my-gcp-project.iam.gserviceaccount.com",
  "client_id": "123456789012345678901",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/my-service-account%40my-gcp-project.iam.gserviceaccount.com"
}

2. 枚举IAM策略

一旦获得对环境的访问权限,我们开始枚举过程,使用gcloud projects get-iam-policy命令检查分配项目的IAM策略。

1
gcloud projects get-iam-policy [项目名称]

我们还可以使用以下命令过滤特定账户,如我们的auditor-srv-acc账户,检查哪些角色和权限已分配给我们。

1
gcloud projects get-iam-policy [项目名称] --flatten="bindings[].members" --filter="bindings.members=serviceaccount:服务账户" --format="value(bindings.role)"
  • --flatten选项将IAM策略绑定中的嵌套列表分解为更简单、更易读的格式以允许过滤
  • --filter选项用于过滤特定用户或服务账户
  • --format选项以不同格式返回输出 — JSON、CSV或Value(在这种情况下提取特定值如角色)

在图6中,我们可以看到auditor-srv-acc服务账户被分配了一个名为toub2726的自定义角色。自定义角色通常创建时具有一组特定权限, tailored to目标用户的需求。

如果这是一个预定义角色,其命名约定将遵循roles/rolename格式,如roles/owner。然而,自定义角色使用不同的格式,以项目名称开头,后跟角色名称(例如,projects/project-name/roles/rolename)。

3. 检查自定义角色的权限

由于自定义角色带有一组特定权限,我们需要检查我们被分配了哪些权限。为此,我们可以运行gcloud iam roles describe命令。

1
gcloud iam roles describe toub2726 --project [项目名称]

图7显示自定义角色(toub2726)具有有限的ViewerRole,在项目级别具有受限权限。auditor-srv-acc服务账户可以列出函数、IAM策略、计算实例、密钥和存储桶,但无法查看其内容或访问其数据。

4. 列出可用函数

接下来,我们检查可访问的资源,如函数。要列出可用函数,我们可以使用gcloud functions命令。

1
gcloud functions list

5. 查看函数详细信息

一旦有了可用函数列表,我们可以使用describe命令获取每个函数的更多详细信息。

这提供了诸如函数名称、类型、访问URL、附加的服务账户以及存储源代码的存储桶位置等信息 — 所有这些我们都可以稍后利用。

1
gcloud functions describe [函数名称]

6. 检查每个函数的IAM策略

接下来,我们使用gcloud get-iam-policy命令检查每个可访问函数的IAM策略。

1
gcloud functions get-iam-policy [函数名称]

如图10所示,所有用户都有权限通过cloudfunctions.invoker角色调用函数。尽管auditor-srv-acc服务账户在项目级别未被授予调用权限,但函数的IAM策略配置错误,允许所有用户触发它。

7. 调用函数

此时,我们可以通过向函数元数据中找到的URL发送GET或POST请求来触发函数。首先,我尝试了GET请求但收到了404错误。

然后,我尝试了带有空参数的POST请求 — 并成功收到了访问令牌作为响应。

1
curl -X POST "https://函数-URL" -H "Content-Type: application/json" -d '{}'

🚦访问令牌在一(1)小时内有效,然后过期。

8. 验证访问令牌

一旦我们有了访问令牌,我们可以通过访问以下URL并粘贴访问令牌来验证其有效性。如果令牌有效,我们将看到附加到函数的服务账户的详细信息。

1
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=[访问令牌]

如图12所示,我们成功检索到了一个名为instance-mgmt-srv-acc的新服务账户的访问令牌。这可以潜在地用于访问GCP环境中的其他资源,实现横向移动。

缓解策略

  • 重新配置IAM策略,移除allUsers和allAuthenticatedUsers调用函数的权限。确保只有特定用户或服务账户具有必要权限。
  • 通过审查函数代码确保访问令牌从不被记录、打印或以任何方式暴露,防止云函数暴露访问令牌。
  • 如果需要访问令牌,使用密钥管理器安全存储和检索。

如今天的文章所示,资源级别(如云函数)的配置错误的IAM策略允许所有用户调用函数。这种配置错误使我们能够运行函数并检索访问令牌,尽管我们用于身份验证的服务账户只有具有有限权限的Viewer角色。

今天就到这里 — 下次见!

参考文献

  • Google Cloud红队专家 [CGRTS]
  • IAM基本和预定义角色参考
  • HackTricks Cloud — GCP渗透测试
  • GCP渗透测试系列
    • 利用配置错误的IAM策略窃取云函数访问令牌 [GCP]
    • 滥用计算实例IAM配置错误在GCP中获取权限
    • GCP权限提升:滥用函数管理员角色实现完全项目接管

CloudHacking Pentesting Security Google

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计