研究人员来自Palo Alto Networks 的 Unit 42通过利用.env
文件,查找存储在云环境中的敏感秘密,发现了针对云环境的重大网络攻击。
调查得出的结论是,作为此恶意活动的一部分,已利用受感染的 AWS 环境跨各个域进行互联网范围的扫描。Unit 42 发现威胁行为者从大约 110,000 个域中收集了.env
文件,暴露了 90,000 多个敏感凭据,其中包括 7,000 个与各个组织使用的云服务相关的凭据。
以下文章详细介绍了攻击者在此恶意操作中使用的技术。我将探讨攻击的 5 个阶段——初始访问、帐户发现、权限升级、恶意执行和数据泄露——以及推动这 5 个阶段的 12 个微步骤。
第一阶段:初始访问
攻击者通过利用.env
文件中暴露的秘密获得了对受害者云环境的初始访问权限。服务使用这些文件来访问运行时环境变量,这些变量通常根据服务的部署位置在开发、中台和生产环境中进行不同的配置。
在生产环境中, .env
文件通常包含高度敏感的信息,例如访问令牌、凭据和 API 密钥。由于其敏感性, .env
文件通常被排除在代码存储库之外,并为特定实例手动配置。
.env
文件通常用于配置托管面向客户的 Web 应用程序的 Web 服务器。如果配置不当,攻击者可以通过http[s]://<domain>/.env
公开访问它们,可能会导致检索.env
文件内容,该文件内容包含生产中使用的敏感身份验证资产。
第 二 阶段:账户发现
扫描不安全的 Web 服务器后,攻击者使用从可公开访问的.env
文件获取的 AWS 访问密钥来了解有关受感染帐户的更多信息。
AWS 访问密钥是 AWS IAM 用户的长期凭证,由两部分组成: access key ID
和secret access key
。这些凭证共同允许代表与访问密钥关联的 IAM 用户对 AWS API 请求进行身份验证。注意:从安全角度来看,AWS 访问密钥不被视为最佳实践。相反,我们鼓励开发人员使用临时安全凭证(例如 AWS IAM 角色)而不是长期凭证。
使用 AWS 访问密钥,威胁行为者在 AWS 环境中获得了立足点,并试图了解有关受感染帐户的更多信息。这种策略使他们能够推进恶意操作——升级权限、横向移动以及提取有价值的数据。攻击者跨多个服务进行了多次 AWS API 调用:
•步骤 1 —AWS Security Token Service (STS):攻击者调用 STS GetCallerIdentity API 来获取有关其 AWS 访问密钥用于调用 API 的 IAM 实体的详细信息。它返回UserID
,它代表调用实体的唯一标识符; Account
,代表拥有调用实体的帐户;以及与调用实体关联的ARN
。注意:执行此类操作不需要任何权限。
•步骤 2 — AWS Identity & Access Management (IAM):攻击者调用 IAM ListUsers API 来获取有关 AWS 用户池中所有 IAM 用户的详细信息及其 IAM 属性。它使他们能够找到潜在的用户实体以用于未来的横向移动。
•步骤 3 — AWS Simple Storage Service (S3):攻击者调用 S3 ListBuckets API 来获取请求的调用实体拥有的所有 S3 存储桶的列表。它使他们能够找到潜在的 S3 存储桶,用于未来的数据泄露操作。注意:调用实体必须具有s3:ListAllMyBuckets
权限才能执行此操作。
虽然可以对受感染的帐户进行基本扫描,但威胁行为者需要管理员访问权限来分配计算资源和执行代码。因此,他们开始进行权限升级。
第三阶段:权限提升
威胁行为者想要在受感染的账户中执行代码,但用于初始访问的 IAM 凭证没有足够的权限。因此,他们进行了权限提升以执行进一步的恶意操作。
低权限 IAM 委托人的权限有限,限制了他们对关键资源的访问。通过升级权限,攻击者可以获得更高的访问权限(针对AdministratorAccess
AWS 管理的 IAM 策略),从而允许他们绕过安全控制,在云环境中横向移动,并最终从敏感的 S3 存储桶中窃取数据。
为了提升权限,威胁行为者创建了一个新的 AWS IAM 角色,为其分配了提升的权限,并担任该角色以获取提升的 IAM 凭证。
为了更好地理解这种升级模式,我们首先需要仔细研究 AWS IAM 角色的结构。
3.1. AWS IAM 角色的结构 -信任和权限策略
AWS IAM 角色是根据分配的权限授予对 AWS 服务的访问权限的实体,类似于 IAM 用户。但是,与用户不同,角色没有密码或访问密钥。相反,它们向任何拥有它们的人提供临时安全凭证。这减少了管理用户及其长期凭证的需要,因为角色会在需要时及时生成临时凭证 (JIT),同时提供足够的访问权限 (JEA)。
AWS IAM 角色由两个组件组成:
1.信任策略旨在防止未经授权或非预期实体滥用 IAM 角色。这些策略定义了角色和允许承担该角色的实体之间的信任关系。允许承担角色的委托人涵盖 IAM 用户、IAM 角色、AWS 服务或来自身份提供商 (IdP) 的联合身份。
2.权限策略指定 IAM 委托人在承担 IAM 角色后可以对 AWS 服务和资源执行哪些操作。注意:可以将多个权限策略附加到一个实体以授予不同级别的访问权限。
在更清楚地了解 AWS IAM 角色的结构后,我们现在可以深入研究涉及CreateRole和AttachRolePolicy API 的 AWS IAM 权限升级技术。
3.2.使用 CreateRole 和 AttachRolePolicy 升级权限
为了提升权限,攻击者创建了 IAM 资源,可以不受限制地访问受害者的 AWS 资源。他们创建了一个名为lambda-ex
IAM 角色,为其附加提升的权限,并代入该角色以获取临时 IAM 凭证。
•步骤 4 — 创建新的 IAM 角色:攻击者使用 IAM CreateRole API 在受感染的 AWS 账户中创建一个名为lambda-ex
的新 IAM 角色,并使用AssumeRolePolicyDocument
(信任策略)授予自己的调用身份权限来代入该角色。
•步骤 5 — 将提升的 IAM 策略附加到 IAM 角色:攻击者使用 IAM AttachRolePolicy API 将 AWS 管理的AdministratorAccess
IAM 策略附加到lambda-ex
角色,使该策略成为该角色权限策略的一部分。
•步骤 6 — 承担 IAM 角色:攻击者使用 STS AssumeRole API 以及与新创建的lambda-ex
角色对应的 te RoleArn
(附加了AdministratorAccess
AWS 托管策略)来获取一组提供不受限制的临时 IAM 凭证访问受害者 AWS 账户中的 AWS 资源。
通过 IAM 凭证授予对受感染 AWS 账户的不受限制的访问权限,威胁行为者可以通过创建执行其恶意代码的 AWS lambda 函数来执行代码。
第四阶段:恶意执行
使用临时和提升的 IAM 凭证,威胁行为者在 AWS 区域us-east-1
中创建了一个名为ex
的新 lambda 函数。此 lambda 函数执行一个 bash 脚本,该脚本扫描互联网范围内的域以查找公开的.env
文件,从中提取凭据,并将凭据上传到其控制下的 S3 存储桶。
这种技术使攻击者能够通过使用类似的攻击媒介从目标受害者的存储桶中窃取和删除 S3 对象,从而危害更多的 AWS 账户。然后,他们可以将勒索信上传到空的存储桶中,要求支付大笔费用以归还泄露的数据。为了恶意执行,lambda 函数有权与攻击者控制的 S3 存储桶进行交互。
注意: AWS lambda 函数需要特定权限才能执行 API 操作和访问其他 AWS 资源。这些权限在称为execution role
的 IAM 角色中定义,lambda 在调用时自动承担该角色。 execution role
可以附加一个策略,指定访问 AWS 资源所需的权限。它至少必须有权访问 Amazon CloudWatch,因为 Lambda 默认情况下会在此处记录(附加AWSLambdaBasicExecutionRole
策略可满足此要求)。此外,该角色的信任策略必须包含 lambda 服务主体 ( lambda.amazonaws.com
) 以允许 Lambda 代入该角色。
•步骤 7 — 创建新的 AWS lambda 函数:攻击者使用 AWS Lambda CreateFunction API 在受感染的 AWS 账户中创建一个名为ex
新 lambda 函数,并使用授予攻击者控制的 S3 存储桶访问权限的ExecutionRole
。
•步骤 8(隐式)— 创建新的 Amazon CloudWatch 日志组: AWS lambda 函数的创建会自动触发 Amazon CloudWatch CreateLogGroup API 调用,在本例中,该调用会创建一个名为/aws/lambda/ex
日志组来托管日志恶意功能生成的流。接下来是CreateLogStream API 调用,该调用在日志组中创建第一个日志流,以按日期聚合运行时日志事件。注意:默认情况下,该功能的 Amazon CloudWatch 日志记录始终处于启用状态,攻击者无法禁用它。
•步骤 9 — 获取潜在的目标域进行入侵:恶意 lambda 函数访问攻击者控制的 S3 存储桶,以获取要扫描的潜在目标域列表并尝试进行入侵。
•步骤 10 — 扫描可利用的.env
文件中存储的凭据:对于每个<domain>
,恶意 lambda 函数尝试通过访问http[s]://<domain>/.env
来从.env
文件中检索敏感机密,如果 Web 服务器配置错误,则读取.env
文件的内容。
•步骤 11 — 将敏感凭证存储在受控 AWS S3 存储桶中:如果恶意 lambda 函数检索到域的公开.env
文件,它会解析文件内容以提取敏感凭证,然后将这些凭证存储在受控 AWS S3 内的专用文件夹中桶。
第五阶段:数据泄露
使用受损的凭证,攻击者继续从 Amazon S3 存储桶中窃取和勒索敏感数据。他们的数据泄露涉及从这些存储实例中未经授权地提取和删除数据。
威胁行为者访问受感染帐户内的 S3 存储桶,并使用S3 浏览器工具与 S3 API 进行交互以提取数据。下载所有文件后,他们将其删除并留下勒索信,通知所有者他们的敏感信息现在已由攻击者掌握,除非支付赎金,否则将被出售。
•步骤 12 — 在跨 AWS 账户的 S3 存储桶之间移动 S3 对象: S3 浏览器工具允许将数据从一个 AWS 账户中的源 S3 存储桶传输到另一个 AWS 账户中的目标 S3 存储桶,无论是位于同一 AWS 区域还是不同的区域。为此,源 S3 存储桶必须通过附加的资源策略授予 IAM 访问权限。目标账户中的 IAM 用户需要承担对源存储桶具有GetObject
和DeleteObject
权限的角色。最后,攻击者可以使用S3 mv
命令将数据从源S3存储桶传输到目标S3存储桶。
注意: S3 浏览器工具在使用过程中会生成各种 S3 API 调用,这可以揭示攻击者访问的 S3 存储桶,无论是否启用了 S3 对象级日志记录。
无 偿 获 取 网 安 资 料:
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关