{
  "technique_id": "T1613",
  "name": "Container and Resource Discovery",
  "priority": "medium",
  "status": "draft",
  "version": "0.1.0",
  "last_reviewed": "2026-07-23",
  "generated_by": "SOC Response Atlas by Basyrix",
  "tactics": [
    "Discovery"
  ],
  "platforms": [
    "Containers"
  ],
  "summary": "Adversaries may attempt to discover containers and other resources that are available within a containers environment. Other resources may include images, deployments, pods, nodes, and other information such as the status of a cluster. These resources can be viewed within web applications such as the Kubernetes dashboard or can be queried via the Docker and Kubernetes APIs...",
  "soc_recommendation": "Investigate Container and Resource Discovery activity in the context of Discovery: confirm scope, affected host/identity, and whether it matches expected administrative behaviour before deciding this is benign.",
  "d3fend_mappings": [
    {
      "id": "D3-NTA",
      "name": "Network Traffic Analysis",
      "relationship": "detect",
      "practical_action": "Monitor for Network Traffic Analysis indicators relevant to this technique.",
      "tooling": [
        "Sentinel",
        "Defender for Endpoint"
      ]
    }
  ],
  "investigation_steps": {
    "microsoft": [
      "Review Defender for Endpoint / Defender XDR alerts and timeline for the affected host or identity.",
      "Check Sentinel analytics rules and incidents correlated with this technique.",
      "Review Entra ID sign-in and audit logs if the technique involves an identity or cloud resource."
    ],
    "generic": [
      "Confirm whether the observed container and resource discovery activity matches expected administrative or application behaviour.",
      "Identify the host, account, or resource where the activity occurred and its business criticality.",
      "Check for related alerts before and after this activity to reconstruct the broader intrusion timeline.",
      "Real detection reference: \"GKE Anonymous Endpoint Permission Enumeration\" -- Detects bursts of GKE API requests from an anonymous identity that probe many distinct actions and resources with mostly failed outcomes. This pattern is consistent with unauthenticated permission enumeration against an exposed API server..."
    ]
  },
  "evidence_to_collect": [
    "Host or resource affected",
    "Account or identity involved",
    "Timestamp of the activity",
    "Related process, file, or network artifact",
    "Any preceding or follow-on alerts"
  ],
  "response_actions": [
    {
      "name": "Contain the affected host or account",
      "category": "Containment",
      "risk": "Medium",
      "automation_safe": false,
      "approval_required": true,
      "tool": "Defender for Endpoint / Entra ID",
      "notes": "Requires approval -- confirm malicious intent before isolating a host or disabling an account."
    },
    {
      "name": "Collect and preserve evidence",
      "category": "Investigation",
      "risk": "Low",
      "automation_safe": true,
      "approval_required": false,
      "tool": "Defender for Endpoint",
      "notes": "Safe -- read-only evidence collection."
    }
  ],
  "queries": {
    "kql": [
      {
        "name": "Starting point for T1613",
        "description": "Generic starting query -- tune to the specific data source relevant to this technique.",
        "query": "DeviceEvents\n| where TimeGenerated > ago(24h)\n| where ActionType has \"<tune to T1613>\""
      }
    ],
    "spl": [],
    "esql": [
      {
        "name": "bd7345e5-c822-41de-a393-7573fec07ef4 — GKE Anonymous Endpoint Permission Enumeration",
        "description": "(ESQL) Detects bursts of GKE API requests from an anonymous identity that probe many distinct actions and resources with mostly failed outcomes. This pattern is consistent with unauthenticated permission enumeration against an exposed API server... (Source: Elastic's official detection-rules repository (Elastic License v2).)",
        "query": "from logs-gcp.audit-* metadata _id, _index, _version\n| where data_stream.dataset == \"gcp.audit\"\n    and service.name == \"k8s.io\"\n    and (\n      client.user.email in (\"system:anonymous\", \"system:unauthenticated\")\n      or client.user.email is null\n    )\n    and not gcp.audit.resource_name in (\"readyz\", \"livez\", \"healthz\", \"version\")\n| stats\n    Esql.document_count = count(),\n    Esql.failure_count = sum(case(event.outcome == \"failure\", 1, 0)),\n    Esql.event_action_count_distinct = count_distinct(event.action),\n    Esql.resource_name_count_distinct = count_distinct(gcp.audit.resource_name),\n    Esql.event_action_values = values(event.action),\n    Esql.resource_name_values = values(gcp.audit.resource_name),\n    Esql.event_outcome_values = values(event.outcome),\n    Esql.client_user_email_values = values(client.user.email),\n    Esql.timestamp = VALUES(@timestamp),\n    Esql.data_stream_namespace = VALUES(data_stream.namespace),\n    Esql.user_agent_original_values = VALUES(user_agent.original)\n  by source.ip\n| where Esql.event_action_count_distinct > 5\n    and Esql.resource_name_count_distinct > 3\n    and Esql.document_count < 50\n    and Esql.failure_count >= 1\n| keep Esql.*, source.ip"
      },
      {
        "name": "94556bc7-e057-4759-9e49-fa79ee366101 — GKE API Request Failure Burst by User",
        "description": "(ESQL) Detects bursts of failed GKE API requests from a single user identity within a five-minute window. Repeated authorization failures across multiple actions can indicate credential stuffing, RBAC probing, or reconnaissance with stolen tokens. (Source: Elastic's official detection-rules repository (Elastic License v2).)",
        "query": "from logs-gcp.audit-* metadata _id, _index, _version\n| eval Esql.time_interval = date_trunc(5 minutes, @timestamp)\n| where data_stream.dataset == \"gcp.audit\"\n    and service.name == \"k8s.io\"\n    and event.outcome == \"failure\"\n    and event.type != \"allowed\"\n    and user.email is not null\n    and not to_string(user.email) rlike \"(system:serviceaccount:|system:gke-spiffe-controller|system:kube-scheduler|system:node:).*\"\n| stats\n    Esql.unique_actions = count_distinct(event.action),\n    Esql.failures_count = count(*),\n    Esql.actions = values(event.action),\n    Esql.resources = values(orchestrator.resource.name)\n  by user.email, source.ip, user_agent.original, data_stream.namespace, Esql.time_interval\n| where Esql.failures_count >= 10\n| keep Esql.*, user.email, source.ip, user_agent.original, data_stream.namespace"
      }
    ]
  },
  "automation": {
    "safe": [
      "Add recommendation as Sentinel incident comment.",
      "Run enrichment queries.",
      "Create ServiceNow SecOps task."
    ],
    "approval_required": [
      "Contain or disable the affected host/account.",
      "Any change to production configuration."
    ]
  },
  "escalation_criteria": [
    "Container and Resource Discovery activity observed on a privileged account or critical system.",
    "Activity follows or precedes other suspicious behaviour in the same investigation.",
    "Automated triage cannot confidently rule out malicious intent."
  ],
  "false_positive_considerations": [
    "Legitimate administrative or maintenance activity matching this pattern.",
    "Approved security testing or red team exercise.",
    "Known benign software producing similar telemetry."
  ],
  "confluence": {
    "title": "T1613 - Container and Resource Discovery Response Guidance",
    "labels": [
      "mitre",
      "attack",
      "d3fend",
      "secops",
      "basyrix"
    ],
    "sections": [
      "summary",
      "d3fend_mappings",
      "investigation_steps",
      "response_actions",
      "queries",
      "automation",
      "escalation_criteria",
      "false_positive_considerations"
    ]
  }
}