【Web】云安全之元数据服务

前言

最近再挖SRC的时候,遇到了一处疑似SSRF的接口,并且尝试访问元数据服务,通的,但由于之前接触的较少,暂时没有思路,所以有了如下的文章。

本文详细介绍了元数据相关的一些知识点,以及如何通过元数据泄露-获取角色信息-获取角色临时凭证-通过凭证进一步获取资源

相关知识

1. 云服务器实例

是指在云计算环境中运行的一种虚拟服务器。实例是云计算的基本单位,它是在物理服务器上使用虚拟化技术创建的一个虚拟服务器,可以提供计算、存储、网络等各种服务。

用户视角就是首先需要选购机型、选购地区、选购配置的时长或者是计费方式,当购买成功之后,就会生成一个云服务器的实例。

2. 元数据

元数据指的是描述数据的数据,它是一种描述数据的信息,包括对数据的定义、结构、格式、属性等方面的描述。换句话说,元数据是关于数据的数据,是用来描述和管理数据的信息。

元数据可以包含各种类型的信息,例如数据的类型、格式、大小、来源、所有者、版本、创建时间、修改时间等。元数据还可以描述数据之间的关系、分组、分类等信息,以及数据的使用和权限控制等方面的信息。

在云服务实例上,元数据通常是指描述实例的数据信息,例如实例的 ID、名称、状态、运行时间、操作系统、网络配置、安全组配置、存储配置等。这些元数据通常存储在云服务提供商的元数据服务中,可以通过元数据服务的 API 或命令行工具访问和管理。

需要注意的是,在云服务实例上,元数据通常是只读的,用户不能直接修改元数据。但是,用户可以通过修改实例的配置来改变元数据,例如更改实例的名称、网络配置、安全组配置等。

3. 常见的元数据查询接口

常见的云服务元数据查询接口包括:

EC2 实例元数据查询接口:Amazon EC2 实例元数据查询接口是 Amazon Web Services (AWS) 的一种元数据服务,可以通过 HTTP 请求获取 EC2 实例的元数据。例如,可以使用 http://169.254.169.254/latest/meta-data/ 来访问实例的元数据。

Google Cloud 实例元数据查询接口:Google Cloud 实例元数据查询接口是 Google Cloud Platform 的一种元数据服务,可以通过 HTTP 请求获取实例的元数据。例如,可以使用 http://metadata.google.internal/computeMetadata/v1/ 来访问实例的元数据。

Azure 实例元数据查询接口:Azure 实例元数据查询接口是 Microsoft Azure 的一种元数据服务,可以通过 HTTP 请求获取实例的元数据。例如,可以使用 http://169.254.169.254/metadata/instance?api-version=2017-08-01 来访问实例的元数据。

4. 169.254.169.254

169.254.169.254 是一个特殊的 IP 地址,通常用于在局域网中提供自动配置的服务。在云计算环境中,这个地址通常被用作云服务实例的元数据服务地址。

具体来说,云服务提供商通常在云服务实例中预先配置 169.254.169.254 这个地址,用于提供实例的元数据服务。用户可以通过访问这个地址来获取实例的元数据信息,

需要注意的是,169.254.169.254 是一个本地链接地址,只能在实例内部访问,不能从外部访问。此外,不同的云服务提供商对于元数据服务的具体实现和访问方式可能略有不同,用户需要查阅相应的文档和指南来了解如何访问和使用元数据服务。

5. /latest/meta-data/ 

http://169.254.169.254/latest/meta-data/ 是用于访问 Amazon EC2 实例元数据的 URL,这个 URL 的路径部分包含了一些子目录,每个子目录下存储着不同的元数据信息。以下是一些常见的子目录和对应的元数据信息:

  1. ami-id:实例的 Amazon Machine Image (AMI) ID。
  2. ami-launch-index:启动实例的顺序号。
  3. ami-manifest-path:AMI 的 manifest 路径。
  4. block-device-mapping/:块设备映射信息,包括实例的 EBS 卷和实例存储设备。
  5. hostname:实例的主机名。
  6. instance-id:实例的 ID。
  7. instance-type:实例的类型。
  8. local-ipv4:实例的本地 IPv4 地址。
  9. mac:实例的 MAC 地址。
  10. placement/:实例的放置信息,包括实例所在的区域、可用区和位置组。
  11. profile:实例的 IAM 角色名称。
  12. public-hostname:实例的公共主机名。
  13. public-ipv4:实例的公共 IPv4 地址。
  14. reservation-id:实例的预订 ID。
  15. security-groups:实例所属的安全组列表。

