Pentesting Kubernetes Services

htARTE(HackTricks AWS Red Team Expert) を通じて、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

Kubernetesはいくつかの特定のネットワークサービスを使用しており、これらはインターネットに公開されているか、1つのポッドを侵害した後の内部ネットワークに存在する可能性があります。

OSINTを使用した公開ポッドの検出

1つの方法は、crt.shIdentity LIKE "k8s.%.com"を検索して、Kubernetesに関連するサブドメインを見つけることです。別の方法は、githubで"k8s.%.com"を検索し、その文字列を含むYAMLファイルを検索することです。

Kubernetesがサービスを公開する方法

Kubernetesがサービスを公開する方法を理解すると役立つかもしれません:

pageExposing Services in Kubernetes

ポートスキャンを使用した公開ポッドの検出

次のポートは、Kubernetesクラスターで開いている可能性があります:

ポートプロセス説明

443/TCP

kube-apiserver

Kubernetes APIポート

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

コンテナメトリクス

6443/TCP

kube-apiserver

Kubernetes APIポート

8443/TCP

kube-apiserver

Minikube APIポート

8080/TCP

kube-apiserver

セキュリティのないAPIポート

10250/TCP

kubelet

フルモードアクセスを許可するHTTPS API

10255/TCP

kubelet

認証なしの読み取り専用HTTPポート: ポッド、実行中のポッド、ノードの状態

10256/TCP

kube-proxy

Kube Proxyヘルスチェックサーバ

9099/TCP

calico-felix

Calicoのヘルスチェックサーバ

6782-4/TCP

weave

メトリクスとエンドポイント

30000-32767/TCP

NodePort

サービスへのプロキシ

44134/TCP

Tiller

Helmサービスリスニング

Nmap

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

これは、通常、管理者がツール**kubectlを使用してやり取りするAPI Kubernetesサービス**です。

一般的なポート: 6443と443、ただし、minikubeでは8443、セキュリティのない場合は8080も使用されます。

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

次のページをチェックして、このサービスと通信して機密データを取得し、機密なアクションを実行する方法を学んでください:

pageKubernetes Enumeration

Kubelet API

このサービスはクラスター内のすべてのノードで実行されます。これはノード内のポッドを制御するサービスです。kube-apiserverと通信します。

このサービスが公開されている場合、認証されていないRCEを見つけた可能性があります。

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

もしレスポンスが Unauthorized であれば、認証が必要です。

ノードをリストできる場合、kubelet エンドポイントのリストを取得できます:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet(読み取り専用)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

あなたはこのサービスを悪用して、Kubernetes内で特権を昇格させることができます:

cAdvisor

メトリクスを収集するための便利なサービス。

curl -k https://<IP Address>:4194

NodePort

NodePortを介してポートがすべてのノードで公開されると、同じポートがすべてのノードで開かれ、宣言されたServiceにトラフィックがプロキシされます。デフォルトでは、このポートは30000-32767の範囲にあります。したがって、新しい未チェックのサービスはこれらのポートを介してアクセス可能になる可能性があります。

sudo nmap -sS -p 30000-32767 <IP>

脆弱なミスコンフィギュレーション

Kube-apiserverの匿名アクセス

kube-apiserver APIエンドポイントへの匿名アクセスは許可されていません。ただし、いくつかのエンドポイントをチェックできます:

ETCDの匿名アクセスのチェック

ETCDにはクラスタのシークレット、構成ファイルなどの機密データが格納されています。デフォルトでは、ETCDには匿名でアクセスできませんが、常にチェックすることが良いでしょう。

ETCDに匿名でアクセスできる場合は、etcdctl ツールを使用する必要があります。次のコマンドを使用して、格納されているすべてのキーを取得します:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

Kubeletのドキュメントによると、デフォルトではサービスへの匿名アクセスが許可されています:

Kubeletサーバーへの匿名リクエストを有効にします。他の認証方法で拒否されないリクエストは匿名リクエストとして扱われます。匿名リクエストのユーザー名は system:anonymous で、グループ名は system:unauthenticated です。

Kuebelet APIの認証と認可の仕組みをよりよく理解するには、このページを参照してください:

pageKubelet Authentication & Authorization

KubeletサービスのAPIは文書化されていませんが、ソースコードはこちらで見つけることができ、公開されているエンドポイントを見つけるのは次のように実行するだけです:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

すべて興味深いです。

Kubeletctlツールを使用して、Kubeletとそのエンドポイントとやり取りすることができます。

/pods

このエンドポイントは、ポッドとそれに含まれるコンテナをリストします。

kubeletctl pods

/exec

このエンドポイントを使用すると、任意のコンテナ内でコードを簡単に実行できます:

kubeletctl exec [command]

この攻撃を回避するためには、kubelet サービスを --anonymous-auth false オプションで実行し、サービスをネットワークレベルで分離する必要があります。

Kubelet (読み取り専用ポート) 情報漏洩のチェック

kubelet read-only port が公開されると、認可されていない者によって API から情報を取得される可能性が生じます。このポートの公開により、クラスター構成要素 が漏洩する可能性があります。情報には ポッド名、内部ファイルの場所、その他の構成 などが含まれます。これらの情報は重要ではないかもしれませんが、その公開はセキュリティリスクを引き起こす可能性があり、避けるべきです。

この脆弱性が悪用される例として、リモート攻撃者が特定の URL にアクセスすることが挙げられます。http://<external-IP>:10255/pods に移動することで、攻撃者は kubelet から機密情報を取得する可能性があります:

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE (HackTricks AWS Red Team Expert)!

HackTricks をサポートする他の方法:

最終更新