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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Kubernetesは、インターネットに公開されているか、1つのポッドを侵害した後に内部ネットワークにある可能性のあるいくつかの特定のネットワークサービスを使用します。
OSINTを使用した公開ポッドの発見
1つの方法は、crt.shでIdentity 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
このサービスと対話して機密データを取得し、機密アクションを実行する方法を学ぶには、次のページを確認してください:
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
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
です。
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]
note
この攻撃を避けるために、kubelet サービスは --anonymous-auth false
で実行されるべきであり、サービスはネットワークレベルで分離されるべきです。
Kubelet (読み取り専用ポート) 情報漏洩の確認
kubelet 読み取り専用ポートが公開されると、無許可の第三者がAPIから情報を取得できるようになります。このポートの公開は、さまざまなクラスター構成要素の開示につながる可能性があります。ポッド名、内部ファイルの場所、その他の構成を含む情報は重要ではないかもしれませんが、その公開は依然としてセキュリティリスクをもたらし、避けるべきです。
この脆弱性がどのように悪用されるかの例として、リモート攻撃者が特定のURLにアクセスすることが挙げられます。http://<external-IP>:10255/pods
に移動することで、攻撃者はkubeletから機密情報を取得する可能性があります:
参考文献
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。