6. 角色名称

在 AWS 中,角色名称(Role Name)是一种资源标识符,用于标识 AWS Identity and Access Management (IAM) 中的角色。IAM 角色是一种 AWS 资源,用于定义一组权限,以便 AWS 资源和服务可以访问另一个 AWS 资源或服务。

角色名称是为了方便用户管理 IAM 角色而设置的,它通常由字母、数字和特殊字符组成,长度不超过 64 个字符。用户可以为不同的 IAM 角色设置不同的名称,以便更好地区分和管理这些角色。

IAM 角色可以被授予其他 AWS 资源和服务的访问权限,例如 EC2 实例、Lambda 函数、API Gateway 等。这些资源可以通过角色名称来引用和访问对应的 IAM 角色,从而获得相应的权限和访问控制。

总之,角色名称是一种用于标识 AWS Identity and Access Management (IAM) 中的角色的资源标识符,它可以方便用户管理 IAM 角色,同时也可以被其他 AWS 资源和服务用于访问和授权。

7. 角色临时凭证

要获取角色临时凭证,可以使用 AWS Security Token Service (STS) 的 AssumeRole API。AssumeRole API 允许您使用 IAM 角色中定义的策略和权限,获取一个临时的安全凭证,以便访问 AWS 资源和服务。

包括一个访问密钥 ID、一个密钥访问密钥和一个安全令牌。这些凭证具有一定的时效性,可以在一定时间内用于访问 AWS 资源和服务。

具体来说,可以使用 AWS SDK 或命令行工具中的 AWS CLI,使用角色的临时凭证来访问 AWS 资源。以下是一些使用 AWS CLI 访问 AWS 资源的示例命令:

  • 使用 S3 存储桶的名称列出存储桶中的对象:aws s3 ls s3://<bucket-name> --profile <profile-name>
  • 使用 EC2 实例 ID 列出实例的标签:aws ec2 describe-tags --filters "Name=resource-id,Values=<instance-id>" --profile <profile-name>
  • 使用 Lambda 函数名称列出函数的配置信息:aws lambda get-function --function-name <function-name> --profile <profile-name>

在这些命令中,<profile-name> 是您 AWS CLI 配置文件中的配置文件名称,用于指定使用哪个 IAM 角色的临时凭证。在配置文件中,您需要指定角色的 ARN(Amazon 资源名称)以及访问密钥 ID、密钥访问密钥和安全令牌等凭证信息。

要使用 aws configure 命令来配置 IAM 角色的临时凭证,您可以按照以下步骤操作:

1. 登录到AWS 管理控制台,并选择要用于临时凭证的 IAM 角色。

2. 在该角色的权限策略中,确保角色具有访问想要访问的 AWS 资源的权限。

3. 在本地终端上打开 AWS CLI 并运行 aws configure 命令。

4. 按照提示输入配置信息,其中包括:

  • AWS 访问密钥 ID 和密钥访问密钥:您可以使用 IAM 控制台或 AWS CLI 创建和管理这些凭证。
  • 默认区域:指定您要使用的 AWS 区域。如果您不确定应该使用哪个区域,请留空以使用默认值。
  • 输出格式:指定 AWS CLI 输出结果的格式。建议使用 json 格式,以便更轻松地解析和处理输出结果。

5. 对于 AWS Access Key ID 和 AWS Secret Access Key,将 IAM 角色的临时凭证中的访问密钥 ID 和密钥访问密钥分别输入到 AWS Access Key ID 和 AWS Secret Access Key 字段中。

6. 对于 Default region name,可以输入要使用的 AWS 区域的名称。如果您不确定应该使用哪个区域,请留空以使用默认值。

7. 对于 Default output format,建议输入 json,以便更轻松地解析和处理输出结果。

