AWS - CloudTrail Enum
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
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 中。
请记住,一个账户可以有 不同的 Trails 从 CloudTrail 启用,将相同(或不同)的日志存储在不同的存储桶中。
创建 CloudTrail 时,可以指示激活所有组织中的账户的 CloudTrail,并将日志获取到一个存储桶中:
这样,您可以轻松地在所有账户的所有区域配置 CloudTrail,并将日志集中在一个账户中(您应该保护该账户)。
您可以通过运行以下命令检查日志是否未被更改
CloudTrail 可以自动将日志发送到 CloudWatch,以便您可以设置警报,当执行可疑活动时提醒您。 请注意,为了允许 CloudTrail 将日志发送到 CloudWatch,需要创建一个 角色 来允许该操作。如果可能,建议使用 AWS 默认角色来执行这些操作。此角色将允许 CloudTrail:
CreateLogStream: 这允许创建 CloudWatch Logs 日志流
PutLogEvents: 将 CloudTrail 日志传送到 CloudWatch Logs 日志流
CloudTrail 事件历史允许您在表格中检查已记录的日志:
CloudTrail 洞察 自动 分析 来自 CloudTrail 路径的写入管理事件,并 提醒 您 异常活动。例如,如果 TerminateInstance
事件的增加与既定基线不同,您将看到它作为洞察事件。这些事件使 发现和响应异常 API 活动比以往任何时候都更容易。
洞察存储在与 CloudTrail 日志相同的存储桶中: BucketName/AWSLogs/AccountID/CloudTrail-Insight
CloudTrail 日志文件完整性
验证日志是否被篡改(修改或删除)
使用摘要文件(为每个文件创建哈希)
SHA-256 哈希
使用 RSA 进行数字签名的 SHA-256
由 Amazon 拥有的私钥
创建摘要文件需要 1 小时(每小时的整点完成)
停止未经授权的访问
使用 IAM 策略和 S3 存储桶策略
安全团队 —> 管理员访问
审计员 —> 只读访问
使用 SSE-S3/SSE-KMS 加密日志
防止日志文件被删除
使用 IAM 和存储桶策略限制删除访问
配置 S3 MFA 删除
使用日志文件验证进行验证
AWS 访问顾问依赖于过去 400 天的 AWS CloudTrail 日志来收集其洞察。CloudTrail 捕获在 AWS 账户中进行的 AWS API 调用和相关事件的历史记录。访问顾问利用这些数据 显示服务最后一次访问的时间。通过分析 CloudTrail 日志,访问顾问可以确定 IAM 用户或角色访问了哪些 AWS 服务以及何时发生该访问。这帮助 AWS 管理员做出有关 精炼权限 的明智决策,因为他们可以识别长时间未被访问的服务,并可能根据实际使用模式减少过于宽泛的权限。
因此,访问顾问告知 给予用户的不必要权限,以便管理员可以删除它们
在 CloudTrail 中执行 CVS 注入是可能的,如果日志以 CSV 格式导出并在 Excel 中打开,将执行任意代码。 以下代码将生成一个包含有效负载的坏 Trail 名称的日志条目:
有关 CSV 注入的更多信息,请查看页面:
有关此特定技术的更多信息,请查看 https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/
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,如 此处所述,并使用您的 Honeytokens AWS 账户列表检查账户 ID:
检查更多信息请访问 原始研究。
最有效的技术实际上是一个简单的方法。只需使用您刚找到的密钥访问您自己攻击者账户中的某个服务。这将使 CloudTrail 在您自己的 AWS 账户中生成日志,而不是在受害者账户中。
问题在于,输出将显示一个错误,指示账户 ID 和账户名称,因此 您将能够看到它是否是一个 Honeytoken。
过去有一些 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 检测到。
更多信息请参见:
在第一个示例中,提供了一个包含单个对象的 JSON 数组作为事件选择器。"ReadWriteType": "ReadOnly"
表示 事件选择器仅应捕获只读事件(因此 CloudTrail insights 不会检查写入 事件,例如)。
您可以根据您的具体要求自定义事件选择器。
删除 S3 桶
更改桶策略以拒绝来自 CloudTrail 服务的任何写入
向 S3 桶添加生命周期策略以删除对象
禁用用于加密 CloudTrail 日志的 kms 密钥
您可以 生成一个非对称密钥 并使 CloudTrail 使用该密钥加密数据,然后 删除私钥,以便 CloudTrail 内容无法恢复。 这基本上是 S3-KMS 勒索软件,详见:
KMS 勒索软件
这是以不同权限要求执行前述攻击的最简单方法:
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术: HackTricks 培训 GCP 红队专家 (GRTE)