Pentesting Kubernetes Services
Kubernetesはいくつかの特定のネットワークサービスを使用しており、これらはインターネットに公開されているか、1つのポッドを侵害した後の内部ネットワークに存在する可能性があります。
OSINTを使用した公開ポッドの検出
1つの方法は、crt.shでIdentity LIKE "k8s.%.com"
を検索して、Kubernetesに関連するサブドメインを見つけることです。別の方法は、githubで"k8s.%.com"
を検索し、その文字列を含むYAMLファイルを検索することです。
Kubernetesがサービスを公開する方法
Kubernetesがサービスを公開する方法を理解すると役立つかもしれません:
pageExposing 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
Kube-apiserver
これは、通常、管理者がツール**kubectl
を使用してやり取りするAPI Kubernetesサービス**です。
一般的なポート: 6443と443、ただし、minikubeでは8443、セキュリティのない場合は8080も使用されます。
次のページをチェックして、このサービスと通信して機密データを取得し、機密なアクションを実行する方法を学んでください:
pageKubernetes EnumerationKubelet API
このサービスはクラスター内のすべてのノードで実行されます。これはノード内のポッドを制御するサービスです。kube-apiserverと通信します。
このサービスが公開されている場合、認証されていないRCEを見つけた可能性があります。
Kubelet API
もしレスポンスが Unauthorized
であれば、認証が必要です。
ノードをリストできる場合、kubelet エンドポイントのリストを取得できます:
kubelet(読み取り専用)
etcd API
Tiller
あなたはこのサービスを悪用して、Kubernetes内で特権を昇格させることができます:
cAdvisor
メトリクスを収集するための便利なサービス。
NodePort
NodePortを介してポートがすべてのノードで公開されると、同じポートがすべてのノードで開かれ、宣言されたServiceにトラフィックがプロキシされます。デフォルトでは、このポートは30000-32767の範囲にあります。したがって、新しい未チェックのサービスはこれらのポートを介してアクセス可能になる可能性があります。
脆弱なミスコンフィギュレーション
Kube-apiserverの匿名アクセス
kube-apiserver APIエンドポイントへの匿名アクセスは許可されていません。ただし、いくつかのエンドポイントをチェックできます:
ETCDの匿名アクセスのチェック
ETCDにはクラスタのシークレット、構成ファイルなどの機密データが格納されています。デフォルトでは、ETCDには匿名でアクセスできませんが、常にチェックすることが良いでしょう。
ETCDに匿名でアクセスできる場合は、etcdctl ツールを使用する必要があります。次のコマンドを使用して、格納されているすべてのキーを取得します:
Kubelet RCE
Kubeletのドキュメントによると、デフォルトではサービスへの匿名アクセスが許可されています:
Kubeletサーバーへの匿名リクエストを有効にします。他の認証方法で拒否されないリクエストは匿名リクエストとして扱われます。匿名リクエストのユーザー名は
system:anonymous
で、グループ名はsystem:unauthenticated
です。
Kuebelet APIの認証と認可の仕組みをよりよく理解するには、このページを参照してください:
pageKubelet Authentication & AuthorizationKubeletサービスのAPIは文書化されていませんが、ソースコードはこちらで見つけることができ、公開されているエンドポイントを見つけるのは次のように実行するだけです:
すべて興味深いです。
Kubeletctlツールを使用して、Kubeletとそのエンドポイントとやり取りすることができます。
/pods
このエンドポイントは、ポッドとそれに含まれるコンテナをリストします。
/exec
このエンドポイントを使用すると、任意のコンテナ内でコードを簡単に実行できます:
この攻撃を回避するためには、kubelet サービスを --anonymous-auth false
オプションで実行し、サービスをネットワークレベルで分離する必要があります。
Kubelet (読み取り専用ポート) 情報漏洩のチェック
kubelet read-only port が公開されると、認可されていない者によって API から情報を取得される可能性が生じます。このポートの公開により、クラスター構成要素 が漏洩する可能性があります。情報には ポッド名、内部ファイルの場所、その他の構成 などが含まれます。これらの情報は重要ではないかもしれませんが、その公開はセキュリティリスクを引き起こす可能性があり、避けるべきです。
この脆弱性が悪用される例として、リモート攻撃者が特定の URL にアクセスすることが挙げられます。http://<external-IP>:10255/pods
に移動することで、攻撃者は kubelet から機密情報を取得する可能性があります:
参考文献
最終更新