Kubernetesサービスのペンテスト

Reading time: 11 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

OSINTを使用した公開ポッドの発見

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

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

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

Exposing Services in Kubernetes

ポートスキャンによる公開ポッドの発見

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

ポートプロセス説明
443/TCPkube-apiserverKubernetes APIポート
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorコンテナメトリクス
6443/TCPkube-apiserverKubernetes APIポート
8443/TCPkube-apiserverMinikube APIポート
8080/TCPkube-apiserver安全でないAPIポート
10250/TCPkubeletフルモードアクセスを許可するHTTPS API
10255/TCPkubelet認証されていない読み取り専用HTTPポート:ポッド、実行中のポッド、ノードの状態
10256/TCPkube-proxyKube Proxyヘルスチェックサーバー
9099/TCPcalico-felixCalicoのヘルスチェックサーバー
6782-4/TCPweaveメトリクスとエンドポイント
30000-32767/TCPNodePortサービスへのプロキシ
44134/TCPTillerHelmサービスリスニング

Nmap

bash
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もあります。

bash
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

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

レスポンスが Unauthorized の場合、認証が必要です。

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

bash
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 (読み取り専用)

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

etcd API

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

Tiller

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

このサービスを悪用してKubernetes内で権限を昇格させることができます:

cAdvisor

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

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

NodePort

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

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

脆弱な誤設定

Kube-apiserverの匿名アクセス

kube-apiserver APIエンドポイントへの匿名アクセスは許可されていません。しかし、いくつかのエンドポイントを確認することができます:

ETCDの匿名アクセスの確認

ETCDはクラスターの秘密、設定ファイル、その他の機密データを保存します。デフォルトでは、ETCDは匿名でアクセスできませんが、確認することは常に良いことです。

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

bash
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は文書化されていませんが、ソースコードはここにあり、公開されているエンドポイントを見つけるのは実行するのと同じくらい簡単です:

bash
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

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

bash
kubeletctl pods

/exec

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

bash
kubeletctl exec [command]

note

この攻撃を避けるために、kubelet サービスは --anonymous-auth false で実行されるべきであり、サービスはネットワークレベルで分離されるべきです。

Kubelet (読み取り専用ポート) 情報漏洩の確認

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

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

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

参考文献

Kubernetes Pentest Methodology Part 2

https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする