Techniques
Sample rules
Direct Interactive Kubernetes API Request by Unusual Utilities
- source: elastic
- technicques:
- T1059
- T1613
Description
This rule leverages a combination of Defend for Containers and Kubernetes audit logs to detect the execution of direct interactive Kubernetes API requests via unusual utilities. An adversary may need to execute direct interactive Kubernetes API requests to gain access to the Kubernetes API server or other resources within the cluster. These requests are often used to enumerate the Kubernetes API server or other resources within the cluster, and may indicate an attempt to move laterally within the cluster.
Detection logic
sequence with maxspan=1s
[process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and process.interactive == true and
container.id like "*" and
/* Covered by the rule "Direct Interactive Kubernetes API Request by Common Utilities" */
not (
process.name in ("wget", "curl", "openssl", "socat", "ncat", "kubectl") or
(
/* Account for tools that execute utilities as a subprocess, in this case the target utility name will appear as a process arg */
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
process.args in (
"wget", "/bin/wget", "/usr/bin/wget", "/usr/local/bin/wget",
"ssl_client", "/bin/ssl_client", "/usr/bin/ssl_client", "/usr/local/bin/ssl_client",
"curl", "/bin/curl", "/usr/bin/curl", "/usr/local/bin/curl",
"openssl", "/bin/openssl", "/usr/bin/openssl", "/usr/local/bin/openssl",
"socat", "/bin/socat", "/usr/bin/socat", "/usr/local/bin/socat",
"ncat", "/bin/ncat", "/usr/bin/ncat", "/usr/local/bin/ncat",
"kubectl", "/bin/kubectl", "/usr/bin/kubectl", "/usr/local/bin/kubectl"
) and
/* default exclusion list to not FP on default multi-process commands */
not process.args in (
"which", "/bin/which", "/usr/bin/which", "/usr/local/bin/which",
"man", "/bin/man", "/usr/bin/man", "/usr/local/bin/man",
"chmod", "/bin/chmod", "/usr/bin/chmod", "/usr/local/bin/chmod",
"chown", "/bin/chown", "/usr/bin/chown", "/usr/local/bin/chown"
)
) or
/* General exclusions for utilities that are not typically used for Kubernetes API requests */
process.name in ("sleep", "head", "tail")
)] by orchestrator.resource.name
[any where
event.dataset == "kubernetes.audit_logs" and
kubernetes.audit.stage in ("ResponseStarted","ResponseComplete") and
kubernetes.audit.verb in ("get", "list", "watch", "create", "patch", "update") and
(
kubernetes.audit.objectRef.resource in (
"pods", "secrets", "serviceaccounts", "configmaps",
"roles", "rolebindings", "clusterroles", "clusterrolebindings",
"deployments", "daemonsets", "statefulsets", "jobs", "cronjobs",
"nodes", "namespaces",
"selfsubjectaccessreviews", "selfsubjectrulesreviews", "subjectaccessreviews"
)
or (
kubernetes.audit.objectRef.resource == "pods" and
kubernetes.audit.objectRef.subresource in ("exec", "attach", "portforward", "log")
)
)
] by `kubernetes.audit.user.extra.authentication.kubernetes.io/pod-name`
Forbidden Direct Interactive Kubernetes API Request
- source: elastic
- technicques:
- T1059
- T1613
Description
This rule leverages a combination of Defend for Containers and Kubernetes audit logs to detect the execution of forbidden interactive Kubernetes API requests. An adversary may need to execute interactive Kubernetes API requests to gain access to the Kubernetes API server or other resources within the cluster. These requests are often used to enumerate the Kubernetes API server or other resources within the cluster, and may indicate an attempt to move laterally within the cluster. Attackers may attempt to access resources that are forbidden by the authorization policy. Note that this rule may not trigger if the authorization token of the request is expanded within the process argument list, as the length of the “process.args” field may lead to the field being ignored.
Detection logic
sequence with maxspan=1s
[process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and (
process.name in ("wget", "curl", "openssl", "socat", "ncat", "kubectl") or
(
/* Account for tools that execute utilities as a subprocess, in this case the target utility name will appear as a process arg */
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
process.args in (
"wget", "/bin/wget", "/usr/bin/wget", "/usr/local/bin/wget",
"ssl_client", "/bin/ssl_client", "/usr/bin/ssl_client", "/usr/local/bin/ssl_client",
"curl", "/bin/curl", "/usr/bin/curl", "/usr/local/bin/curl",
"openssl", "/bin/openssl", "/usr/bin/openssl", "/usr/local/bin/openssl",
"socat", "/bin/socat", "/usr/bin/socat", "/usr/local/bin/socat",
"ncat", "/bin/ncat", "/usr/bin/ncat", "/usr/local/bin/ncat",
"kubectl", "/bin/kubectl", "/usr/bin/kubectl", "/usr/local/bin/kubectl"
) and
/* default exclusion list to not FP on default multi-process commands */
not process.args in (
"which", "/bin/which", "/usr/bin/which", "/usr/local/bin/which",
"man", "/bin/man", "/usr/bin/man", "/usr/local/bin/man",
"chmod", "/bin/chmod", "/usr/bin/chmod", "/usr/local/bin/chmod",
"chown", "/bin/chown", "/usr/bin/chown", "/usr/local/bin/chown"
)
)
) and process.interactive == true and container.id like "*"
] by orchestrator.resource.name
[any where event.dataset == "kubernetes.audit_logs" and kubernetes.audit.stage in ("ResponseComplete", "ResponseStarted") and
`kubernetes.audit.annotations.authorization_k8s_io/decision` == "forbid"
] by `kubernetes.audit.user.extra.authentication.kubernetes.io/pod-name`
Direct Interactive Kubernetes API Request by Common Utilities
- source: elastic
- technicques:
- T1059
- T1613
Description
This rule leverages a combination of Defend for Containers and Kubernetes audit logs to detect the execution of direct interactive Kubernetes API requests. An adversary may need to execute direct interactive Kubernetes API requests to gain access to the Kubernetes API server or other resources within the cluster. These requests are often used to enumerate the Kubernetes API server or other resources within the cluster, and may indicate an attempt to move laterally within the cluster. Note that this rule may not trigger if the authorization token of the request is expanded within the process argument list, as the length of the “process.args” field may lead to the field being ignored.
Detection logic
sequence with maxspan=1s
[process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and (
process.name in ("wget", "curl", "openssl", "socat", "ncat", "kubectl") or
(
/* Account for tools that execute utilities as a subprocess, in this case the target utility name will appear as a process arg */
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
process.args in (
"wget", "/bin/wget", "/usr/bin/wget", "/usr/local/bin/wget",
"ssl_client", "/bin/ssl_client", "/usr/bin/ssl_client", "/usr/local/bin/ssl_client",
"curl", "/bin/curl", "/usr/bin/curl", "/usr/local/bin/curl",
"openssl", "/bin/openssl", "/usr/bin/openssl", "/usr/local/bin/openssl",
"socat", "/bin/socat", "/usr/bin/socat", "/usr/local/bin/socat",
"ncat", "/bin/ncat", "/usr/bin/ncat", "/usr/local/bin/ncat",
"kubectl", "/bin/kubectl", "/usr/bin/kubectl", "/usr/local/bin/kubectl"
) and
/* default exclusion list to not FP on default multi-process commands */
not process.args in (
"which", "/bin/which", "/usr/bin/which", "/usr/local/bin/which",
"man", "/bin/man", "/usr/bin/man", "/usr/local/bin/man",
"chmod", "/bin/chmod", "/usr/bin/chmod", "/usr/local/bin/chmod",
"chown", "/bin/chown", "/usr/bin/chown", "/usr/local/bin/chown"
)
)
) and process.interactive == true and container.id like "*"
] by orchestrator.resource.name
[any where event.dataset == "kubernetes.audit_logs" and kubernetes.audit.stage in ("ResponseComplete", "ResponseStarted")] by `kubernetes.audit.user.extra.authentication.kubernetes.io/pod-name`
Direct Interactive Kubernetes API Request Detected via Defend for Containers
- source: elastic
- technicques:
- T1059
- T1613
Description
This rule detects the execution of direct interactive Kubernetes API requests inside a container. An adversary may need to execute direct interactive Kubernetes API requests to gain access to the Kubernetes API server or other resources within the cluster. These requests are often used to enumerate the Kubernetes API server or other resources within the cluster, and may indicate an attempt to move laterally within the cluster. Note that this rule may not trigger if the token is expanded within the process argument list, as the length of the “process.args” field may lead to the field being ignored.
Detection logic
process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and (
(
process.name == "curl" and
process.args in ("-H", "--header") and
process.args like "*Authorization: Bearer *" and
(
/* CA-specified */
process.args in ("--cacert", "--capath") or
/* insecure */
process.args in ("-k", "--insecure")
)
) or
(
process.name == "wget" and
process.args like "--header*" and
process.args like "*Authorization: Bearer *" and
(
/* CA-specified */
process.args == "--ca-certificate" or
/* insecure */
process.args == "--no-check-certificate"
)
) or
(
/* Account for tools that execute utilities as a subprocess, in this case the target utility name will appear as a process arg */
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
process.args in ("wget", "/bin/wget", "/usr/bin/wget", "/usr/local/bin/wget") and
process.args like "--header*" and
process.args like "*Authorization: Bearer*" and
process.args == "--no-check-certificate"
) or
(
/* ssl_client is busybox-specific, so we need to handle it separately */
process.name == "busybox" and
process.args == "ssl_client" and
process.args like "*Authorization: Bearer*"
) or
(process.name == "openssl" and process.args == "s_client" and process.args == "-connect") or
(process.name == "socat" and process.args like~ "*ssl*") or
(process.name == "ncat" and process.args like "--ssl*") or
(process.name == "kubectl" and process.args in ("get", "list", "watch", "create", "patch", "update"))
) and
process.interactive == true and container.id like "*"