通过单个资源使用 CLI 进行 AWS Discovery API 调用

编辑

通过单个资源使用 CLI 进行 AWS Discovery API 调用

编辑

检测当单个 AWS 资源在 10 秒的时间窗口内运行多个 DescribeList API 调用时。此行为可能表明攻击者正在尝试使用泄露的凭证或受损实例来发现 AWS 基础设施。攻击者可能会使用此信息来识别进一步利用的潜在目标,或更好地了解目标的基础设施。

规则类型: esql

规则索引: 无

严重性: 低

风险评分: 21

运行频率: 5 分钟

搜索索引范围: now-9m (Date Math 格式,另请参阅 额外回溯时间)

每次执行的最大告警数: 100

参考:

标签:

  • 域: 云
  • 数据源: AWS
  • 数据源: AWS EC2
  • 数据源: AWS IAM
  • 数据源: AWS S3
  • 用例: 威胁检测
  • 战术: 发现

版本: 1

规则作者:

  • Elastic

规则许可证: Elastic License v2

调查指南

编辑

分类和分析

调查通过单个资源使用 CLI 进行的 AWS Discovery API 调用

此规则检测到在短时间窗口(30 秒)内,来自单个 AWS 资源的多个与发现相关的 API 调用(DescribeListGet 操作)。大量此类调用可能表明有人试图出于侦察目的枚举 AWS 基础设施,这通常是使用泄露的凭据或未经授权的访问的攻击者所使用的策略。

可能的调查步骤

  • 识别攻击者和资源:
  • 用户身份和资源: 检查 aws.cloudtrail.user_identity.arn 以识别发出发现请求的攻击者。验证与这些操作关联的用户或资源,以确保它们被识别并且是预期的。
  • 用户代理和工具: 检查 user_agent.name 以确认是否使用了 aws-cli 工具来执行这些请求。在非典型上下文中使用 CLI 可能表明存在未经授权或自动化的访问。
  • 评估 API 调用的上下文和范围:
  • API 操作类型: 查看 event.action 下的特定操作,例如 Describe*List*Get* 等 API 调用。注意这些调用是否以敏感服务(如 EC2IAMS3)为目标,这可能表明有人试图识别高价值资产。
  • 时间模式分析: 查看 time_windowunique_api_count,以评估这些调用的频率是否与此资源或用户的正常模式一致。
  • 分析潜在的泄露指标:
  • 身份类型: 查看 aws.cloudtrail.user_identity.type,以确定调用是否来自承担的角色、根用户或服务角色。对于发现操作而言,不寻常的身份类型可能表明存在误用或泄露。
  • 源 IP 和地理位置: 检查 source.ipsource.geo 字段,以识别与活动关联的任何不寻常的 IP 地址或位置,这可能有助于确认或排除外部访问。
  • 检查相关的 CloudTrail 事件:
  • 查找相关事件: 识别与同一攻击者 ARN 相关的任何其他 IAM 或 CloudTrail 事件。在这些发现调用附近进行的活动(例如 AssumeRoleGetSessionTokenCreateAccessKey)可能表示试图升级权限。
  • 查找异常模式: 确定此攻击者或资源之前是否执行过类似发现操作,或者这些操作是否与凭据使用或权限升级相关的其他告警同时发生。

误报分析

  • 预期发现活动: 安全、自动化或监视脚本可能会定期进行发现或枚举 API 调用,以维护资源清单。验证此活动是否与已知的自动化或清单任务一致。
  • 例行管理或自动化访问: 如果特定角色或资源(例如自动化工具或监视服务)定期触发此规则,请考虑为这些已知良性用户添加例外,以减少误报。

响应和修复

  • 确认授权访问: 如果发现活动似乎未经授权,请考虑立即采取措施限制用户或资源的权限。
  • 审查和删除未经授权的 API 调用: 如果攻击者未被授权执行发现操作,请调查并可能禁用其权限或访问密钥,以防止进一步滥用。
  • 增强对发现模式的监视: 考虑对高频发现 API 调用添加额外的日志记录或告警,尤其是在从新的或无法识别的资源触发时。
  • 策略审查和更新: 审查与攻击者关联的 IAM 策略,确保尽可能采取限制性权限和 MFA 强制措施,以防止未经授权的发现。

其他信息

有关 AWS 基础设施发现和最佳实践的更多指南,请参阅 AWS CloudTrail 文档和 MITRE ATT&CK 的 云基础设施发现

规则查询

编辑
from logs-aws.cloudtrail*

// create time window buckets of 10 seconds
| eval time_window = date_trunc(10 seconds, @timestamp)
| where
    event.dataset == "aws.cloudtrail"

    // filter on CloudTrail audit logs for IAM, EC2, and S3 events only
    and event.provider in (
      "iam.amazonaws.com",
      "ec2.amazonaws.com",
      "s3.amazonaws.com",
      "rds.amazonaws.com",
      "lambda.amazonaws.com",
      "dynamodb.amazonaws.com",
      "kms.amazonaws.com",
      "cloudfront.amazonaws.com",
      "elasticloadbalancing.amazonaws.com",
      "cloudfront.amazonaws.com"
    )

    // ignore AWS service actions
    and aws.cloudtrail.user_identity.type != "AWSService"

    // filter for aws-cli specifically
    and user_agent.name == "aws-cli"

    // exclude DescribeCapacityReservations events related to AWS Config
    and not event.action in ("DescribeCapacityReservations")

// filter for Describe, Get, List, and Generate API calls
| where true in (
    starts_with(event.action, "Describe"),
    starts_with(event.action, "Get"),
    starts_with(event.action, "List"),
    starts_with(event.action, "Generate")
)
// extract owner, identity type, and actor from the ARN
| dissect aws.cloudtrail.user_identity.arn "%{}::%{owner}:%{identity_type}/%{actor}"
| where starts_with(actor, "AWSServiceRoleForConfig") != true
| keep @timestamp, time_window, event.action, aws.cloudtrail.user_identity.arn
| stats
    // count the number of unique API calls per time window and actor
    unique_api_count = count_distinct(event.action) by time_window, aws.cloudtrail.user_identity.arn

// filter for more than 5 unique API calls per time window
| where unique_api_count > 5

// sort the results by the number of unique API calls in descending order
| sort unique_api_count desc

框架: MITRE ATT&CKTM