本文为翻译文章,原文链接:https://notsosecure.com/cloud-services-enumeration-aws-azure-and-gcp
精华:我们已经构建了云枚举脚本,现在可用 @ https://github.com/NotSoSecure/cloud-service-enum/。此脚本允许渗透测试者验证哪些云令牌(API 密钥、OAuth 令牌等)可以访问哪个云服务。
随着云环境变得越来越流行,我们看到云环境在生产中的使用有所增加。从互联网上看,大多数云服务器看起来并没有什么不同,但是,一旦您访问了服务器,事情就开始发生变化。云环境使用 API 密钥、OAuth 令牌或托管身份等令牌进行身份和访问管理。攻击者可以使用各种技术获取这些令牌,例如服务器端请求伪造 (SSRF) 攻击,其中服务器代表攻击者执行操作并将响应发送给攻击者,或者通过攻击(例如命令注入漏洞)云托管应用程序。这些令牌也可能通过代码共享站点(例如 pastebin 或 GitHub)意外泄露而泄露,这些站点可以通过 OSINT 技术发现。在 AWS Elastic Beanstalk 中利用 SSRF并识别和利用泄露的 Azure 存储密钥
在这篇博文中,Aditya Agrawal将探讨一些与 AWS、GCP、Azure 相关的后利用技术,尤其是围绕获取此类令牌时的资源枚举。
通常,通过利用获得的凭证可能有限制并且可能是低特权的。正如我们在NotSoSecure AWS Beanstalk Research中发现的那样,这意味着并非所有资源都是可枚举的,并且并非所有资源都会像 S3 存储桶那样为您提供响应。
这就是为什么我们为 3 家顶级云供应商构建了一套工具来对这些环境进行枚举并提取尽可能多的细节。让我们快速浏览一下我们构建的三个工具。
获得 IAM 凭证后,第一个调用点是通过将凭证加载到 AWS CLI 来查看凭证是否正常工作。
为了确认上述凭据是否有效,我们将进行“sts-get-caller-identity”调用。
接下来,我们可以枚举 IAM 策略和服务,例如 S3 存储桶。示例命令是,
aws s3 ls
您会意识到 AWS 在提供的服务数量方面是一头猛兽,因此我们决定使用“aws_service_enum”自动枚举所有资源
用法
usage: aws_service_enum.py [-h] --access-key --secret-key
[--session-token] [--region]
[--region-all] [--verbose] [--s3-enumeration]
[--logs]
< AWS_SERVICE_ENUM Says "Hello, world!" >
---------------
\ ^__^
\ (oo)\_______
(__)\ )\/
||----w |
|| ||
required arguments:
--access-key AWS Access Key ID
--secret-key AWS Secret Key
optional arguments:
-h, --help show this help message and exit
--session-token AWS Security Token. Required if provided credentials do not have get-session-token access
--region Enter any value from given list
ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-southeast-1, ap-southeast-2, ap-south-1
ca-central-1
eu-central-1, eu-west-1, eu-west-2, eu-west-3, eu-north-1
us-east-1, us-east-2, us-west-1, us-west-2
sa-east-1
--region-all Enumerate for all regions given above
--verbose Select for Verbose output
--s3-enumeration Enumerate possible S3 buckets associated with services like ElasticBeanstalk, Athena
--logs Create a log File in same directory
大多数选项都是不言自明的,但是,我想提请您注意以下 3 个选项:
–region 这将允许您指定默认区域。如果没有选择区域,它将枚举所有区域。
–s3-enumeration 在这里是一个非常有趣的功能。在我们早期对AWS Beanstalk的研究中,我们发现 AWS 在创建存储桶时默认使用命名模式。
例如,如果您创建一个“Elastic Beanstalk”服务,那么 AWS 将创建一个类似 elasticbeanstalk-REGIONNAME-ACCOUNTID 的存储桶,其中 REGIONNAME 是弹性 beanstalk 的区域,ACCOUNTID 是角色的帐户 ID。
–s3-enumeration 将列出发现的服务可以访问但不能直接访问的所有存储桶。例如,如果您通过 SSRF 发现了弹性 beanstalk 凭证,并且如果您使用相同的凭证执行 aws s3 ls,则它不会列出要服务的关联存储桶。但是如果你使用-s3-enumeration,它会尝试猜测bucket,如果有bucket,它会列出(只列出)bucket的内容。
下面给出的工具示例输出:
GCP 使用服务帐户的概念。这些服务帐户通过元数据 API(在计算或云功能实例的情况下)提供临时访问令牌(也称为 OAuth 访问令牌)。我们将重点关注获得“OAuth 访问令牌”后要做什么。
目前,与“OAuth 访问令牌”相关的服务只能通过对 https://developers.google.com/identity/protocols/googlescopes 的 REST API 调用或通过上述 API https://github.com/googleapis/ 的 python 接口来确定 google-api-python 客户端。
第一个调用点是通过 https://www.googleapis.com/oauth2/v2/tokeninfo?access_token={insert_token_here} 端点查看“OAuth 访问令牌”的范围和其他详细信息。
根据范围,可以通过 REST API 接口访问服务列表。例如,如下所示,我们使用来自故意易受攻击的实例的“OAuth 访问令牌”来获取“us-central1”区域中的“Cloud Functions”列表。
使用我们的“gcp_service_enum”工具可以自动完成这项繁琐的任务。
用法
usage: gcp_service_enum.py [-h] --access-token [--region] [--project-id] [--verbose]
[--logs]
< GCP_SERVICE_ENUM Says "Hello, world!" >
---------------
\ ^__^
\ (oo)\_______
(__)\ )\/
||----w |
|| ||
required arguments:
--access-token GCP oauth Access Token
optional arguments:
-h, --help show this help message and exit
--region Enter any value from given list
ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-southeast-1, ap-southeast-2, ap-south-1, ca-central-1
eu-central-1, eu-west-1, eu-west-2, eu-west-3, eu-north-1
us-east-1, us-east-2, us-west-1, us-west-2
sa-east-1
--project-id ProjectID
--verbose Select for Verbose output
--logs Create a log File in same directory
下面给出的工具示例输出:
Azure 托管标识功能为 Azure 服务提供了 Azure AD 中的自动托管标识。你可以使用该标识向任何支持 Azure AD 身份验证的服务(包括 Key Vault)进行身份验证,而无需在代码中添加任何凭据。
可以通过 Azure 实例元数据服务 (IMDS) 端点使用托管标识生成临时访问令牌。一旦获得“访问令牌”,我们将专注于做什么。
第一个调用点是通过https://docs.microsoft.com/en-us/rest/api/resources/subscriptions/list查看与访问令牌关联的订阅列表。
然后,通过提供“subscriptionId”和“access token”,可以使用https://docs.microsoft.com/en-us/rest/api/azure/上列出的所有服务来获取/修改信息/资源。
这些调用是使用我们的“azure_service_enum”工具自动完成的。
用法
> python azure_service_enum.py
usage: azure_enum.py [-h] --access-token [--logs]
<Azure_SERVICE_ENUM Says "Hello, world!" >
---------------
\ ^__^
\ (oo)\_______
(__)\ )\/
||----w |
|| ||
required arguments:
--access-token Azure Managed Identities Access Token
optional arguments:
-h, --help show this help message and exit
--logs Create a log File in same directory
示例 Azure 枚举输出
这些工具旨在从部分可访问的凭据或低特权凭据中提取信息,主要关注渗透测试者识别可被盗凭据访问的资源的需求。