AWS - S3 Post Exploitation

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

S3

有关更多信息请参见:

AWS - S3, Athena & Glacier Enum

Sensitive Information

有时你可以在 buckets 中以可读形式发现敏感信息。例如,terraform state secrets。

Pivoting

不同平台可能会使用 S3 存储敏感资产。
例如,airflow 可能在其中存放 DAGs code,或者 web pages 可能直接从 S3 提供服务。具有写权限的攻击者可以从 bucket modify the codepivot 到其他平台,或通过修改 JS 文件 takeover accounts

S3 Ransomware

在该场景中,攻击者会在自己的 AWS 账户或另一个已被攻陷的账户中创建一个 KMS (Key Management Service) key。随后他们将该 key 设为 world-accessible,允许任何 AWS 用户、角色或账户使用此 key 对对象进行加密。但这些对象无法被解密。

攻击者识别目标 S3 bucket 并获得写权限,方法多种多样。可能是由于 bucket 配置不当导致公开暴露,或攻击者取得了 AWS 环境的访问权限。攻击者通常会针对包含敏感信息的 bucket,例如 PII、PHI、日志、备份等。

为了确定该 bucket 是否可作为 ransomware 目标,攻击者会检查其配置,包括确认是否启用了 S3 Object Versioning,以及是否启用了 multi-factor authentication delete (MFA delete)。如果未启用 Object Versioning,攻击者即可继续。如果启用了 Object Versioning 但未启用 MFA delete,攻击者可以disable Object Versioning。如果两者都启用,则对该 bucket 进行 ransomware 会更困难。

使用 AWS API,攻击者会用他们的 KMS key 替换 bucket 中的每个对象为加密副本。这会有效地加密 bucket 中的数据,使得没有该 key 的情况下无法访问。

为了增加压力,攻击者会安排删除用于攻击的 KMS key。这会给目标一个 7 天窗口来恢复数据,之后 key 被删除数据将永久丢失。

最后,攻击者可能会上传一个最终文件,通常命名为 “ransom-note.txt”,其中包含如何取回文件的说明。该文件通常不加密上传,以便引起目标的注意并告知其遭遇了 ransomware 攻击。

SSE-C (Customer-Provided Key) Ransomware (Codefinger-like)

另一种变体是滥用 SSE-C(S3 server-side encryption with customer-provided keys)。在 SSE-C 中,客户端在每次请求时提供加密密钥AWS 不会存储该密钥。这意味着如果攻击者使用自己的 SSE-C key 重写对象,被害者的数据会变得不可读,除非被害者能够提供该攻击者控制的 key。

  • Preconditions: 已泄露的 AWS 凭证(或任何具有相应权限的主体)以及能够rewrite objects 的能力(例如对目标 key/prefixes 的 s3:PutObject)。这通常还伴随能够设置破坏性 lifecycle 策略的能力(见下文),例如 s3:PutLifecycleConfiguration
  • Attack chain:
  1. 攻击者生成一个随机的 256-bit key (AES-256) 并保存该密钥。
  2. 攻击者使用 SSE-C headers rewrites 现有对象(相同的对象 keys),因此存储的对象现在使用攻击者的密钥加密。
  3. 即使 IAM 权限正常,受害者在不提供 SSE-C key 的情况下也无法下载/解密。
  4. 攻击者可以删除该密钥(或根本不提供),使数据无法恢复。

Example (conceptual) CLI usage:

# Upload/overwrite an object encrypted with attacker-provided SSE-C key
aws s3 cp ./file s3://<BUCKET>/<KEY> \
--sse-c AES256 \
--sse-c-key <BASE64_32_BYTES>

# Download requires providing the same key again
aws s3 cp s3://<BUCKET>/<KEY> ./file \
--sse-c AES256 \
--sse-c-key <BASE64_32_BYTES>
增加压力:Lifecycle “Timer” Abuse

为了移除恢复选项(例如旧版本),攻击者可以将 SSE-C 重写与 生命周期规则 配对,设置对象在短期后过期和/或删除非当前版本:

  • s3:PutLifecycleConfiguration 在 bucket 上允许攻击者安排删除,而无需对每个对象/版本发起显式删除操作。
  • versioning is enabled 时尤其具有影响力,因为它可以移除本可用于恢复的“之前的良好版本”。
检测与缓解
  • 除非有充分的运维理由需要允许 SSE-C,否则优先使用 SSE-KMS(或 SSE-S3)替代 SSE-C。
  • 监控/告警使用 SSE-C 头的 PutObject 请求(S3 的 CloudTrail 数据事件)。
  • 监控/告警意外的 PutBucketLifecycleConfiguration(生命周期更改)。
  • 监控/告警覆盖活动的突增(相同 key 被快速更新)以及 delete-marker/版本删除。
  • 限制高风险权限:将 s3:PutObject 限制到必要的前缀;严格限制 s3:PutLifecycleConfigurations3:PutBucketVersioning;考虑对敏感管理操作(如适用)要求 MFA,并使用带审批的独立管理员角色。
  • 恢复策略:使用 versioningbackups 和 不可变/离线副本(例如将 S3 replication 到受保护账号、备份库等);保护非当前版本免受激进删除,并通过 SCPs / guardrails 约束生命周期更改。

s3:RestoreObject

拥有 s3:RestoreObject 权限的攻击者可以重新激活存档在 Glacier 或 Deep Archive 的对象,使其暂时可访问。这使得恢复并 exfiltration 历史归档数据(backups、snapshots、logs、certifications、old secrets)成为可能,这些数据通常不可获取。如果攻击者将此权限与读取权限(例如 s3:GetObject)结合,则可以获取敏感数据的完整副本。

aws s3api restore-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY> \
--restore-request '{
"Days": <NUMBER_OF_DAYS>,
"GlacierJobParameters": { "Tier": "Standard" }
}'

s3:Delete*

拥有 s3:Delete* 权限的攻击者可以删除对象、版本和整个存储桶,破坏备份,并导致立即且不可逆的数据丢失、证据销毁,以及备份或恢复工件被破坏或泄露。

# Delete an object from a bucket
aws s3api delete-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY>

# Delete a specific version
aws s3api delete-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY> \
--version-id <VERSION_ID>

# Delete a bucket
aws s3api delete-bucket \
--bucket <BUCKET_NAME>

更多信息 check the original research.

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks