通过 CLI 从单个资源调用 AWS Discovery API

编辑

通过 CLI 从单个资源调用 AWS Discovery API

编辑

检测单个 AWS 资源在 10 秒内运行多个 DescribeList API 调用的情况。此行为可能表明攻击者试图使用受损凭据或受损实例来发现 AWS 基础设施。攻击者可能会利用这些信息来识别进一步利用的潜在目标,或更好地了解目标的基础设施。

规则类型: esql

规则索引: 无

严重性: 低

风险评分: 21

每隔: 5 分钟运行

搜索索引自: now-9m (日期数学格式,另请参见 额外回溯时间)

每次执行的最大告警数: 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 下的特定操作,了解 API 调用,例如 Describe*List*Get*。请注意,如果这些调用针对的是敏感服务(例如 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