利用错误配置的IAM策略窃取云函数访问令牌[GCP]
理解云函数
Google Cloud Platform中的云函数类似于AWS Lambda,是由事件驱动操作触发的代码块。这些无服务器函数允许开发人员自动化处理流程,例如调整图像大小、将文件上传到存储桶或在数据库记录修改时发送通知。
我们可以通过不同方式触发云函数——直接使用gcloud functions call
命令调用、使用Google Cloud Console,或向函数的URL发送GET或POST请求。
某些函数由特定事件自动触发,例如在Cloud Storage中创建、删除或修改文件时,或在NoSQL数据库Firestore中添加或删除记录时。
要调用云函数,用户或服务账户必须在项目级别或云函数本身的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机器,预装了云渗透测试评估所需的所有必要工具。
安装选项:
- 安装gcloud CLI | Google Cloud CLI文档
- RedCloud-OS | GitHub
利用步骤
现在我们已经理解了IAM策略、云函数和所需权限,我们可以探索潜在的配置错误。
在这个实验场景中,我们使用名为auditor-srv-acc的服务账户获得了初步访问权限。其中一个可访问的函数运行代码,当调用时,会检索绑定到该函数的服务账户的访问令牌,允许我们横向移动到另一个账户。
值得注意的是,并非所有函数代码都包含访问令牌。但在某些用例中,函数可能需要检索一个。例如,函数可能获取访问令牌以验证API调用或与另一个服务安全连接。
然而,暴露这些访问令牌通常是环境中令牌管理配置错误的结果。在以下步骤中,我们将演示如何提取访问令牌。
1. 使用服务账户进行身份验证
首先,第一步是使用gcloud auth命令进行身份验证,并提供服务账户JSON文件进行身份验证。
|
|
以下是通常包含在JSON文件中的信息示例,用于使用CLI身份验证方法向GCP平台进行身份验证:
|
|
2. 枚举IAM策略
一旦我们获得对环境的访问权限,我们开始枚举过程,使用gcloud projects get-iam-policy
命令检查分配项目的IAM策略。
|
|
我们还可以使用以下命令过滤特定账户,比如我们的auditor-srv-acc账户,以检查分配给我们哪些角色和权限。
|
|
--flatten
选项将IAM策略绑定中的嵌套列表分解为更简单、更易读的格式以允许过滤--filter
选项用于过滤特定用户或服务账户--format
选项以不同格式返回输出——JSON、CSV或值(在这种情况下提取特定值,如角色)
我们可以看到auditor-srv-acc服务账户已被分配了一个名为toub2726的自定义角色。自定义角色通常创建时具有针对目标用户需求定制的一组特定权限。
如果这是一个预定义角色,其命名约定将遵循roles/rolename格式,例如roles/owner。然而,自定义角色使用不同的格式,以项目名称开头,后跟角色名称。
3. 检查自定义角色的权限
由于自定义角色带有一组特定的权限,我们需要检查我们被分配了哪些权限。为此,我们可以运行gcloud iam roles describe
命令。
|
|
自定义角色具有项目级别的受限ViewerRole权限。auditor-srv-acc服务账户可以列出函数、IAM策略、计算实例、密钥和存储桶,但无法查看其内容或访问其数据。
4. 列出可用函数
接下来,我们检查可访问的资源,如函数。要列出可用函数,我们可以使用gcloud functions
命令。
|
|
5. 查看函数详细信息
一旦我们有了可用函数的列表,我们可以使用describe命令获取每个函数的更多详细信息。
这为我们提供了诸如函数名称、类型、访问URL、附加的服务账户以及存储源代码的存储桶位置等信息——所有这些我们都可以在以后利用。
|
|
6. 检查每个函数的IAM策略
接下来,我们使用gcloud get-iam-policy
命令检查每个可访问函数的IAM策略。
|
|
所有用户都有权通过cloudfunctions.invoker角色调用该函数。尽管auditor-srv-acc服务账户在项目级别未被授予调用权限,但函数的IAM策略配置错误,允许所有用户触发它。
7. 调用函数
此时,我们可以通过向函数元数据中找到的URL发送GET或POST请求来触发函数。首先,我尝试了GET请求但收到了404错误。
然后,我尝试了带有空参数的POST请求——并成功收到了访问令牌作为响应。
|
|
访问令牌在一小时后过期。
8. 验证访问令牌
一旦我们有了访问令牌,我们可以通过访问以下URL并粘贴访问令牌来验证其有效性。如果令牌有效,我们将看到附加到函数的服务账户的详细信息。
|
|
我们成功检索到了一个名为instance-mgmt-srv-acc的新服务账户的访问令牌。这可能被利用来访问GCP环境中的其他资源,实现横向移动。
缓解策略
- 重新配置IAM策略,移除allUsers和allAuthenticatedUsers调用函数的权限。确保只有特定用户或服务账户具有必要的权限。
- 通过审查函数代码防止云函数暴露访问令牌,确保访问令牌永远不会被记录、打印或以任何方式暴露。
- 如果需要访问令牌,请使用密钥管理器安全地存储和检索访问令牌。
如今天的文章所示,资源级别(如云函数)的错误配置IAM策略允许所有用户调用函数。这种配置错误使我们能够运行函数并检索访问令牌,即使我们用于身份验证的服务账户只有具有有限权限的Viewer角色。
参考资料
- Google Cloud Red Team Specialist [CGRTS]
- IAM基本和预定义角色参考
- HackTricks Cloud — GCP渗透测试
- GCP渗透测试系列