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 エンドポイントのリストを取得できます:
このサービスを悪用して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)