8. 输入完毕后,按照提示进行确认。

完成上述步骤后,就可以使用 aws 命令行工具来访问 AWS 资源,而无需手动提供 IAM 角色的临时凭证。例如,可以使用以下命令来列出 S3 存储桶中的对象:

aws s3 ls s3://<bucket-name>

8. IAM

IAM 是 AWS(Amazon Web Services)中的身份验证和访问管理服务,全称是 Identity and Access Management。IAM 允许您创建和管理 AWS 用户及其访问 AWS 资源的权限。使用 IAM,您可以为每个用户分配单独的凭证,并定义用户可以访问哪些 AWS 资源以及以何种方式访问这些资源。IAM 还可以帮助您保护您的 AWS 资源,确保只有经过授权的用户可以访问这些资源。

IAM 的核心概念包括用户、组、角色和策略。用户是 AWS 中的实体,代表一个人或一个应用程序,他们需要访问 AWS 资源。组是一组用户的集合,可以对这些用户授予相同的权限。角色是 AWS 中的一种实体,它代表一个 AWS 服务或应用程序,并定义了该服务或应用程序可以访问哪些 AWS 资源以及以何种方式访问这些资源。策略是一组 JSON 格式的规则,用于定义用户、组和角色的权限,以及对这些实体的访问进行控制。

IAM 可以帮助您实现 AWS 资源的安全性和合规性要求,并确保您的 AWS 资源只被经过授权的用户访问。

9. 实例元数据API

实例元数据服务还提供了一些其他的 API,用于访问实例的 IAM 相关信息。以下是一些常用的 API:

  • http://169.254.169.254/latest/meta-data/iam/: 用于获取实例的 IAM 元数据信息。
  • http://169.254.169.254/latest/meta-data/iam/security-credentials/:用于获取实例当前使用的 IAM 角色的临时凭证。
  • http://169.254.169.254/latest/meta-data/iam/info:用于获取实例的 IAM 实例配置信息。
  • http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>:用于获取指定 IAM 角色的临时凭证,其中 <role-name> 是角色的名称。
  • http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>/:用于获取指定 IAM 角色的临时凭证,这个 API 与上一个 API 的区别在于,它在 URL 末尾添加了一个斜杠 /

10. 元数据攻击思路

以下是一些常见的元数据攻击思路:

第一步: 基于元数据服务的 SSRF、RCE、文件读取 攻击:攻击者构造恶意请求,使云服务实例中的应用程序发送 HTTP 请求到攻击者控制的服务器上,从而获取实例的元数据信息。 - http://169.254.169.254/latest/meta-data/iam/info: IAM 实例配置信息,主要是role-name

第二步: 利用元数据服务中的敏感信息role-name:攻击者可以通过元数据服务获取实例的敏感信息,例如:

  • 密钥、证书、密码
  • 临时凭证:http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>

第三步:利用第二步获取的临时凭证获取实例的敏感信息。

如果您成功获取了 IAM 角色的临时凭证,可以使用这些凭证来访问 AWS S3 存储桶中的敏感数据。以下是一些可能的攻击方式:

  • 下载文件:使用角色的临时凭证,您可以使用 AWS CLI 或 SDK 来下载存储在 S3 存储桶中的文件。您可以使用以下命令来下载文件:
aws s3 cp s3://<bucket-name>/<object-key> <local-file-path> --profile <role-profile>
  • 列出文件:使用角色的临时凭证,您可以使用 AWS CLI 或 SDK 来列出存储在 S3 存储桶中的所有文件。您可以使用以下命令来列出文件:
aws s3 ls s3://<bucket-name> --profile <role-profile>

  • 上传文件:使用角色的临时凭证,您可以使用 AWS CLI 或 SDK 将文件上传到 S3 存储桶中。上传文件的命令类似于下载文件的命令,但需要指定本地文件路径和目标 S3 存储桶的名称和对象键。

后话

通过记录发现,这只是一条攻击链路,还有很多可以利用的点,例如元数据中并不只有临时凭证,或许也存在秘钥证书或密码。这其中就涉及各种其他的api的利用了。属于后话,后面文章再进行记录吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值