Container Administration Command
This detection identifies adversaries abusing container administration services such as the Docker daemon, Kubernetes API server, or kubelet to execute commands within running containers. Attackers leverage tools like 'docker exec', 'kubectl exec', or direct kubelet API calls to achieve code execution in containerized environments, often for lateral movement, cryptomining deployment, or establishing persistence. This detection monitors process creation events on container host nodes for suspicious invocations of container management binaries with exec sub-commands, privileged flags, or interactive shell spawning, as well as anomalous kubelet API activity patterns associated with threat actors like TeamTNT and malware families including Kinsing, Hildegard, and Siloscape.
let ContainerExecPatterns = dynamic(["exec", "run", "attach"]);
let SuspiciousShells = dynamic(["sh", "bash", "ash", "zsh", "/bin/sh", "/bin/bash"]);
let PrivilegedFlags = dynamic(["--privileged", "--cap-add", "--security-opt label=disable", "--pid=host", "--net=host", "--ipc=host"]);
DeviceProcessEvents
| where TimeGenerated > ago(1d)
| where FileName in~ ("docker", "kubectl", "crictl", "ctr", "nerdctl", "podman")
or InitiatingProcessFileName in~ ("docker", "kubectl", "crictl", "ctr", "nerdctl", "podman")
| where ProcessCommandLine has_any (ContainerExecPatterns)
| extend IsInteractiveShell = ProcessCommandLine has "-it" or ProcessCommandLine has "--tty" or ProcessCommandLine has "-i "
| extend SpawnsShell = ProcessCommandLine has_any (SuspiciousShells)
| extend UsesPrivilegedFlag = ProcessCommandLine has_any (PrivilegedFlags)
| extend IsKubectlExec = FileName =~ "kubectl" and ProcessCommandLine has "exec"
| extend IsCurlKubelet = (FileName =~ "curl" or FileName =~ "wget") and
(ProcessCommandLine has ":10250" or ProcessCommandLine has "/exec" or ProcessCommandLine has "/run")
| extend RiskScore = toint(0)
+ iif(IsInteractiveShell, 30, 0)
+ iif(SpawnsShell, 25, 0)
+ iif(UsesPrivilegedFlag, 35, 0)
+ iif(IsKubectlExec, 20, 0)
+ iif(IsCurlKubelet, 40, 0)
+ iif(InitiatingProcessFileName in~ ("python", "python3", "ruby", "perl", "php", "node"), 30, 0)
| where RiskScore >= 25
| project
TimeGenerated,
DeviceName,
AccountName,
AccountDomain,
FileName,
ProcessCommandLine,
InitiatingProcessFileName,
InitiatingProcessCommandLine,
InitiatingProcessParentFileName,
IsInteractiveShell,
SpawnsShell,
UsesPrivilegedFlag,
IsKubectlExec,
IsCurlKubelet,
RiskScore
| sort by RiskScore desc, TimeGenerated desc Data Sources
Required Tables
False Positives
- Legitimate DevOps engineers running 'kubectl exec' or 'docker exec' for container debugging and troubleshooting during business hours
- CI/CD pipeline agents (Jenkins, GitLab Runner, GitHub Actions self-hosted) executing docker run or kubectl exec as part of automated build, test, or deployment workflows
- Container health check scripts or monitoring agents (Datadog, Dynatrace, Prometheus node exporter installers) that use crictl or docker exec to inspect running container state
References (8)
- https://attack.mitre.org/techniques/T1609/
- https://unit42.paloaltonetworks.com/hildegard-malware-teamtnt/
- https://aquasecurity.github.io/kube-hunter/
- https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#exec
- https://docs.docker.com/engine/reference/commandline/exec/
- https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/
- https://microsoft.com/security/blog/2023/07/25/threat-matrix-for-kubernetes/
- https://www.aquasec.com/blog/kinsing-malware-container-vulnerability/
Unlock Pro Content
Get the full detection package for T1609 including response playbook, investigation guide, and atomic red team tests.