Pentesting Kubernetes Services

AWSハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と実践:HackTricks Training GCP Red Team Expert (GRTE)

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

Insecure 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 であれば、認証が必要です。

ノードをリストできる場合は、次のコマンドで 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

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

Tiller

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

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ツールを使用して、Kubeletsとそれらのエンドポイントとやり取りすることができます。

/pods

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

kubeletctl pods

/exec

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

kubeletctl exec [command]

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

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

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

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

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

参考文献

AWS ハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCP ハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks のサポート

Last updated