Pentesting Kubernetes Services
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Kubernetesは、インターネットに公開されているか、1つのポッドを侵害した後に内部ネットワークにある可能性のあるいくつかの特定のネットワークサービスを使用します。
1つの方法は、crt.shでIdentity LIKE "k8s.%.com"
を検索してKubernetesに関連するサブドメインを見つけることです。別の方法は、GitHubで"k8s.%.com"
を検索し、文字列を含むYAMLファイルを探すことです。
Kubernetesがどのようにサービスを公開するかを理解することは、サービスを見つけるのに役立つかもしれません:
Exposing Services in KubernetesKubernetesクラスターで開いている可能性のあるポートは次のとおりです:
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サービスリスニング
これは管理者が通常**kubectl
ツールを使用して話すAPI Kubernetesサービス**です。
一般的なポート: 6443および443、ただしminikubeでは8443、非安全なものとして8080もあります。
このサービスと対話して機密データを取得し、機密アクションを実行する方法を学ぶには、以下のページを確認してください:
Kubernetes Enumerationこのサービスはクラスターのすべてのノードで実行されます。これはノード内のポッドを制御するサービスです。kube-apiserverと通信します。
このサービスが公開されているのを見つけた場合、認証されていないRCEを見つけた可能性があります。
もしレスポンスが Unauthorized
であれば、認証が必要です。
ノードをリストできる場合は、次のコマンドで kubelets エンドポイントのリストを取得できます:
You could abuse this service to escalate privileges inside Kubernetes:
メトリクスを収集するのに役立つサービス。
NodePortを介してすべてのノードでポートが公開されると、同じポートがすべてのノードで開かれ、トラフィックが宣言されたServiceにプロキシされます。デフォルトでは、このポートは範囲30000-32767にあります。したがって、新しい未チェックのサービスはこれらのポートを介してアクセス可能になる可能性があります。
匿名アクセスはkube-apiserver API エンドポイントには許可されていません。しかし、いくつかのエンドポイントを確認することができます:
ETCDはクラスターの秘密、設定ファイル、その他の機密データを保存します。デフォルトでは、ETCDは匿名でアクセスできませんが、確認することは常に良いことです。
ETCDに匿名でアクセスできる場合は、etcdctl ツールを使用する必要があるかもしれません。次のコマンドは、保存されているすべてのキーを取得します:
Kubeletのドキュメントによれば、デフォルトでは匿名アクセスが許可されています:
Kubeletサーバーへの匿名リクエストを有効にします。他の認証方法によって拒否されないリクエストは、匿名リクエストとして扱われます。匿名リクエストのユーザー名は
system:anonymous
で、グループ名はsystem:unauthenticated
です。
Kubelet APIの認証と認可がどのように機能するかをよりよく理解するために、このページを確認してください:
Kubelet Authentication & AuthorizationKubeletサービスのAPIは文書化されていませんが、ソースコードはここにあり、公開されているエンドポイントを見つけるのは簡単です:**
すべて興味深いです。
Kubeletctl ツールを使用して、Kubelet とそのエンドポイントと対話できます。
このエンドポイントはポッドとそのコンテナをリストします:
このエンドポイントは、任意のコンテナ内でコードを非常に簡単に実行することを可能にします:
この攻撃を避けるために、kubelet サービスは --anonymous-auth false
で実行され、サービスはネットワークレベルで分離されるべきです。
kubelet 読み取り専用ポートが公開されると、無許可の第三者がAPIから情報を取得できるようになります。このポートの公開は、さまざまなクラスター構成要素の開示につながる可能性があります。ポッド名、内部ファイルの場所、その他の構成を含む情報は重要ではないかもしれませんが、その公開は依然としてセキュリティリスクをもたらし、避けるべきです。
この脆弱性がどのように悪用されるかの例として、リモート攻撃者が特定のURLにアクセスすることが挙げられます。http://<external-IP>:10255/pods
に移動することで、攻撃者はkubeletから機密情報を取得する可能性があります:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)